ローカルホスト(INPUTチェーン)に送信されたパケットにiptables SNATを適用する方法は?

ローカルホスト(INPUTチェーン)に送信されたパケットにiptables SNATを適用する方法は?

私はパブリックインターネットへの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 のデフォルトパスを使用することをお勧めします。

関連情報