iptables / nftables : UDP 데이터를 여러 대상으로 전달

케빈 마이어

다음 시나리오에 대한 iptables 규칙을 만들어야합니다.

  • 다른 호스트는 UDP 데이터를 호스트로 보냅니다 A. 대상 포트는 1234입니다.
  • 호스트 A(8.2.3.4)는 수신 된 UDP 데이터를 호스트 B1(7.2.3.1), B2(22.93.12.3), ... Bn(12.42.1.3)로 리디렉션합니다. IP 주소는 그림에 불과합니다.
  • 이로드 밸런싱에 대해 아니다 모든 호스트하므로, B1, B2, ... Bn받아야 하는 모든 패키지를. 따라서 호스트 A패키지 복제 해야합니다.
  • 전달 된 패키지는 올바른 대상 IP (이 있어야합니다 B1, B2... Bn)과 소스 IP (호스트 A)
  • 호스트로 데이터를 보내는 초기 호스트에서 아무것도 변경할 수 없습니다. A
  • 내가 대상 호스트에 아무것도 변경할 수 없습니다 B1, B2...Bn
  • 호스트 B1,, B2... Bn이 (가) 응답 할 필요가 없습니다.

나는 이것을 PREROUTING/ 로 해결하려고 노력했다 mangle.

HOST_A=8.2.3.4
HOST_B1=7.2.3.1
HOST_B2=22.93.12.3
...
HOST_BN=12.42.1.3

iptables -F -t mangle
iptables -t mangle -A PREROUTING -d $HOST_A -p udp --dport 1234 -j TEE --gateway $HOST_B1
iptables -t mangle -A PREROUTING -d $HOST_A -p udp --dport 1234 -j TEE --gateway $HOST_B2
...
iptables -t mangle -A PREROUTING -d $HOST_A -p udp --dport 1234 -j TEE --gateway $HOST_BN

iptables -L -t mangle

호스트 B1,, B2... Bn이 (가) 데이터를 수신하지 않는 것 같습니다. 누구든지 무엇이 잘못되었는지 알고 있습니까? 디버깅은 실제로 매우 까다 롭습니다 (실제로 할 방법이 없음을 찾았습니다).

감사

AB

샘플링 기

모든 기준과 일치하는 도구가 있습니다. samplicator :

UDP 샘플링

이 작은 프로그램은 지정된 포트에서 UDP 데이터 그램을 수신하고 해당 데이터 그램을 지정된 수신기 세트로 다시 보냅니다. 또한, 샘플링 제수 N은 각 수신기에 대해 개별적으로 지정 될 수 있으며, 그러면 N 개의 수신 된 패킷 중 하나만 수신합니다.

대상 B1 B2 및 Bn에 대한 OP의 예와 일치하는 호스트 A에서 실행할 명령의 예 :

samplicate -p 1234 7.2.3.1/1234 22.93.12.3/1234 12.42.1.3/1234

그것은 아마도 더 합리적인 일일 것입니다.


nftables

비합리적인 접근 방식의 경우 어려움이 있는 iptables (이 UL SE Q / A 에서 내 대답에 두 개의 중복 만있는 예 ) 또는 conntrack 과 관련된 복잡성을 피하면서 stateless NAT를 수행 할 수있는 nftables 를 사용 하여 커널 내에서 수행 할 수 있습니다. 영역 .

nftablesiptablesTEE에 해당하는 dup을 사용 합니다.

DUP 진술

dup 문은 패킷을 복제하고 복사본을 다른 대상으로 보내는 데 사용됩니다.

dup to device
dup to address device device

참고 : 첫 번째 구문은 ip제품군 에서 사용할 수 없지만 netdev여러 문제를 추가 하는 제품군 에서만 사용할 수 있습니다. 그중 하나는 변경이 필요한 올바른 MAC 주소 (이더넷 인터페이스의 경우)를 추측해야합니다. 실용성이 떨어집니다.

dupTEE 와 동일한 동작을 합니다. 중복은 즉시 인터페이스의 게이트웨이로 "비워 져야"합니다 (게이트웨이는 인터페이스 유형과 관련이있는 경우 대상 MAC 주소를 ARP를 사용하여 확인하는 데만 사용되는 IPv4 주소를 의미 함). 그러나 IP 패킷 자체에는 없음) 아마도 나머지 라우팅 스택에 의해 비정상적으로 처리되는 것을 피할 수 있습니다. 최종 목적지는 게이트웨이 주소가 될 수 없습니다 (동일한 LAN에 있지 않는 한).

여기서는 이미 statelessly SNATed (A의 자체 주소로) / DNATed (최종 목적지로) 패킷을 호스트 자체에 다시 주입하기 위해 특별한 라우팅 설정이 수행되어 마치 실제로 있었던 것처럼 목적지로 추가 라우팅합니다. 스스로 방출합니다. 이를 위해서는 자신의 로컬 IP 주소 수신수락 하고 수신 veth 인터페이스 에서 모든 역방향 경로 필터비활성화 해야합니다 (따라서 all 설정 에서도이 작업을 수행해야 함 ). 필요한 경우 eth0에서 명시 적으로 다시 활성화 할 수 있습니다 .

초기 실행 네트워크 구성 (단일 인터페이스 eth0 사용 ) 외에 호스트 A에서 설정 :

HOST_A=8.2.3.4

ip link add name vethinj up type veth peer name vethgw
ip link set vethgw up
sysctl -w net.ipv4.conf.vethgw.forwarding=1
sysctl -w net.ipv4.conf.vethgw.accept_local=1
sysctl -w net.ipv4.conf.vethgw.rp_filter=0
sysctl -w net.ipv4.conf.all.rp_filter=0
ip route add $HOST_A/32 dev vethinj

할당 할 추가 IP 주소가 없습니다. 약한 호스트 모델을 사용하는 Linux , eth0 의 IP 주소 vethgw에서 사용할 수 있으므로 경로가 추가되면 vethinj를 통해 게이트웨이로 연결할 수 있습니다.

아래에서 로드 할 파일 nftables 규칙은 다음 multiply.nftnft -f multiply.nft같습니다.

  • 곱할 패킷 일치
  • A의 자신의 주소 상태 비 저장 SNAT ( ip saddr set)를 수행합니다 . 이것은 conntrack 의 NAT를 포함하지 않습니다 .
  • 각 대상 Bx에 대해 대상 ip daddr setHOST_Bx에 대해 상태 비 저장 DNAT ( )를 수행하고 A의 자체 주소를 게이트웨이로 사용하여 패킷을 veth의 주입 측에 복제합니다 .
  • 더 이상 사용하지 않기 때문에 나머지 변경된 원본을 삭제합니다.

multiply.nft:

define HOST_A=8.2.3.4
define HOST_B1=7.2.3.1
define HOST_B2=22.93.12.3
define HOST_Bn=12.42.1.3

table ip multiply
delete table ip multiply

table ip multiply {
        chain c {
                type filter hook prerouting priority -300; policy accept;
                iif != vethgw ip daddr $HOST_A udp dport 1234 ip saddr set $HOST_A goto cmultiply
        }

        chain cmultiply {
                jump cdnatdup
                drop
        }

        chain cdnatdup {
                ip daddr set $HOST_B1 dup to $HOST_A device vethinj
                ip daddr set $HOST_B2 dup to $HOST_A device vethinj

                ip daddr set $HOST_Bn dup to $HOST_A device vethinj
        }
}

그 후에 새로운 대상 192.0.2.2를 추가하려면 수동으로 수행 할 수 있습니다.

nft add rule ip multiply cdnatdup ip daddr set 192.0.2.2 dup to 8.2.3.4 device vethinj

아래는 S2에서 들어와 B1 B2 및 Bn으로 복제 된 단일 패킷에 대한 텍스트 회로도입니다.

S1 →┄┄┄┄┄╮                        ╭┄┄┄┄┄┄┄┄→ B1
S2 →┄┄┄╮ ┊                        ┊ ╭┄┄┄┄┄┄→ B2
...    ┊ ┊                        ┊ ┊       ...
Sn →┄╮ ┊ ┊                        ┊ ┊ ╭┄┄┄┄→ Bn
     ┊ ┊ ╰┄┄  ┄      ┌──────┐↗┄┄┄┄╯ ┊ ┊
     ┊ ╰┄┄┄┄┄┄┄┄┄┄┄┄→│ eth0 │→┄┄┄┄┄┄╯ ┊
     ╰┄┄┄┄┄┄ ┄       └──────┘↘┄┄┄┄┄┄┄┄╯
                    ↙      ↖↖↖
             snat  ↯        ↑↑↑  internal
  nftables:  dnat  ⇊    A   ↑↑↑  routing
            & dup ↓↓↓       ↑↑↑
               ┌───────┐  ┌───────┐
               │vethinj│  │vethgw │
               └───────┘  └───────┘
                    ╰─── ⇶ ───╯ 
                   virtual wire

참고 :이 NAT는 conntrack에 의해 처리되지 않았기 때문에 B1 B2 ... Bn이 원래 소스에 응답 할 가능성은 없지만 OP에 의해 포기되었습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

여러 매개 변수 / 인수를 대상으로 전달

분류에서Dev

인터페이스별로 소스 IP를 다시 쓰는 nftables / iptables 규칙

분류에서Dev

iptables를 사용하여 동적으로 소스 IP 주소를 기반으로 가상 인터페이스로 트래픽 전달

분류에서Dev

iptables를 사용하여 서버로 트래픽 전달

분류에서Dev

양식 데이터를 여러 sqlite3 행으로 전달하는 방법

분류에서Dev

TIdTCPServer에서 TIdTCPClient로 여러 줄 TStrings 데이터를 전달하는 방법

분류에서Dev

uitableviewcell swift에서 여러 prepareforsegue로 데이터를 전달하는 방법

분류에서Dev

k8s : iptables를 사용하여 공용 VIP에서 clusterIP로 전달

분류에서Dev

$ .ajax에서 webmethod로 여러 데이터 매개 변수 전달

분류에서Dev

iptables를 사용하여 한 컴퓨터에서 다른 컴퓨터로 네트워크 트래픽 전달

분류에서Dev

iptables를 사용하여 한 컴퓨터에서 다른 컴퓨터로 네트워크 트래픽 전달

분류에서Dev

iOS-상위보기에서 컨테이너보기의보기로 데이터를 여러 번 전달

분류에서Dev

하나의 컨테이너를 사용하는 여러 조각으로 데이터 전달

분류에서Dev

AJAX 데이터를 통해 여러 데이터 값 전달

분류에서Dev

Iptables로 TCP 연결 전달

분류에서Dev

프래그먼트에서 활동으로 여러 데이터를 전달하는 방법

분류에서Dev

쉬운 방법으로 여러 데이터 변수를 AJAX 함수에 전달 하시겠습니까?

분류에서Dev

AppDelegate를 사용하여 앞뒤로 데이터 전달

분류에서Dev

DownloadManager를 사용하여 Activity에서 BroadcastReceiver로 데이터 전달

분류에서Dev

ViewPager를 사용하여 Activity에서 Fragments로 데이터 전달

분류에서Dev

UITableView에서 UIViewController로 segue를 사용하여 데이터 전달

분류에서Dev

화면에서 서랍으로 데이터 전달 플러터

분류에서Dev

데이터 여러 ViewController 전달

분류에서Dev

대화 상자에서 활동으로 데이터 전달

분류에서Dev

iptables를 사용하여 나가는 트래픽 포트 전달

분류에서Dev

Ajax를 사용하여 양식 데이터를 컨트롤러 메소드로 전달

분류에서Dev

이러한 입력의 데이터를 배열에 저장하여 formdata로 전달합니다.

분류에서Dev

스레드를 사용하여 재귀 적으로 데이터 전달

분류에서Dev

MVC를 사용하여 Viewmodel 속성으로 Morris Chart 데이터 전달

Related 관련 기사

  1. 1

    여러 매개 변수 / 인수를 대상으로 전달

  2. 2

    인터페이스별로 소스 IP를 다시 쓰는 nftables / iptables 규칙

  3. 3

    iptables를 사용하여 동적으로 소스 IP 주소를 기반으로 가상 인터페이스로 트래픽 전달

  4. 4

    iptables를 사용하여 서버로 트래픽 전달

  5. 5

    양식 데이터를 여러 sqlite3 행으로 전달하는 방법

  6. 6

    TIdTCPServer에서 TIdTCPClient로 여러 줄 TStrings 데이터를 전달하는 방법

  7. 7

    uitableviewcell swift에서 여러 prepareforsegue로 데이터를 전달하는 방법

  8. 8

    k8s : iptables를 사용하여 공용 VIP에서 clusterIP로 전달

  9. 9

    $ .ajax에서 webmethod로 여러 데이터 매개 변수 전달

  10. 10

    iptables를 사용하여 한 컴퓨터에서 다른 컴퓨터로 네트워크 트래픽 전달

  11. 11

    iptables를 사용하여 한 컴퓨터에서 다른 컴퓨터로 네트워크 트래픽 전달

  12. 12

    iOS-상위보기에서 컨테이너보기의보기로 데이터를 여러 번 전달

  13. 13

    하나의 컨테이너를 사용하는 여러 조각으로 데이터 전달

  14. 14

    AJAX 데이터를 통해 여러 데이터 값 전달

  15. 15

    Iptables로 TCP 연결 전달

  16. 16

    프래그먼트에서 활동으로 여러 데이터를 전달하는 방법

  17. 17

    쉬운 방법으로 여러 데이터 변수를 AJAX 함수에 전달 하시겠습니까?

  18. 18

    AppDelegate를 사용하여 앞뒤로 데이터 전달

  19. 19

    DownloadManager를 사용하여 Activity에서 BroadcastReceiver로 데이터 전달

  20. 20

    ViewPager를 사용하여 Activity에서 Fragments로 데이터 전달

  21. 21

    UITableView에서 UIViewController로 segue를 사용하여 데이터 전달

  22. 22

    화면에서 서랍으로 데이터 전달 플러터

  23. 23

    데이터 여러 ViewController 전달

  24. 24

    대화 상자에서 활동으로 데이터 전달

  25. 25

    iptables를 사용하여 나가는 트래픽 포트 전달

  26. 26

    Ajax를 사용하여 양식 데이터를 컨트롤러 메소드로 전달

  27. 27

    이러한 입력의 데이터를 배열에 저장하여 formdata로 전달합니다.

  28. 28

    스레드를 사용하여 재귀 적으로 데이터 전달

  29. 29

    MVC를 사용하여 Viewmodel 속성으로 Morris Chart 데이터 전달

뜨겁다태그

보관