Linux NAT는 원격 트래픽에 내부 IP 주소를 사용합니다.

Linux NAT는 원격 트래픽에 내부 IP 주소를 사용합니다.

어떤 이유로 내 NAT는 로컬 네트워크에서만 연결을 허용합니다. 로컬 네트워크에 ping을 실행하면 NAT 게이트웨이를 소스로 사용하여 패킷이 전송됩니다. 원격 네트워크(인터넷 호스트 등)에 ping을 실행하면 패킷 소스가 장치의 내부 IP 주소이고 응답이 올바르게 전송되지 않습니다. 무엇이 잘못 구성되었을 수 있는지에 대한 아이디어가 있습니까?

router ~ # iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -i eth2 -j ACCEPT
-A INPUT -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 3306 -j ACCEPT
router ~ # iptables -S -t nat
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
-A POSTROUTING -o eth0 -j MASQUERADE

내부 네트워크는 192.168.0.0/16이고 외부 네트워크(NAT 로컬)는 10.72.16.0/22입니다.

AB에 대한 정보가 업데이트되었습니다.

router ~ # ip -br link; ip -4 -br addr; ip route; ip rule
lo               UNKNOWN        00:00:00:00:00:00 <LOOPBACK,UP,LOWER_UP>
eth0             UP             00:15:5d:e8:47:39 <BROADCAST,MULTICAST,UP,LOWER_UP>
eth1             UP             00:15:5d:e8:47:3a <BROADCAST,MULTICAST,UP,LOWER_UP>
eth2             UP             00:15:5d:e8:47:46 <BROADCAST,MULTICAST,UP,LOWER_UP>
sit0@NONE        DOWN           0.0.0.0 <NOARP>
lo               UNKNOWN        127.0.0.1/8
eth0             UP             10.72.16.140/22
eth1             UP             10.72.21.14/22
eth2             UP             192.168.0.1/16
default via 10.72.20.1 dev eth1
default via 10.72.16.1 dev eth0
10.72.16.0/22 dev eth0 proto kernel scope link src 10.72.16.140
10.72.20.0/22 dev eth1 proto kernel scope link src 10.72.21.14
192.168.0.0/16 dev eth2 proto kernel scope link src 192.168.0.1
0:      from all lookup local
32766:  from all lookup main
32767:  from all lookup default

내부 호스트와 동일:

int_host ~ # ip -br link; ip -4 -br addr; ip route; ip rule
lo               UNKNOWN        00:00:00:00:00:00 <LOOPBACK,UP,LOWER_UP>
eth0             UP             52:69:6e:00:81:95       <BROADCAST,MULTICAST,UP,LOWER_UP>
usb0             DOWN           52:69:6e:00:00:00 <NO-  CARRIER,BROADCAST,MULTICAST,UP>
lo               UNKNOWN        127.0.0.1/8
eth0             UP             192.168.0.5/16
usb0             DOWN           192.168.127.5/24 169.254.0.1/16
default via 192.168.0.1 dev eth0
169.254.0.0/16 dev usb0 proto kernel scope link src 169.254.0.1 linkdown
192.168.0.0/16 dev eth0 proto kernel scope link src 192.168.0.5
192.168.127.0/24 dev usb0 proto kernel scope link src 192.168.127.5 linkdown
RTNETLINK answers: Address family not supported by protocol
Dump terminated

내부 호스트에서 외부(로컬) 호스트로 ping:

int_host ~ # ping 10.72.16.50
PING 10.72.16.50 (10.72.16.50) 56(84) bytes of data.
64 bytes from 10.72.16.50: icmp_seq=1 ttl=127 time=1.37 ms
^C

내부 호스트에서 외부 호스트로 ping을 수행합니다.

int_host ~ # ping 172.18.221.227
PING 172.18.221.227 (172.18.221.227) 56(84) bytes of data.
^C
--- 172.18.221.227 ping statistics ---
8 packets transmitted, 0 received, 100% packet loss, time 7243ms

Wireshark는 핑의 소스가 내부 호스트의 내부 IP 주소임을 보여줍니다.

4842    60.182197   192.168.0.5 172.18.221.227  ICMP    98  Echo (ping) request  id=0x567d, seq=7/1792, ttl=62 (reply in 4843)
4843    60.182365   172.18.221.227  192.168.0.5 ICMP    98  Echo (ping) reply    id=0x567d, seq=7/1792, ttl=128 (request in 4842)

예상한 대로 응답은 10.72.16.140의 라우터 대신 존재하지 않는 192.168.0.5 호스트로 전송되기 때문에 다시 전송되지 않습니다(이후 내부 192.168.0.5 주소로 전송됨).

답변1

경로는 순차적으로 적용됩니다. 따라서 기본 경로(및 주어진 예 ) 는 라우팅 테이블의 첫 번째 경로이므로 172.18.221.227통과됩니다 . 패킷 전달에는 eth1유일한 규칙이 적용됩니다 . OP가 언급했듯이 경로를 변경할 수 없습니다. 따라서 을 통과하는 패킷은 변경되지 않으며 원래 RFC1918 IP가 유지됩니다.MASQUERADEeth0POSTROUTINGeth1

따라서 규칙을 변경하여 문제를 해결할 수도 MASQUERADE있습니다 eth1.

INPUT정책이 (다시?) 로 설정된 경우 DROP복사 도 고려해야 합니다 state.ESTABLISHEDeth1

관련 정보