Stateless NAT에서 포트 번호를 기반으로 NAT를 수행하는 방법은 무엇입니까?

Stateless NAT에서 포트 번호를 기반으로 NAT를 수행하는 방법은 무엇입니까?

한 IP:포트 쌍에서 수신된 RTP 패킷을 다른 IP:포트 쌍으로 전달하고 싶습니다. 저는 iptables로 이 작업을 수행했습니다. iptables는 conntrack 모듈을 사용합니다. 하지만 내 응용 프로그램에는 conntrack이 필요하지 않습니다. 그래서 저는 Stateless NAT를 사용하여 이 작업을 수행하고 싶습니다. "ip Route add nat" 명령을 사용하여 상태 비저장 NAT 규칙을 실행할 수 있다는 것을 알았습니다.

ip route add nat 205.254.211.17 via 192.168.100.17

이 명령은 205.254.211.17로 전송된 모든 패킷에 대해 네트워크 주소 변환을 수행하도록 커널에 지시합니다. via 매개변수는 NAT 코드에 205.254.211.17에 바인딩된 패킷을 새 대상 주소 192.168.100.17로 다시 쓰도록 지시합니다.

내가 이해한 바로는 문제는 이것이 205.254.211.17로 향하는 모든 패킷을 192.168.100.17로 전달한다는 것입니다. 205.254.211.17 특정 포트에서 수신된 RTP 패킷을 다른 IP:포트로 전달하는 옵션이 있습니까?

답변1

통과패킷 헤더 필드 수정그리고nftablesip route add nat레이어 4(TCP, UDP, ...)가 아닌 레이어 3(IP)으로 제한되는 간단한 라우터 기능으로 사용하지 않는 것도 가능합니다 .

경고: nftables >= 0.6(notrack을 사용하는 경우 >= 0.7) 및 커널 >= 4.10이 필요합니다. 여기서는 nftables 0.8.3 및 커널 4.15.x를 사용하여 테스트되었습니다.

nftables는 여러 대상을 결합할 수 있기 때문에 매우 간단합니다(여기에는 3개의 대상이 있습니다).

# nft add table raw
# nft 'add chain raw prerouting {type filter hook prerouting priority -300;}'
# nft add rule raw prerouting ip daddr 205.254.211.17 udp dport 5004 notrack ip daddr set 192.168.100.17 udp dport set 5006

셸 해석을 피하기 위해 2번째 줄을 인용했습니다. 테스트하는 경우 모든 nft를 삭제하는 가장 빠른 방법은nft flush ruleset.

따라서 소리내어 읽기만 하면 규칙은 목적지가 205.254.211.17인 IP 패킷(포트 5004가 목적지인 UDP)만 선택하도록 지시합니다.추적 불가능으로 표시(로드된 경우 conntrack을 통해) 대상 IP를 192.168.100.17로 설정하고 대상 포트를 5006으로 설정합니다.

두 테이블 모두에서 동시에 테이블을 사용하지 않는 한(글쎄, 어쨌든 테이블을 사용하고 싶지는 않지만) nftables문제 없이 규칙을 혼합할 수 있습니다. 명확하게 표현할 수 있는iptablesnat체인 우선순위rawnftables 후크가 해당 iptables 후크 이전 또는 이후에 실행되는지 여부를 선택할 수도 있습니다. 예를 들어, 필요한 경우 여기에서 -301 또는 -299를 선택하여 iptables 테이블 이전 또는 이후에 실행되도록 할 수 있습니다.

답변2

Linux는 상태 비저장 NAT를 지원하지 않는 것으로 나타나 특정 포트나 포트 그룹별로 동작을 제한할 수 있습니다.

~에서iproute2 문서:

Stateless NAT(Dumb NAT라고도 함)는 NAT의 가장 간단한 형태입니다. 여기에는 라우팅 장치를 통과하는 주소를 다시 쓰는 작업이 포함됩니다. 인바운드 패킷은 대상 주소 다시 쓰기를 거치고 아웃바운드 패킷은 소스 주소 다시 쓰기를 겪습니다.

이러한 유형의 NAT는 IP 주소로 제한되는 것으로 보입니다. 현재 상황을 봐주류 커널 구현이 여기에 있습니다, 이 작업을 담당하는 기능은 포트 번호를 허용하지 않고 IP 주소와 넷마스크만 허용하는 것 같습니다.

답변3

패킷을 편집하려면 tcpedit munge를 사용해야 합니다. 들어오는 포트를 일치시키고 패킷 대상을 LAN 주소로 다시 쓴 다음 나가는 패킷을 반전시킵니다. https://www.man7.org/linux/man-pages/man8/tc-pedit.8.html

tc의 좋은 점은 매우 빠르다는 것입니다. 단점은 학습 곡선입니다.

관련 정보