.png)
내 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 - 36000
src 및 dst 포트입니다.
내 iptables 규칙은 다음과 같습니다. 내 의도는 DNAT
포트의 Srv X에서 들어오는 패킷을 36000 to 46000
App 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_conntrack
OUT 패킷과 일치하는 conntrack 항목이 없습니다 rule 3
. 에서 응답이 오면 Srv X to App A
패킷은 원시 테이블을 통과하지만 필터 테이블 규칙 1을 DOES NOT
거쳐 DNAT
직접 점프합니다. 이는 Srv X 응답이 내 상자로 왔지만 App A 대신 App B로 이동함을 의미합니다.
질문:
RAW 테이블은 없음을 나타냅니다
CONNTRACK
. 그러나 위의 동작은App A -> Srv X
src 및 dst 포트가 있는 첫 번째 패킷이36000 - 36000
어딘가의 일부 모듈에 의해 추적되고 있음을 나타냅니다. 따라서 의 응답은Srv X -> App A
DNAT를 거치지 않는 것 같습니다. 이것을 어떻게 피합니까CONNTRACK
?dst 포트 36000이 있는 Srv X에서 들어오는 모든 패킷이 항상 DNAT를 거치도록 하는 방법은 무엇입니까?
미리 감사드립니다, 텔렉스
답변1
을 살펴보면넷필터 문서, 라고 한다"연결 추적은 NAT의 기본입니다"따라서 활성화하지 않으면 DNAT를 가질 수 없습니다.콘트랙.