conntrack 없이 수신 패킷의 Linux iptables DNAT(상태 비저장)

conntrack 없이 수신 패킷의 Linux iptables DNAT(상태 비저장)

내 Linux 상자에는 10.20.1.1두 개의 UDP 앱이 각각 포트에 바인딩되어 46000 (App A)있습니다 36000(App B). 앱은 각각 10.10.1.1:36000 (Srv X)및 로 바인딩된 두 개의 UDP 서버와 통신합니다 10.10.1.2:36000 (Srv Y).

패킷을 보낼 때 항상 UDP src 포트를 36000으로 사용해야 한다는 요구 사항이 있습니다. 유선 패킷은 항상 36000 - 36000src 및 dst 포트입니다.

내 iptables 규칙은 다음과 같습니다. 내 의도는 DNAT포트의 Srv X에서 들어오는 패킷을 36000 to 46000App A가 수신하도록 하는 것입니다.

*nat
-A PREROUTING -s 10.10.1.1/32 -p udp --dport 36000 -j DNAT --to-destination :46000

*raw
-A PREROUTING -p udp --dport 36000 -j CT --notrack
-A PREROUTING -p udp -j ACCEPT
-A OUTPUT -p udp --dport 36000 -j CT --notrack
-A OUTPUT -p udp -j ACCEPT

*filter

-A INPUT -p udp -m udp --dport 36000 -j ACCEPT --> rule 1
-A INPUT -p udp -m udp --dport 46000 -j ACCEPT --> rule 2
-A OUTPUT -p udp -m udp --dport 36000 -j ACCEPT -> rule 3

패킷을 보내면 App A to Srv X괜찮습니다. /proc/net/ip_conntrackOUT 패킷과 일치하는 conntrack 항목이 없습니다 rule 3. 에서 응답이 오면 Srv X to App A패킷은 원시 테이블을 통과하지만 필터 테이블 규칙 1을 DOES NOT거쳐 DNAT직접 점프합니다. 이는 Srv X 응답이 내 상자로 왔지만 App A 대신 App B로 이동함을 의미합니다.

질문:

  1. RAW 테이블은 없음을 나타냅니다 CONNTRACK. 그러나 위의 동작은 App A -> Srv Xsrc 및 dst 포트가 있는 첫 번째 패킷이 36000 - 36000어딘가의 일부 모듈에 의해 추적되고 있음을 나타냅니다. 따라서 의 응답은 Srv X -> App ADNAT를 거치지 않는 것 같습니다. 이것을 어떻게 피합니까 CONNTRACK?

  2. dst 포트 36000이 있는 Srv X에서 들어오는 모든 패킷이 항상 DNAT를 거치도록 하는 방법은 무엇입니까?

미리 감사드립니다, 텔렉스

답변1

을 살펴보면넷필터 문서, 라고 한다"연결 추적은 NAT의 기본입니다"따라서 활성화하지 않으면 DNAT를 가질 수 없습니다.콘트랙.

관련 정보