nftables: 특정 대상 IP:포트에서 (두 번째) 대상 IP:포트로 UDP 패킷을 복제합니다.

nftables: 특정 대상 IP:포트에서 (두 번째) 대상 IP:포트로 UDP 패킷을 복제합니다.

단일 IP 및 UDP 포트로 향하는 매우 제한된 양의 패킷 트래픽을 동일한 IP이지만 두 번째 포트로 미러링하고 싶습니다. 나는 갇혀 있었다https://superuser.com/questions/1593995/iptables-nftables-forward-udp-data-to-multiple-targets그러나 nftable의 dup 문은 다른 IP로만 복사를 허용하고 동일한 IP 및 다른 포트로는 복사를 허용하지 않는 것 같습니다.

예를 들어 127.0.0.1 포트 123에 대한 트래픽은 127.0.0.1 포트 456에 복사되어야 합니다. 이것이 유일한 반복이므로 원래 포트 번호가 손실되는 문제는 없습니다. 이제 127.0.0.1이 "배수"/발신 인터페이스가 아니라 복제의 최종 대상이므로 이 복제가 가능한지 궁금합니다. 이것을 DNAT와 결합할 수 있는 방법이 있나요?

들어오는 UDP 트래픽을 사용하여 eBPF 프로브를 netdev에 연결하는 것 외에 사용 가능한 다른 메커니즘이 있습니까?

답변1

이는 다음을 통해 수행할 수 있습니다.nftables그리고웹 개발자가족과입구체인과반복하다성명. 무한 루프를 방지하려면 마커를 사용해야 합니다. 특정 사용 사례에 따라 복제를 다음과 같이 수행할 수도 있습니다.출구(이곳에 위치해 있기 때문에루프백인터페이스, 반복출구패킷은 다음과 같이 나타납니다.입구) 그러나 이를 지원하려면 커널 >= 5.17이 필요합니다.입구오랫동안 사용 가능했습니다.

커널 >= 4.10이 필요합니다(상태 비저장 UDP 변경에 대한 올바른 체크섬 지원을 위해).

# nft -f - <<'EOF'
table netdev t_dup        # for idempotency
delete table netdev t_dup # for idempotency

table netdev t_dup {
    chain c_ingress {
        type filter hook ingress device "lo" priority filter; policy accept;
        iif lo udp dport 123 meta mark != 1 meta mark set 1 dup to lo udp dport set 456
    }
}
EOF
  • 후보 패킷에 태그가 지정되어 있는지 확인하고 태그가 지정되지 않은 경우에만 처리합니다. 태그를 먼저 설정하면 나중에 루프가 방지됩니다.

  • 반복적입니다. 마크는 복제품의 일부입니다.sk_buff, 또한 반복됨

    중복 패킷은 실제로 변경되지 않은 패킷입니다. 동일한 위치( lo) 및 포트 123 으로 전송됩니다.

  • dup진술은 어떤 것과도 반대된다.iptables' 대상은 TEE대상을 포함하여 대상이 아닙니다.규칙성명을 종료합니다. 규칙은 패킷에 대한 상태 비저장 변경으로 계속됩니다. UDP 포트가 456으로 변경되었습니다.

  • 중복된 패킷도 도착함입구그러나 레이블이 지정되어 있으므로 규칙은 이를 무시합니다. 루프가 차단되었습니다.

다음 명령을 사용하여 중복 포트를 테스트할 수 있습니다.소캇:

socat -u udp4-recv:456,bind=127.0.0.1 -

노트:

  • 복사된 포트에 수신 대기 중인 포트가 없으면 ICMP 포트 연결 불가가 발생하지만 이 포트(456)가 전송 애플리케이션이 보내는 포트(123)와 일치하지 않으므로 네트워크 스택은 이를 무시합니다.

  • 웹 필터입구AF_PACKET 이후에 발생합니다.TCP 덤프변경된 포트나 중복된 패킷은 캡처되지 않습니다.

답변2

netflow/IPFix 패킷에 대해 이 작업을 수행해야 합니다. 귀하의 솔루션을 시도했지만 나에게는 효과가 없었습니다.

하지만 당신에게서 영감을 받아또 다른 대답, 마침내 작동하는 것을 얻었습니다. 커널 5.10을 사용하여 Debian 11에서 실행되도록 테스트되었습니다.

table ip mangle
delete table ip mangle

table ip mangle {
    chain prerouting {
        type filter hook prerouting priority mangle; policy accept;
        iifname "eth0" udp dport 6660 \
      dup to 127.0.0.1 device lo udp dport set 6666 notrack \
      dup to 127.0.0.1 device lo udp dport set 6667 notrack \
      dup to 127.0.0.1 device lo udp dport set 6668 notrack
    }

    chain input {
        type filter hook input priority mangle; policy accept;
        iifname lo udp dport 6666 ip daddr set 127.0.0.1 notrack
        iifname lo udp dport 6667 ip daddr set 127.0.0.1 notrack
        iifname lo udp dport 6668 ip daddr set 127.0.0.1 notrack
    }
}

그러면 eth0의 UDP/6660에 도착하는 모든 항목이 localhost UDP 포트 6666, 6667 및 6668에 복사되고 대상이 127.0.0.1로 설정됩니다. 일부 소프트웨어는 이를 좋아하지 않기 때문에 후자가 필요합니다.

나는 이것을 테스트했다패스트넷몬,덤프 파일/nfsen 및AS 통계.

관련 정보