![IPTables는 ESTABLISHED를 포함한 모든 UDP 패킷을 리디렉션합니다.](https://linux55.com/image/98814/IPTables%EB%8A%94%20ESTABLISHED%EB%A5%BC%20%ED%8F%AC%ED%95%A8%ED%95%9C%20%EB%AA%A8%EB%93%A0%20UDP%20%ED%8C%A8%ED%82%B7%EC%9D%84%20%EB%A6%AC%EB%94%94%EB%A0%89%EC%85%98%ED%95%A9%EB%8B%88%EB%8B%A4..png)
현재 IPtables에는 다음과 같은 몇 가지 규칙이 설정되어 있습니다.
-A PREROUTING -d dstip/32 -p udp -m udp --dport 27035 -m u32 --u32 "0x0>>0x16&0x3c@0x8=0xffffffff&&0x0>>0x16&0x3c@0xc=0x54536f75&&0x0>>0x16&0x3c@0x10=0x72636520&&0x0>>0x16&0x3c@0x14=0x456e6769&&0x0>>0x16&0x3c@0x18=0x6e652051&&0x0>>0x16&0x3c@0x1c=0x75657279" -j REDIRECT --to-ports 21010
그러면 해당 페이로드가 포함된 패킷이 완벽하게 작동하는 캐셔로 리디렉션됩니다. 그러나 "새" 패킷만 이 NAT 규칙에 적용됩니다. 주변을 둘러 본 후 다음을 설정하여 문제를 해결했습니다.
sudo sysctl -w net.netfilter.nf_conntrack_udp_timeout=0
sudo sysctl -w net.netfilter.nf_conntrack_udp_timeout_stream=0
이로 인해 또 다른 문제가 발생합니다. 모든 UDP 패킷이 이것으로 설정됩니다. 작은 UDP 플러드 중에 이로 인해 서버의 모든 UDP 트래픽이 중지됩니다.
특정 페이로드가 포함된 모든 UDP 패킷을 동일한 컴퓨터의 다른 포트로 리디렉션해야 합니다. 이 포트를 수신하고 이 페이로드로 응답하는 또 다른 프로그램이 있습니다. 이는 쿼리 플러딩으로 인해 일반적으로 애플리케이션 중 하나가 중단되기 때문에 이 쿼리를 다른 프로그램으로 오프로드합니다.
해결책이 있나요? 몇 달 동안 찾고 있었는데 답이 없었습니다.
답변1
이 문제를 해결하는 두 가지 완전히 다른 방법이 있습니다.
iptable 대연결 영역
Contrack 영역은 여러 conntrack 인스턴스(네트워크 네임스페이스당)를 허용합니다.
통과원본 영역 태그 추가패킷 및 흐름의 경우 (반만 생성된) 흐름을 일반 패킷과 일치 패킷의 두 부분으로 분할하는 두 개의 conntrack 인스턴스가 있을 수 있으며, 각 부분에는 자체 흐름이 있습니다. 따라서 일반적인 NAT 규칙은 계속 작동하며 한 번이 아닌 두 번 발생할 수 있습니다. 즉, 일반 패킷에 대해 한 번, 일치하는 패킷에 대해 한 번.
패킷이 한 번 테스트되면 테스트를 반복하는 대신 적절한 위치에 표시가 배치됩니다.
iptables -t raw -A PREROUTING -d dstip/32 -p udp -m udp --dport 27035 -m u32 --u32 "0x0>>0x16&0x3c@0x8=0xffffffff&&0x0>>0x16&0x3c@0xc=0x54536f75&&0x0>>0x16&0x3c@0x10=0x72636520&&0x0>>0x16&0x3c@0x14=0x456e6769&&0x0>>0x16&0x3c@0x18=0x6e652051&&0x0>>0x16&0x3c@0x1c=0x75657279" -j MARK --set-mark 1
iptables -t raw -A PREROUTING -m mark --mark 1 -j CT --zone-orig 1
iptables -t nat -A PREROUTING -p udp -m mark --mark 1 -j REDIRECT --to-ports 21010
conntrack 결과 예:
# conntrack -E -p udp --orig-port-dst 27035
[NEW] udp 17 30 src=10.0.3.1 dst=10.0.3.66 sport=52670 dport=27035 [UNREPLIED] src=10.0.3.66 dst=10.0.3.1 sport=27035 dport=52670
[NEW] udp 17 30 src=10.0.3.1 dst=10.0.3.66 sport=52670 dport=27035 zone-orig=1 [UNREPLIED] src=10.0.3.66 dst=10.0.3.1 sport=21010 dport=52670
[UPDATE] udp 17 30 src=10.0.3.1 dst=10.0.3.66 sport=52670 dport=27035 src=10.0.3.66 dst=10.0.3.1 sport=27035 dport=52670
[UPDATE] udp 17 30 src=10.0.3.1 dst=10.0.3.66 sport=52670 dport=27035 zone-orig=1 src=10.0.3.66 dst=10.0.3.1 sport=21010 dport=52670
nftables 및추적 안 함그리고데이터 패킷 헤더 필드 수정
커널 >= 4.10 필요
(물론 zone 메소드는 nftables를 사용하여 구현할 수 있습니다).
여기서 NAT는 무상태로 수행되며 리디렉션된 포트에서 들어오는 패킷과 나가는 모든 응답 패킷을 일치시키기 위해 conntrack이 비활성화됩니다.
nft add table ip raw
nft add chain ip raw prerouting '{type filter hook prerouting priority -300;}'
nft add chain ip raw output '{type filter hook output priority -300;}'
nft add rule ip raw prerouting ip daddr dstip/32 udp dport 27035 @th,64,32 == 0xffffffff @th,96,32 == 0x54536f75 @th,128,32 == 0x72636520 @th,160,32 == 0x456e6769 @th,192,32 == 0x6e652051 @th,224,32 == 0x75657279 notrack udp dport set 21010
nft add rule ip raw output udp sport 21010 notrack udp sport set 27035
( u32
동등한 원시 페이로드 필터는 단순화될 수 있으며 실제로 nftables에 의해 자동으로 단순화됩니다. u128
표시된 것처럼 nftables가 이를 내부적으로 처리하는 것처럼 보입니다 nft --debug=netlink list ruleset -a
.)