
OpenVPN ネットワークをセットアップしましたが、リモート クライアントから内部/LAN マシンにアクセスできるという点で正常に動作しています。ただし、問題は、リモート マシンからのすべてのトラフィックが、クライアント マシンからではなく、OpenVPN サーバー マシンから送信されているかのように LAN マシンに表示されることです。
わかりやすく説明するために、ネットワーク トポロジを考えてみましょう。
マシン 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スクリプトを作成しました。表示ip.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 の両方に対応する 1 つの NIC (eth0) があります。
答え1
私自身の質問に答えます:
さらに背景を説明すると、これらのマシンは Linode でホストされています。スイッチで静的マップを使用して、トラフィックを LAN 上の特定のノードにルーティングしていることがわかりました。VPN ソース IP はこれらの静的マップの一部ではないため、トラフィックはどこにもルーティングされませんでした。
これは Linode 固有の問題であることが判明しましたが、他の人にも知ってもらうことで役立つことを願っています。
答え2
マシン A とマシン B 間の接続は実際にはスイッチド イーサネットではなく、割り当てられた IP アドレスを使用してのみトラフィックを処理できることがわかったので、別の解決策を見つける必要があります。
これは、トンネルを使用することで実現できます。使用できるトンネルにはさまざまな種類があります。1 つは VPN を使用することです。マシン A はすでに VPN サーバーであるため、これが最も簡単かもしれません。次に、マシン B を VPN クライアントにして、必要なプレフィックスをその VPN 接続経由で転送するためのルーティング テーブル エントリを追加するだけです。
もう 1 つのオプションは、GRE トンネルまたは IP over IP を使用することです。これらのトンネルと関連ルートは静的に構成できるため、VPN アプローチよりも有利になります。
答え3
マシン A には NAT ルールがあり、パケットをマシン B にルーティングする前にクライアント IP が変更されます。最初に行う必要があるのは、その NAT ルールを削除して、パケットが変更されずにマシン B に転送されるようにすることです。
マシン B のルーティング テーブルが不完全な場合、この変更によって接続が機能しなくなる可能性があります。この場合、パケットはマシン B に正しく配信されますが、応答を返すルートがありません。その結果、マシン B はまったく応答しなくなるか、VPN サーバーではなくインターネットに応答が送信されます。
マシンBでは、次のコマンドでルートを追加することができます。ip route add 10.200.200.0/24 via 192.168.0.10