
次のシナリオの IP パケット フローについて質問があります。
シナリオは次のとおりです:
- クライアント側にtun0(10.0.0.2/8)インターフェースと物理無線LANカードwlan0(IPアドレスは固定ではない)があり、wlan0はインターネットに接続できる。
- サーバー側(Ubuntu 12.04 amd64)には、別の tun0(10.0.0.1/8)インターフェースと物理イーサネット カード eth0(192.168.1.38/24)があり、eth0 は NAT ファイアウォールの背後にあるプライベート ネットワーク上にあり、ファイアウォール(ゲートウェイとしてのファイアウォール)を介してインターネットに接続できます。
echo 1 > /proc/sys/net/ipv4/ip_forward
サーバー側で「 」を実行しました。iptables -t nat -A POSTROUTING -s 10.0.0.0/8 -o eth0 -j MASQUERADE
サーバー側で「 」を実行しました。
シナリオの図は次のとおりです。
--------------- ----------------
| | | |
| client tun0 |----------| client wlan0 |
| 10.0.0.2 | | ip not fix |
| | | |
--------------- ----------------
|
|
internet
|
|
----------------
| |
| firewall |
| (gateway) |
| 192.168.1.1 |
| |
----------------
|
| private network
| 192.168.1.0/24
|
--------------- ----------------
| | | |
| server tun0 |----------| server eth0 |
| 10.0.0.2 | | 192.168.1.38 |
| | | |
--------------- ----------------
私は 2 つの非常にシンプルな VPN のようなクライアント/サーバー プログラムを使用して、2 つの tun0 インターフェイスの IP パケットを読み書きし、wlan0 と eth0 の間にトンネルを作成しました。これにより、10.0.0.2 からの IP パケットが 10.0.0.1 に到達でき、その逆も同様です (たとえば、10.0.0.1 から 10.0.0.2 に ftp を実行できます)。
ただし、クライアント tun0 (10.0.0.2) を使用して Web ページを参照する場合、http 要求は 10.0.0.2 から発信され、インターネット IP アドレス (10.0.0.1 ではないことは確か) を宛先とします。http 要求は、(私の考えでは) サーバー tun0 (10.0.0.1) に到達した後、サーバー eth0 に転送されます (ip_forward がオンであるため、この転送された http 要求の送信元 IP アドレスは 10.0.0.2 のままだと思います。間違っていたら訂正してください)。そこで NAT が実行され、http 要求が eth0 から送信されたものとして再パッケージ化されます (つまり、iptables コマンドを実行したため、送信元 IP アドレスが 192.168.1.38 に変更されます)。その後、再パッケージ化された http 要求はファイアウォール (およびインターネット) を通過して宛先に送られます。
http 応答 (Web サイトから) がサーバー eth0 に到達すると、そこでリバース NAT が行われるはずです。私の質問は次のとおりです:
- リバースNATはhttp応答の宛先IPアドレスを10.0.0.2に戻します。
- サーバー eth0 は、リバース NAT された http 応答をどこに転送するかをどのように知るのでしょうか?
- 応答の宛先 IP アドレスが逆 NAT されて 10.0.0.2 になるため、eth0 は http 応答をサーバー tun0 (10.0.0.1) に転送しますか?
- 逆 NAT された http 応答を適切にルーティング/転送するには、サーバー側にルートを追加する必要がありますか?必要な場合は、どのようにすればよいですか?
- 逆 NAT された http 応答を適切にルーティング/転送するには、サーバー側に iptables ルールを追加する必要がありますか? 必要な場合は、どのようにすればよいですか?
答え1
クライアントがすべてのトラフィックを tun0 経由で送信すると仮定すると、サーバー側で以下を追加する必要があります (/proc/sys/net/ipv4/ip_forward を有効にした後)。
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -A FORWARD -i tun0 -o eth0 -j ACCEPT
この手順の後、クライアントから Web ページを参照すると、パケット フローは次のようになります。
- クライアントはパケットを 10.0.0.1 に送信します。
- サーバー側では、tun0 で受信されたパケットは 10.0.0.2 から 192.168.1.38 に変換されます。
- NAT テーブルにマッピング エントリが作成されます。
- パケットは 192.168.1.1 (ゲートウェイ) 経由でインターネットに送信されます。
- 応答は 192.168.1.38 で受信されます。
- 手順 3 で作成されたマッピング エントリに従って、リバース NAT が実行されます。
- 応答パケットは 10.0.0.2 にルーティングされます。
何か大きなステップを見逃していないことを祈ります :)