iptables DNAT+SNAT: 동일한 UDP 데이터그램의 불필요한 이중화(및 실패)

iptables DNAT+SNAT: 동일한 UDP 데이터그램의 불필요한 이중화(및 실패)

다음과 같은 매우 간단한 시나리오에서 내 오류를 파악하려고 합니다.

|peerA|(Aip:Aport) <--> (Bdev:Bip:Bport)|NatNode|(Cdev:Cip:Cport) <--> (Dip:Dport)| peerD

(피어 A는 데이터그램을 Bip:Bport로 보내고, NatNode는 이를 Cip:Cport가 보낸 데이터그램으로 변환하여 Dip:Dport로 보냅니다. 반대의 경우도 마찬가지입니다.)

빈 iptables와 "바닐라" 라우팅 테이블을 사용하여 내가 한 일은 다음과 같습니다.

iptables -p udp -t nat -A PREROUTING -s Aip -d Bip -i Bdev --destination-port Bport -j DNAT --to-destination Dip:Dport

iptables -p udp -t nat -A POSTROUTING -s Aip -d Dip -o Cdev --destination-port Dport -j DNAT --to-source Cip:Cport

(역방향 규칙 및 -t nat 및 -t filter 기본 대상당 하나의 LOG 대상 포함)

내가 기대하는 것은 다음과 같습니다: - 올바른 재작성(wireshark에 표시된 대로 OK) - 각 수신 패킷은 PREROUTING(라우팅 결정, 아마도 Cdev로) 통과에서 들어옵니다.한 번 앞으로(라우팅 결정, 가능하면 Cdev로), 그런 다음배선은 한 번, 그런 다음 네트워크에 들어갑니다.

내가 얻는 것은 (로깅 확인)입니다. 1. 첫 번째 패킷은 PREROUTING을 한 번 통과하고 필터링/1톤 앞으로 가세요번(예, 동일한 패킷 ID), 그런 다음후반 작업이 많이 필요함그런 다음 원격 피어가 이를 수신하는 네트워크로 한 번 전송됩니다. 2. 두 번째 데이터그램부터 시작하면 모든 일이 일어나는 것처럼 보이지만 변환된 데이터그램은발급되지 않음장치에서. 3. 충분히 오래(예를 들어 15초 이상) 기다렸다가 다시 시도하면 헤더 데이터그램의 새로운 시퀀스는 1처럼 동작하고 두 번째부터는 2처럼 동작합니다.

또한 -i 및 -o 옵션을 제거해 보았지만 아무 것도 변경되지 않은 것 같습니다.

내가 여기서 뭘 잘못하고 있는 걸까?

문제를 찾을 수 없습니다. "예상대로" 수행한 것 같습니다. 본능적으로 라우팅 결정 지점에 문제가 있다고 의심합니다. 어쩌면 2와 같은 패킷이 Linux의 일부 보호 동작에 의해 전송되지 않을 수도 있습니다. TCP/IP 스택용...

나는 그것이 내 잘못이라고 확신하지만 어디에 있는지 찾을 수 없습니다.

당신의 도움을 주셔서 감사합니다!

답변1

Dip에 대해 클래식 NAT를 수행하고 Dport에 대해 포트 전달을 구현하려면 특별한 POSTROUTING 규칙이 필요하지 않으며 일반 -j MASQUERADE만 추가하면 됩니다.

그리고..포스트라우팅의 DNAT? 오타를 냈나요?

나는 일반적으로 다음과 같이 클래식 NAT를 구현합니다(차단 방화벽이 설정되어 있고 conntrack이 모든 "응답" 패킷을 철회한다고 가정).

iptables -I POSTROUTING -o ppp0 -j MASQUERADE

iptables -I FORWARD -i eth0 -o ppp0 -j ACCEPT

iptables -I PREROUTING -i ppp0 -p tcp --dport 80 -j DNAT --to local_ip:80

여기서 eth0은 local_ip와 동일한 서브넷에 있는 로컬 iface이고 ppp0은 인터넷 iface입니다.

관련 정보