Có thể sao chép luồng unicast UDP với iptables không?


8

Tôi có một hệ thống độc quyền truyền luồng video udp từ đơn vị số 1 (192.168.1.1) sang đơn vị số 2 (.1.2). Tôi không thể thay đổi hệ thống này và tôi đang cố gắng sao chép luồng udp này để tôi có thể truy cập nó trong một chương trình khác. Chương trình này sẽ thực hiện công cụ với video và gửi lại dưới dạng luồng phát đa hướng.

Tôi hy vọng sẽ thực hiện việc này bằng máy Linux (chạy Ubuntu Server 12.04 ngay bây giờ) với ba card mạng. Bằng cách kết nối thiết bị số 1 và số 2 với hai trong số các card mạng (eth0 và eth1) trong máy Linux và sử dụng cầu nối, tôi đã giao tiếp với chúng. Giao diện / etc / mạng / của tôi trông như sau:

# The loopback network interface
auto lo
iface lo inet loopback

# The external interface
auto eth3
iface eth3 inet static
address 192.168.10.2
netmask 255.255.255.0

# The bridge interface
auto br0
iface br0 inet manual
  bridge_ports eth0 eth1

Điều này hoạt động và bằng cách sử dụng tcpdump tôi đã xác nhận rằng các gói udp đang đến từ # 1 và đang hướng tới # 2 tại cổng 6000.

Bước tiếp theo tôi hy vọng sẽ hoạt động là sử dụng iptables để sao chép tất cả các gói udp bắt đầu từ 192.168.1.1 sang cổng 6000 ở # 2. Tôi không quen thuộc lắm với iptables, nhưng sau khi đọc trực tuyến và hướng dẫn, tôi nghĩ rằng nó sẽ hoạt động:

iptables -A PREROUTING -t mangle -p udp -s 192.168.1.1/32 --dport 6000 -j TEE --gateway 192.168.10.2

Quy tắc được áp dụng thành công, nhưng nó không hoạt động. Nếu tôi sử dụng tcpdump để theo dõi eth3 thì tôi không thấy các gói ở đó.

Tôi muốn lấy luồng này, làm việc trên luồng đó và gửi nó dưới dạng đa tuyến trên giao diện .10.2.

Tôi đang làm gì sai? Có điều gì tôi đã hiểu lầm?

Câu trả lời:


4

Các gói không bao giờ đạt eth3 là 192.168.10.2 là chính máy. Ngoài ra, các gói trùng lặp vẫn có địa chỉ IP định mệnh 192.168.1.2. Bạn cần TEE chúng vào một máy trong 192.168.10.0/24, ví dụ 192.168.10.254 để các bản sao thực sự được chuyển qua eth3.

iptables -t mangle -A PREROUTING -p udp --dport 6000 -j TEE --gateway 192.168.10.254

Sau đó, bạn cũng cần DNAT chúng thành 192.168.10.254, vì vậy bạn có thể đọc luồng trên 192.168.10.254 và gửi nó qua đa tuyến.

Hoặc vào ngày 192.168.10.254:

iptables -t nat -A PREROUTING -p udp -d 192.168.1.2 --dport 6000 -j DNAT --to-destination 192.168.10.254:6000

Hoặc vẫn còn trên 192.168.10.2 trước khi các gói rời khỏi eth3:

iptables -t nat -A POSTROUTING -o eth3 -p udp -d 192.168.1.2 --dport 6000 -j DNAT --to-destination 192.168.10.254:6000

Nếu tôi hiểu điều này một cách chính xác, những gì bạn đã giải thích sẽ gửi các gói đến một máy khác (.10.254). Tôi muốn tránh máy này thêm, và chỉ làm điều này trong một máy. Nếu tôi đặt cổng thành 127.0.0.1, nó có hoạt động không?
Håkon K. Olafsen

Cổng chỉ là một bước nhảy tiếp theo, đích vẫn còn 192.168.1.2 và bạn không thể DNAT các gói trùng lặp trên máy "phát" chúng. Vì vậy, 127.0.0.1 cũng không hoạt động.
lsmooth

Vì vậy, tôi không thể làm những gì tôi đang cố gắng chỉ sử dụng một máy.
Håkon K. Olafsen

0

Tôi đã có một vấn đề tương tự và giải quyết nó bằng một chương trình nhỏ sử dụng libpcap để đọc nội dung của các gói UDP. Nó đã gửi các bản sao của các gói này đến một đích khác. (Có thể trên cùng một máy.)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.