conntrack 모듈에서 연결이 설정되면 netfilter가 소스 포트를 변경하는 것을 관찰했습니다. 이런 행동을 방지해야 합니다.
내 문제를 재현하기 위해 수행한 작업은 다음과 같습니다.
- 포트 2002에서 2003까지 DNAT를 수행하는 netfilter 규칙을 만듭니다.
sudo iptables -w -t nat -A OUTPUT -s 192.168.30.3 -d 192.168.30.1 -p udp --sport 2001 --dport 2002 -j DNAT --to-destination :2003
- 그런 다음 192.168.30.1:2001(내 컴퓨터)에서 192.168.30.1:2003까지의 연결을 시뮬레이션하기 위해 conntrack 항목을 생성합니다.
sudo /sbin/conntrack -I -s 192.168.30.1 -d 192.168.30.3 -p udp --sport 2003 --dport 2001 --timeout 100000
- 결국 소스 포트 2001을 사용하여 내 컴퓨터에서 192.168.30.1:2002에 대한 연결을 수행합니다.
sudo nc -u -p 2001 192.168.30.1 2002
netfilter DNAT 규칙으로 인해 대상 포트가 2003이고 소스 포트가 2001인 출력 패킷이 예상되었습니다. 그러나 Wireshark에서는 소스 포트가 임의의 숫자로 변경되는 것을 관찰했습니다. 이는 내 컴퓨터가 포트 2001에 기존 연결이 있다고 간주하고(conntrack 항목으로 인해) 소스 포트가 2001이 되는 것을 방지하기 때문인 것 같습니다(맞죠?). 하지만 나는 이런 행동을 원하지 않습니까? 포트 번호 2001을 강제로 사용하려면 어떻게 해야 합니까?
답변1
DNAT가 작동하려면(즉, 프로그램이 응답을 인식할 수 있도록) 응답 트래픽의 소스 포트를 에서 에서 으로 변경하는 "역방향 NAT"가 192.168.30.1
수행 되어야 192.168.30.3:2001
합니다 .2003
2002
그러나 conntrack의 관점에서 해당 트래픽이 DNAT의 결과가 아닌 경우(생성된 conntrack 항목에 따라 호스트가 연결을 시작한 호스트가 아니기 때문에) 역방향 NAT는 부적절 192.168.30.1:2003
합니다 .192.168.30.3:2001
192.168.30.1:2003
따라서 netfilter는 DNAT 규칙과 일치하는 트래픽에 대해 SNAT도 수행하도록 "강제"되어 대상별로 응답 트래픽(즉, 에서 온)을 구별할 수 있습니다 192.168.30.3:$random
.
나는 netfilter가 SNAT(DNAT)에 대한 역방향 NAT 이전에 DNAT(SNAT)에 대한 역방향 NAT를 수행하거나 SNAT(예: 192.168.30.3:$random
)에 대한 역방향 NAT 이전의 대상을 역방향 NAT에 대한 일치로 사용하도록 관리한다고 가정합니다. DNAT, 그렇지 않으면 강제 SNAT는 의미가 없습니다. (그러나 반전이 아닌 경우에는 둘 중 어느 것도 사실이 아닙니다. AFAIK: DNAT는 INPUT의 SNAT 이전에 PREROUTING에서 수행되며 SNAT 규칙의 대상 일치는 있는 경우 DNAT의 결과 값을 사용합니다)
문제는 위의 이야기/귀하의 질문에 있는 "문제"가 실제로는 거의 의미가 없다는 것입니다. 2개 호스트 Wireguard VPN을 예로 들어 보겠습니다. Endpoint=
두 호스트 모두에 설정을 설정하여(둘 중 하나가 통신을 시작할 수 있도록) 강제 SNAT로 인해 값이 예기치 않게 "업데이트"되는 것을 원하지 않는다고 가정합니다(다음과 같이 가정). 실제로 트리거될 수 있음), 해야 할 일은 단순히 DNAT를 "보완"하는 "항상 켜져 있는" SNAT입니다. 이는 예비 NAT와 동일합니다.
iptables -t nat -A INPUT -s 192.168.30.1 -d 192.168.30.3 -p udp --sport 2003 --dport 2001 -j SNAT --to-source :2002
이는 DNAT에 대한 자동 역방향 NAT 때문에 클라이언트-서버 모델에서는 일반적으로 필요하지 않습니다.
192.168.30.1:2003
PS 그래도 도달 해서는 안 됩니다 . 그렇지 않으면 전자의 conntrack 항목이 삭제되기 전에 192.168.30.1:2003
다시 도달하면 강제 소스 NAT도 발생합니다 . 192.168.30.1:2002
INPUT의 추가 SNAT 규칙으로 인해 추가 문제가 발생해서는 안 됩니다.
답변2
일반적으로 충돌하는 두 개의 흐름을 설정할 수 있습니다.콘트랙조회 테이블(따라서 일반적으로 충돌을 피하기 위해 새 흐름에서 소스 포트 다시 쓰기를 트리거함)이 다른 위치에 있어야 합니다.conntrack 구역. 이 추가 영역 속성은콘트랙다른 conntrack 영역의 기존 흐름과 일치/충돌하지 않습니다. 소스 포트 다시 쓰기가 발생하지 않습니다.
특정 예의 경우 충돌을 방지하여 소스 포트 재작성을 방지하는 특정 규칙은 다음과 같습니다.
iptables -t raw -A OUTPUT -s 192.168.30.3 -d 192.168.30.1 -p udp --sport 2001 --dport 2002 -j CT --zone-orig 1
일반적으로 사용 사례에 따라 더 합리적인 선택기가 사용됩니다. 이는 라우팅 시 수신 인터페이스를 선택기로 사용하여 PREROUTING 체인에서 자주 사용되며 종종 표시 값과 연결되므로 라우팅도 영향을 받을 수 있습니다.
이 옵션을 표시한 원래 사용 사례는 다음과 같습니다.콘트랙복잡한 라우팅 설정이 있는 동일한 네트워크 스택(추가 네트워크 네임스페이스 없음)(예: 동일한 IP 주소를 사용하는 4개의 서로 다른 사설 LAN 간 라우팅, 예: 192.168.1.0/24 eth0 <-> eth1 10.1.0.0/24 및다시192.168.1.0/24 eth2 <-> 10.1.0.0/24 eth3)은 동일한 주소/포트를 가진 두 개의 관련 없는 흐름을 볼 수 있습니다. 처럼넷필터그리고콘트랙라우팅에 대해 아무것도 모릅니다(콘트랙조회 테이블에는 주소만 포함됨) 라우팅 토폴로지에 수동으로 연결된 영역 속성을 추가하여 이러한 흐름을 별도로 고려하도록 교육해야 합니다.콘트랙조회 테이블.
(여기에는LWN 링크해당 기능이 원래 제안되었을 때.)
답변3
NAT는 포트 충돌의 위험을 줄이기 위해 소스 포트를 변경합니다. 해당 스포츠 2002가 NAT 시스템에서 이미 사용 중인 경우 어떻게 해야 합니까?
특정 포트에 대한 특정 요구 사항이 있는 경우 SNAT
이에 대한 특정 규칙을 추가할 수 있지만, 여러 내부 클라이언트가 동일한 소스 포트를 사용하려고 하면 어떻게 될까요?
여기서 우리는 NAT가 공용 IP 주소 부족 문제를 줄이기 위해 만들어진 해킹이라는 점을 인정해야 합니다. 여기서 실제 해결 방법은 모든 사람이 NAT가 아닌 공용 IP를 갖도록 하는 것입니다.
요즘 NAT에 관해 이야기할 때 하나의 IP 뒤의 개인 IP 주소를 의미하는 경우가 가장 많습니다.낮잠
ㅏ그와 관련된 비슷한 질문, 나는 MASQUERADE
목표에 대해 생각하고 있었지만 그렇지 않았습니다.DNAT