iptables 및 PREROUTING을 사용하여 UDP 패킷을 두 개의 다른 대상으로 설정

iptables 및 PREROUTING을 사용하여 UDP 패킷을 두 개의 다른 대상으로 설정

iptables를 사용하여 패킷을 통해 UDP를 두 개의 다른 외부/원격 IP로 보내려고 합니다.

현재 다음과 같은 명령을 실행하고 있습니다.

iptables -t nat -A PREROUTING -i eth0 -p udp --dport 3070 -j DNAT --to-destination 192.111.111.111:5640
iptables -t nat -A PREROUTING -i eth0 -p udp --dport 3070 -j DNAT --to-destination 167.111.111.111:5640

그러나 UDP 패킷은 iptables의 규칙을 살펴본 다음 이동하기 때문에 작동하지 않습니다 192.111.111.111:5640. 다른 규칙을 먼저 넣으면 UDP 패킷이 두 번째 대상으로 이동합니다. 실제 대상을 결합하기 위해 범위 기능을 사용해 보았지만 범위가 내부 IP가 아니기 때문에 패킷이 아무데도 가지 않습니다.

iptables -t nat -A PREROUTING -i eth0 -p udp --dport 3070 -j DNAT --to-destination 192.111.111.111-167.111.111.111:5640-5640

### note: I also tried
iptables -t nat -A PREROUTING -i eth0 -p udp --dport 3070 -j DNAT --to-destination 192.111.111.111-167.111.111.111:5640-5641

where the port is increased by one on the secondary server

두 명령이 개별적으로 작동하고 두 명령이 모두 동일한 규칙 계층에 있는 경우 하나의 명령만 작동함을 확인할 수 있습니다.

TEE또한 IP 중 하나를 다른 게이트웨이로 사용해 보았지만 그 역시 작동하지 않습니다. iptables에서 이를 수행할 수 있는 방법이 있습니까? 아니면 다중 대상 일반 UDP 전달자를 생성할 때 표시를 놓쳤습니까?

UDP 패킷은 동시에 배포되어 각 해당 서버에 복제되어야 합니다. 현재 사용 사례는 서버 A와 서버 B 모두의 프로세스에 UDP 패킷이 필요하지만 패킷 전송 소스에서는 하나의 서버만 가리킬 수 있다는 것입니다. 즉, udp 패킷을 보내는 서버 C-> 서버 D-> 서버 B와 서버 A로 패킷을 복사하여 보냅니다.

도움이나 조언을 보내주셔서 감사합니다.

답변1

간단한 사용자 영역 도구

먼저, UDP 패킷을 수신하고 A용과 B용으로 각각 하나씩 두 개의 복사본을 보내는 서버 D에서 실행되는 특수 도구를 사용하는 것이 좋습니다. 이는 다음을 통해 수행할 수 있습니다.Bash 프로세스 교체++소캇(느슨하게 적용된 예udp-multi-socat.sh편리한 역순으로 다음이 있습니다.즉시 실행), 어떤 경우에는 버퍼링이 발생하지 않을 수도 있는지 모르겠습니다(전용 애플리케이션을 만드는 것이 더 좋음).

socat -U - udp4-recv:3070 | tee >(socat -u - udp4-datagram:167.111.111.111:5640) | socat -u - udp4-datagram:192.111.111.111:5640

커널 사용(iptables ... -j TEE)

즉, "커널 도우미" 방법의 경우 iptables'가 있습니다.패킷의 대상을 복사할 수 있습니다. 복제는 일반 라우팅 처리를 우회해야 하므로 복제된 패킷은 직접 액세스할 수 있는 다른 호스트(--게이트웨이범위). 이것이 없으면 복제된 패킷을 처리할 수 있는 좋은 방법이 없는 것 같습니다..

공정하게 말하면 네트워크 네임스페이스를 사용하여 이 호스트를 생성할 수 있습니다. 그런 다음 중복 트래픽은 라우팅 스택과 iptables를 통해 호스트 D에 다시 주입됩니다. 이제 이 트래픽은 다른 인터페이스에서 오기 때문에 다르게 DNATed될 수 있습니다. 비대칭 라우팅 및 프로세스 중복으로 인해 일부 조정이 필요합니다(느슨함).rp_필터가상 인터페이스에서다양한 conntrack(시작) 영역트래픽을 차별화하기 위해연결하다IP만 알고 인터페이스는 알 수 없음)

다음은 서버 D에서 사용되는 구성입니다(일부 중복을 방지할 수 있지만 읽기가 어렵습니다).

ip netns del dup 2>/dev/null || : # to remove previous instance, if needed
ip netns add dup

ip link add name dup1 type veth peer netns dup name eth0
ip link set dup1 up
ip -n dup link set eth0 up
ip address add 10.10.10.1/24 dev dup1
ip -n dup address add 10.10.10.2/24 dev eth0
ip -n dup route add default via 10.10.10.1
sysctl -q -w net.ipv4.conf.dup1.rp_filter=2
ip netns exec dup sysctl -q -w net.ipv4.conf.eth0.forwarding=1
iptables -t mangle -A PREROUTING -i eth0 -p udp --dport 3070 -j TEE --gateway 10.10.10.2
iptables -t raw -A PREROUTING -i dup1 -p udp --dport 3070 -j CT --zone-orig 1
iptables -t nat -A PREROUTING -i eth0 -p udp --dport 3070 -j DNAT --to-destination 192.111.111.111:5640
iptables -t nat -A PREROUTING -i dup1 -p udp --dport 3070 -j DNAT --to-destination 167.111.111.111:5640

이 접근 방식을 사용하면 A와 B 모두의 응답도 C로 다시 보낼 수 있습니다(C는 둘 다 동일한 초기 대상에서 왔다고 생각할 것입니다). 따라서 A를 듣고 있는 것이 없다면또는비, 하나ICMP 대상 포트에 연결할 수 없습니다.중단하도록 선택할 수 있는 소스 C로 전송됩니다. 이를 방지하려면 어딘가에 추가 방화벽을 추가해야 할 것입니다.

관련 정보