저는 공용 인터넷에 대한 두 개의 경로가 있는 호스트를 설정하고 있습니다. 하나는 일반 홈 게이트웨이 라우터를 통하고, 다른 하나는 반사설 네트워크(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의 기본 경로를 사용하면 좋습니다.