web-dev-qa-db-ja.com

LinodeでNATなしでOpenVPNクライアントルーティングを実現するにはどうすればよいですか?

OpenVPNネットワークをセットアップしましたが、リモートクライアントから内部/ LANマシンにアクセスできるという意味で、正常に機能しています。ただし、私の問題は、リモートマシンからのすべてのトラフィックが、LANマシンからは、クライアントマシンからではなくOpenVPNサーバーマシンからのトラフィックであるかのように見えることです。

よりよく説明するために、私のネットワークトポロジを検討してください。

Network Topology

マシンRはマシンAのOpenVPNサーバーに接続し、IPアドレス10.200.200.5が割り当てられました。

次に、マシンRはマシンBで実行されているApacheにリクエストを送信します。リクエストは適切に到着し、応答を受け取ります。問題は、マシンBが10.200.200.5ではなく192.168.0.10(マシンAのIP)からのリクエストを受信することです。

後者をお願いします。

現在の設定

マシンA

これは、関連するiptablesルールのスニペットです。

*nat
:PREROUTING ACCEPT [18:1080]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]

-A POSTROUTING -o eth0 -j MASQUERADE

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]

// snip

# accept incoming VPN connections
-A INPUT -p udp -m udp --dport 1194 -j ACCEPT

# forward VPN traffic
-A FORWARD -s 10.200.200.0/25 -d 192.168.128.0/17 -i tun0 -j ACCEPT
-A FORWARD -i tun+ -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i eth0 -o tun+ -m state --state RELATED,ESTABLISHED -j ACCEPT

また、ip_forwardingを有効にしました。

echo 1 > /proc/sys/net/ipv4/ip_forward

..そして/etc/sysctl.confに適切な変更を加えて永続化しました。

OpenVPN構成では、次のようになっています。

server 10.200.200.0 255.255.255.128
Push "route 192.168.0.0 255.255.255.0"

マシンB

マシンAはマシンBのゲートウェイではないため、次のようにマシンBに手動でルートを追加しました。

ip route add 10.200.200.0/25 via 192.168.0.10 dev eth0

ルーティングされているIPをテストするために、小さなPHPというスクリプトshowip.phpを作成しました:

<?php echo "Your IP is: ", $_SERVER['REMOTE_ADDR'], "\n"; ?>

マシンR

# wget -q -O - http://192.168.0.11/showip.php
Your IP is: 192.168.0.10

10.200.200.5と表示するにはどうすればよいですか?

更新

明確にするために、私の特定のケースでは、マシンAには、LANとWANの両方にサービスを提供するNIC(eth0)が1つあります。

3
Oz Solomon

私自身の質問に答える:

さらに背景として、これらのマシンはLinodeでホストされています。トラフィックをLAN上の特定のノードにルーティングするために、スイッチの静的マップを使用していることがわかりました。 VPNソースIPはこれらの静的マップの一部ではないため、トラフィックはどこにもルーティングされませんでした。

したがって、これはLinode固有の問題であることが判明しましたが、うまくいけば、他の人がそれを知るのに役立ちます。

1
Oz Solomon

マシンAとマシンBの間の接続は、実際にはスイッチドイーサネットではなく、割り当てられたIPアドレスを使用してのみトラフィックを処理できることがわかったので、別のソリューションを見つける必要があります。

これは、トンネルを使用して実現できます。使用できるトンネルにはさまざまな種類があります。 1つはVPNを使用する方法です。これは、マシンAが既にVPNサーバーであるため、最も簡単な方法です。次に、マシンBをVPNクライアントにして、ルーティングテーブルエントリを追加して、そのVPN接続を介して必要なプレフィックスを転送するだけです。

別のオプションは、GREトンネルまたは単にIP over IPを使用することです。これらのトンネルと関連するルートは静的に構成できるため、VPNアプローチよりも利点があります。

1
kasperd

マシンAには、NATルールがあります。これにより、マシンBにパケットをルーティングする前にクライアントIPが変更されます。最初に行う必要があるのは、そのNATルール。パケットは変更なしでマシンBに転送されます。

マシンBのルーティングテーブルが不完全な場合、この変更により接続が機能しなくなる可能性があります。この場合、パケットはマシンBに正しく配信されますが、返信を配信するルートがありません。これにより、まったく応答しないか、VPNサーバーではなくインターネットに応答が送信されます。

マシンBでは、次のコマンドip route add 10.200.200.0/24 via 192.168.0.10を使用してルートを追加できます

0
kasperd