web-dev-qa-db-ja.com

VPNを介して特定のトラフィックのみをルーティングする

VPNサーバーを実行している中央開発サーバーと、それに接続する必要のあるクライアントがいくつかあります。サーバーはApacheを実行していますが、ローカルリクエストのみを受け入れています(127.0.0.1:80でのみリッスンしています)。

基本的に、VPNに接続されている各クライアントに、VPNを介して特定のホスト名とローカルのApacheインスタンスにトラフィックをルーティングするように強制する必要があります。

例えば:

Client requests google.com -> google.com
Client requests server -> vpn -> server:80

クライアントがVPNに接続するときに、ルートコマンドをクライアントにプッシュできることはわかっています。これを実現するには、プッシュするルートを特定する必要があります。少なくとも、クライアントがこのルートを自分で追加するためのroute構文/コマンドは何ですか?

3
n0pe

まず第一に、ローカルマシン以外の場所では127.xyzにトラフィックをルーティングすることはできません(それは可能かもしれませんが、プロセスで何か他のものを壊してしまうでしょう...)ので、私はd VPN IP(10.8.0.1など)でもリッスンするようにApache構成を更新することをお勧めします。それが選択肢ではない場合は、私の答えの最後にある選択肢の1つを試すことができます。

OpenVPNクライアントは、サーバーへのルートをすでに取得しているはずです。私の例では、次のようになります。

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.8.0.1        10.8.0.53       255.255.255.255 UGH   0      0        0 tun0
10.8.0.53       0.0.0.0         255.255.255.255 UH    0      0        0 tun0

追加のルートをクライアントにプッシュする場合は、次を使用します。

Push "route 192.168.10.0 255.255.255.0"

(それに応じてIP /ネットマスクを変更します)。

Apacheインスタンスにホスト名で(http://10.8.0.1/だけでなく)アクセスできるようにする場合は、これをすべてのクライアントの/etc/hostsファイルに配置します。

10.8.0.1    servername.domain.example

または、DNSサーバーをセットアップし(dnsmasq <-dhcpサーバーを無効にしていることを確認してください)、クライアントにプッシュします(ovpn-conf内)。

Push "dhcp-option DNS 10.8.0.1"

それでうまくいくはずです。

その他のオプション

ApacheがリッスンしているIPを変更できない場合は、次のアプローチが思い浮かびます(ただし、最後の手段としてのみ使用してください)。

  • SSHポート転送:OpenVPN(または他のVPNサーバー)を使用する代わりに、SSHを使用してサーバーに接続します。

    ssh -L1234:localhost:80 user@servername
    

    そうすれば、サーバー上のApacheインスタンス(127.0.0.1:80でのみリッスン)がクライアントのhttp://localhost:1234/で利用可能になります。すべてのクライアントでこれを行う必要があるため、多くのクライアントがある場合はおそらく適切ではありません。
    ただし、それでも、シェルアクセスなしで専用のsshユーザーを設定し、~/.ssh/authorized_keysで各クライアントの公開鍵を設定することができます。クライアントはこれをインターネットへのプロキシとして使用したり、望まないその他のことを実行したりできる可能性があることに注意してください。したがって、sshdを正しく構成することが重要です。

  • いくつかのiptablesマジック(NATトラフィック)
  • その他のユーザースペースポートフォワーディングまたはリバースプロキシ
3
mreithub