IPTables - 대상이 수신하지 않는 경우에만 DNAT

IPTables - 대상이 수신하지 않는 경우에만 DNAT

인터페이스 eth0(인터넷 액세스) 및 tap_vpn0(VPN 탭 인터페이스, 네트워크 192.168.110.0/24)이 있습니다. 내가 원하는 것은 eth0을 통해 192.168.110.2로 들어오는 모든 연결을 DNAT하는 것입니다. 단, 서버 자체에 청취 서비스가 없는 경우에만 해당합니다(주로 VPN 서버 자체이지만 기본적으로 netstat -pluntSSH를 포함하여 에 표시되는 다른 서비스). ).

지금 내가 하고 있는 일은 iptables -t nat -I PREROUTING 1 -i eth0 -p tcp --dport 22 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p tcp --dport 443 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p tcp --dport 5555 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p tcp --dport 992 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p tcp --dport 1194 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p udp --dport 4500 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p udp --dport 500 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p udp --dport 1194 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p udp --dport 1701 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p udp --dport 54700 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p udp --dport 63486 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p udp --dport 68 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p gre -j ACCEPT iptables -t nat -A PREROUTING -i eth0 -j DNAT --to-destination 192.168.110.2

정적 예외의 긴 목록을 작성합니다. 그러나 실제 호스트에서 포트가 닫히지 않은 경우, 패킷이 로컬에서 성공적으로 처리될 경우 IPTables에 DNAT를 수행하지 않도록 지시하는 방법이 있습니까? 따라서 예를 들어 나중에 서버에서 임의의 포트 9988을 열면 다음과 같은 다른 예외를 추가할 필요가 없지만 iptables -t nat -I PREROUTING 1 -i eth0 -p tcp --dport 9988 -j ACCEPTDNAT가 적용되지는 않을까요?

답변1

iptables -t nat -I PREROUTING 1 -i eth0 -m socket --nowildcard -j ACCEPT트릭을 수행하는 것 같습니다 . -m socket설명에 따르면 정확히 그렇게 합니다. 이 패킷에 대해 허용하는 소켓이 있으면 일치합니다. 트릭은 내가 이전에 생략한 옵션을 사용하는 것이었습니다 --nowildcard. 매뉴얼 페이지에도 "소켓 일치는 기본적으로 제로 바인딩 리스너를 허용하지 않습니다. 왜냐하면 로컬 서비스가 그렇지 않으면 전달될 트래픽을 가로챌 수 있기 때문입니다."라고 나와 있습니다. - 실제로 제가 필요로 했던 것이 바로 이것이었습니다. - 사용 가능한 것이 있으면 지역 서비스가 가로채는 것입니다!

결과 규칙은 다음과 같습니다. iptables -t nat -I PREROUTING 1 -i eth0 -m socket --nowildcard -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p tcp --dport 22 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p gre -j ACCEPT iptables -t nat -A PREROUTING -i eth0 -j DNAT --to-destination 192.168.110.2

예상대로 작동하지 않을 경우를 대비해 포트 22(ssh)를 그대로 두었지만 테스트 결과 완벽하게 작동하는 것 같습니다!

관련 정보