이 질문은 수없이 많이 제기되었습니다. 몇 주 전에 나는 이 작업을 수행할 수 있었습니다.이것ServerFault가 게시하고이것디지털 오션 블로그 게시물. 나는 간단한 것을 놓치고 있어야합니다.
내 목표는 NAT를 수행하는 두 인터페이스 간에 패킷을 전달하는 것입니다. 특히 공용 인터페이스와 외부 USB NIC 간에 패킷을 전달하고 싶습니다.
포트 전달을 허용하도록 커널이 구성되었는지 확인했습니다.
$ sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1
그리고 인터페이스별 전달 구성은 다음과 같습니다.
net.ipv4.conf.enp0s20u4u3.forwarding = 1
net.ipv4.conf.eno1.forwarding = 1
내가 만든 규칙은 iptables
다음과 같습니다.
iptables -t nat -A PREROUTING -i eno1 --protocol tcp --destination-port 10000 -j DNAT --to-destination 192.168.10.2:1234
iptables -A FORWARD -i eno1 -o enp0s20u4u3 --protocol tcp --destination-port 1234 -j ACCEPT
iptables -t nat -A POSTROUTING -o enp0s20u4u3 --protocol tcp --source 192.168.10.2 --source-port 1234 -j SNAT --to-source 192.168.10.1
그런 다음 포트 10000을 통해 TCP 연결을 설정하여 이 구성을 테스트했습니다(외부 IP가 192.168.2.50인 경우).
$ nc -v 192.168.2.50 10000
nc: connect to 192.168.2.50 port 10000 (tcp) failed: Connection refused
내 규칙 항목이 올바르지 않은 경우 이 동작이 의미가 있습니다. 그래서 규칙 통계를 버렸습니다.
$ iptables -t nat -L -v
Chain PREROUTING (policy ACCEPT 15 packets, 2885 bytes)
pkts bytes target prot opt in out source destination
0 0 DNAT tcp -- eno1 any anywhere anywhere tcp dpt:ndmp to:192.168.10.2:1234
Chain INPUT (policy ACCEPT 15 packets, 2885 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 SNAT tcp -- any enp0s20u4u3 192.168.10.2 anywhere tcp spt:search-agent to:192.168.10.1
따라서 인바운드 TCP 패킷은 첫 번째 체인 규칙과 일치하지 않습니다 PREROUTING
. 오류가 어디에 있는지 잘 모르겠습니다. 첫 번째 규칙은 매우 간단합니다. 아이디어는 다음과 같습니다.
192.168.2.50:10000에 대한 인바운드 트래픽은 개인 인터페이스에서 192.168.10.2:1234에 대한 NAT입니다.