私はパブリックインターネットへの2つのパスを持つホストを設定しています。 1つは通常のホームゲートウェイルーターを経由し、もう1つはリフレクションネットワーク(AMPRNet 44.0.0.0/8)のゲートウェイルーターを介します。ほとんどは簡単ですが、トリッキーな部分が1つあります。
ほとんどの場合、44.xx1 IP は 44.0.0.0/8 の他のホストとの通信に使用されます。これにより、発信パケットをこの目的のために設定されたトンネルインターフェイス(tunl0)に簡単にルーティングできます。
パブリックネットワークのホストは次のことができます。返品私の半プライベートIP(44.xx1)は、BGPから44.0.0.0 / 8を通知するUCSD(169.228.66.251)のゲートウェイルーターを介して接続されています。しかし、私のノードのこれらのパケットへの応答は最終的にeth0から元のホストに戻ります。
私がしなければならないのは、iptablesを使用してtunl0の44.0.0.0/8以外のホストから44.0.0.0/8スペースの仮想IPに着信するパケットをSNATし、ステートフル接続トレースを使用して戻ったときにDNATすることです。しかし、これはうまくいかないようです。
走った後
iptables -t nat -A INPUT -s 44.0.0.0/32 -d 44.x.x.1 -j ACCEPT
iptables -t nat -A INPUT -s 0.0.0.0 -d 44.x.x.1 -j SNAT --to 44.0.0.2
リモートホストで44.xx1をpingすると、tunl0インターフェイスのtcpdumpに実際の外部IPからのパケットが表示されます。いいえ44.0.0.2から始めます。 eth0 を tcpdump すると、対応する外部 IP に応答パケットが戻ってくることを確認できます。
この仕様は機能しますか?それでは、私は何を見逃していますか?
ルーティングの代わりにiptablesを使用して特定のポートの2番目のルーターからルーターにパケットを送信する方法関連があるようです。
編集:さらにネットワークの詳細を追加しました。
pi@raspberrypi ~ $ ifconfig
eth0 Link encap:Ethernet HWaddr b8:27:eb:3b:93:ba
inet addr:192.168.3.192 Bcast:192.168.3.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:14477 errors:0 dropped:0 overruns:0 frame:0
TX packets:6131 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:4475095 (4.2 MiB) TX bytes:1651639 (1.5 MiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
tunl0 Link encap:IPIP Tunnel HWaddr
inet addr:44.x.x.1 Mask:255.255.255.255
UP RUNNING NOARP MULTICAST MTU:1480 Metric:1
RX packets:424 errors:0 dropped:0 overruns:0 frame:0
TX packets:17 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:176191 (172.0 KiB) TX bytes:836 (836.0 B)
pi@raspberrypi ~ $ sudo ip route
default via 192.168.3.1 dev eth0
192.168.3.0/24 dev eth0 proto kernel scope link src 192.168.3.192
pi@raspberrypi ~ $ sudo ip rule
0: from all lookup local
44: from all to 44.0.0.0/8 lookup 44
45: from 44.x.x.0/28 lookup 44
32766: from all lookup main
32767: from all lookup default
pi@raspberrypi ~ $ sudo ip route show table 44 | head
44.0.0.1 via 169.228.66.251 dev tunl0 onlink window 840
44.2.2.0/24 via 157.130.198.190 dev tunl0 onlink window 840
44.2.10.0/29 via 71.130.72.52 dev tunl0 onlink window 840
44.2.14.0/29 via 50.79.156.221 dev tunl0 onlink window 840
44.2.50.0/29 via 68.189.35.197 dev tunl0 onlink window 840
44.4.2.152/29 via 173.167.109.217 dev tunl0 onlink window 840
44.4.10.40 via 69.12.138.16 dev tunl0 onlink window 840
44.4.22.198 via 67.161.9.80 dev tunl0 onlink window 840
44.4.22.200 via 50.136.207.176 dev tunl0 onlink window 840
44.4.28.50 via 50.79.209.150 dev tunl0 onlink window 840
...
答え1
答えは簡単に見えます。
ip route add default dev tunl0 via 169.228.66.251 onlink table 44
パケットは特定のインターフェイスに入るので、応答は同じインターフェイスに戻ります。 tunl0 は表 44 を経由してルーティングされるため、表 44 のデフォルトパスを使用することをお勧めします。