로컬 호스트(INPUT 체인)로 전송된 패킷에 iptables SNAT를 적용하는 방법은 무엇입니까?

로컬 호스트(INPUT 체인)로 전송된 패킷에 iptables SNAT를 적용하는 방법은 무엇입니까?

저는 공용 인터넷에 대한 두 개의 경로가 있는 호스트를 설정하고 있습니다. 하나는 일반 홈 게이트웨이 라우터를 통하고, 다른 하나는 반사설 네트워크(AMPRNet 44.0.0.0/8)의 게이트웨이 라우터를 통합니다. 대부분은 간단하지만 까다로운 부분이 하나 있습니다.

대부분의 경우 44.xx1 IP는 44.0.0.0/8의 다른 호스트와의 통신에 사용됩니다. 이를 통해 나가는 패킷을 이 목적으로 구성된 터널 인터페이스(tunl0)로 쉽게 라우팅할 수 있습니다.

공용 네트워크의 호스트는 다음을 수행할 수 있습니다.반품내 반 개인 IP(44.xx1)는 BGP에서 44.0.0.0/8을 알리는 UCSD(169.228.66.251)의 게이트웨이 라우터를 통해 연결됩니다. 그러나 내 노드의 이러한 패킷에 대한 응답은 결국 eth0에서 원래 호스트로 돌아오는데, 이는 내 게이트웨이 라우터로 가는 도중에 NAT되기 때문에 작동하지 않습니다.

내가 해야 할 일은 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를 사용하여 특정 포트의 두 번째 라우터에서 라우터로 패킷을 보내는 방법관련이 있는 것 같습니다.

편집: 더 많은 네트워크 세부정보를 추가했습니다.

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의 기본 경로를 사용하면 좋습니다.

관련 정보