Chuyển đổi một gói unicast UDP thành một phát sóng?


8

Chúng tôi cần đánh thức một số máy tính trên mạng LAN nội bộ của chúng tôi, từ Internet.
Chúng tôi có một bộ định tuyến hơi kín, với rất ít cách để cấu hình nó.
Tôi muốn sử dụng netfilter (iptables) để làm điều này bởi vì nó không liên quan đến trình nền hoặc tương tự, nhưng các giải pháp khác đều ổn.

Những gì tôi có trong tâm trí:

  • máy tính bên ngoài phát hành gói WOL (Wake-On-LAN) đến địa chỉ IP công cộng (bên trong có MAC chính xác)
  • cổng chính xác được mở trên bộ định tuyến (giả sử 1234), chuyển hướng dữ liệu sang hộp Linux
  • hộp Linux chuyển đổi gói unicast UDP thành gói quảng bá (chính xác cùng một nội dung, chỉ có địa chỉ đích được sửa đổi thành 255.255.255.255 hoặc 192.168.0.255)
  • gói multicast đến với mọi NIC và máy tính mong muốn đã hoạt động

Vì thế, một quy tắc bộ lọc mạng rất đơn giản là:
iptables --table nat --append PREROUTING --in-interface eth+ --protocol udp --destination-port 1234 --jump DNAT --to-destination 192.168.0.255

Alas netfilter dường như bỏ qua chuyển đổi để phát sóng. 192.168.0.255 và 255.255.255.255 không cung cấp gì. Cũng được thử nghiệm với 192.168.0.0 và 0.0.0.0
Tôi đã sử dụng tcpdump để xem điều gì xảy ra:
tcpdump -n dst port 1234
13:54:28.583556 IP www.xxx.yyy.zzz.43852 > 192.168.0.100.1234: UDP, length 102
và không có gì khác. Tôi nên có một dòng thứ hai như:
13:54:28.xxxxxx IP www.xxx.yyy.zzz.43852 > 192.168.0.255.1234: UDP, length 102

Nếu tôi chuyển hướng đến một địa chỉ không phát đa hướng, mọi thứ đều ổn. Tôi có 2 dòng dự kiến. Nhưng rõ ràng điều này không làm việc cho WOL.

Có cách nào để nói với netfilter phát hành các gói phát sóng không?

Các phương pháp khác tôi nghĩ về:

  • sử dụng iptables để khớp với các gói mong muốn, ghi nhật ký và sử dụng trình nền để theo dõi tệp nhật ký và kích hoạt gói tin quảng bá
  • sử dụng iptables để chuyển hướng các gói mong muốn đến một daemon cục bộ, nó kích hoạt gói quảng bá (đơn giản hơn)
  • sử dụng socat (thế nào?)

Gói tin quảng bá không chỉ là gói được gửi đến địa chỉ quảng bá. Có một cờ cho các ổ cắm được gọi là SO_BROADCAST. Tôi đang cố gắng tìm hiểu làm thế nào iptables có thể sửa đổi nó.
lgeorget

@lgeorget: iptables không liên quan đến ổ cắm.
HỌC BỔNG Bertrand

Thật. Tôi không nhìn đúng chỗ. Phải có một tùy chọn ở đâu đó cho iptables để cho phép nó gửi các gói phát sóng.
lgeorget

1
Bạn đã thử iptables --table nat --append PREROUTING --in-interface eth + --protatio udp --destination-port 1234 --jump DNAT --to-Destination 192.168.0.0?
lgeorget

@lgeorget: cảm ơn vì ý tưởng. Nhưng kết quả tương tự. Tôi cập nhật câu hỏi
Gregory MOUSSAT

Câu trả lời:


12

socatlà một tiện ích sát thủ. Đặt một nơi nào đó trong tập lệnh init của bạn:

socat -u -T1 UDP-LISTEN:1234,fork UDP-DATAGRAM:255.255.255.255:5678,broadcast

Một số người dùng gặp sự cố với UDP-LISTEN, vì vậy sử dụng UDP-RECV có vẻ tốt hơn (cảnh báo: có thể gửi các gói phát sóng trong một vòng lặp vô tận):

socat -u UDP-RECV:1234 UDP-DATAGRAM:255.255.255.255:5678,broadcast

forkcho phép tiếp tục lắng nghe socat cho các gói tiếp theo.
T1giới hạn tuổi thọ của các quy trình con rẽ nhánh trong 1 giây.
255.255.255.255là tổng quát hơn 192.168.0.255. Cho phép bạn chỉ sao chép-dán mà không nghĩ về cấu trúc mạng hiện tại của bạn. Hãy cẩn thận: điều này có thể gửi các gói được phát đến mọi giao diện.

Như bạn, tôi nhận thấy WOL hoạt động với bất kỳ cổng nào. Tôi tự hỏi nếu điều này là đáng tin cậy. Rất nhiều tài liệu chỉ nói về các cổng 0, 7 và 9.
Điều này cho phép sử dụng một cổng không có đặc quyền, vì vậy bạn có thể chạy socatvới người dùng nobody.

Cảm ơn lgeorget Hauke LagingGregory MOUSSATđã tham gia câu trả lời này.
Đã miễn phí để thêm chi tiết.


Tôi đã thử điều đó nhưng vấn đề là UDP-LISTEN sẽ đóng ổ cắm sau khi gói đầu tiên đã đến, bất kể ngã ba. Sử dụng UDP-RECV thay thế.
lgeorget

Không có vấn đề ở đây. Bạn đã sử dụng tùy chọn "ngã ba"? Tôi thấy trong các gói hợp nhất UDP-RECV. Tôi không biết ý nghĩa của nó. UDP-RECVFROM không thể hiện hành vi này, nhưng nó có thể là một lỗi ở người đàn ông.
HỌC BỔNG Bertrand

Có, tôi đã sử dụng 'ngã ba'. Tôi đã thử với một quy trình socat và hai netcat (một để gửi các gói đến socat, một để nhận các gói phát sóng). Với UPD-LISTEN, socat mô phỏng một kết nối và đóng ổ cắm ở cuối. Với UDP-RECV, nó sử dụng hành vi không kết nối mặc định của UDP. Từ socat man: "Thông thường, các kết nối ổ cắm sẽ được kết thúc bằng tắt máy (2), nó sẽ chấm dứt ổ cắm ngay cả khi nó được chia sẻ bởi nhiều quá trình."
lgeorget

2
Là socat sẽ phát sóng trên tất cả các giao diện sau đó?
Hauke ​​Laging

1
@lgeorget: "echo 'dummy' | nc -u -q 0 127.0.0.1 1234" hoạt động hoàn hảo với -UDP-LISTEN. Tôi có thể chạy nó nhiều lần. Nhưng tôi có vấn đề với -UDP-RECV và -UDP-RECVFROM: các gói được phát ở tốc độ liên kết tối đa cho đến khi socat bị giết. Bạn có thấy vấn đề tương tự với tcpdump không?
HỌC BỔNG Bertrand

3

Lưu lượng phát theo định nghĩa được dành cho máy cục bộ. Điều này có nghĩa là gói được DNAT'ed thành 192.168.0.255 và sau đó kernel nhìn thấy gói đó và quyết định rằng nó được định sẵn cho chính bộ định tuyến, vì vậy bạn sẽ thấy gói này trong chuỗi INPUT. Bộ định tuyến (và bất kỳ thiết bị nào khác) sẽ nghĩ rằng các gói 192.168.0.255 được dành cho chính nó và sẽ không chuyển tiếp chúng nữa. Các gói tin quảng bá không được định tuyến / chuyển tiếp theo thiết kế.

Có một cách giải quyết tuyệt vời với thủ thuật ARP đã đề cập. Bạn sẽ "mất" một địa chỉ IP. Tôi sẽ sử dụng hình nộm 192.168.0.254trong ví dụ này - hãy nhớ không bao giờ gán 192.168.0.254cho bất kỳ thiết bị nào trong mạng của bạn:

  1. Tạo một mục ARP tĩnh trên giao diện LAN cho địa chỉ IP bạn sẽ không bao giờ sử dụng cho bất kỳ máy nào:

    arp -i ethLAN --set 192.168.0.254 FF:FF:FF:FF:FF:FF
    
  2. DNAT hệ số UDP Wake-On-Lan của bạn trên giao diện WAN tới địa chỉ IP giả này:

    iptables --table nat --append PREROUTING  --in-interface ethWAN --protocol udp --destination-port 1234 --jump DNAT --to-destination 192.168.0.254
    

Điều này hoạt động hoàn hảo cho các gói WOL. Giải pháp này cũng hoạt động trên các sản phẩm dựa trên nhân Linux, như thiết bị Mikrotik và thiết bị openwrt. Tôi sử dụng thủ thuật này trên các thiết bị Mikrotik để đánh thức máy của mình từ xa bằng điện thoại di động.


Các gói tin nhận được từ internet không được phát sóng. Đây là lý do tại sao câu hỏi là "Biến đổi UNICAST thành MÔI GIỚI"
Gregory MOUSSAT 17/03/2015

2

Tôi tìm thấy câu hỏi này trên Serverfault .

Tôi đã không quản lý để có được lưu lượng phát sóng như vậy thông qua bộ định tuyến của tôi. Các gói DNATted thậm chí không đến chuỗi FORWARD của tôi. Có lẽ có một số tùy chọn hạt nhân lạ mà không cho phép điều đó.

Nhưng ý tưởng ARP rất thú vị. Tôi đoán rằng phải đi kèm với một quy tắc trong OUTPUT, điều này cấm các gói đến địa chỉ này để chỉ có thể truy cập được với lưu lượng được chuyển tiếp.


1

Socat OpenWRT

Socat đã được tuyên bố là một câu trả lời, tuy nhiên câu trả lời đã nêu không hoạt động đối với tôi trên nền tảng của tôi, OpenWRT, với một địa chỉ WAN động.

Mục tiêu của tôi là chuyển tiếp các gói đánh thức UDP unicast từ cổng UDP 9 của giao diện WAN sang mạng con phát vào ngày 192.168.20.255.

Các hỏng (iptables)

Tôi cũng đã thử với iptables, nhưng mỗi khi tôi thêm một quy tắc kết thúc bằng 255, quy tắc sẽ được chuyển thành cục bộ với địa chỉ đích 0.0.0.0 khi tôi in bằng:

iptables -t nat -L

Tôi tin rằng iptables không có khả năng ghép kênh lưu lượng truy cập, như được yêu cầu trong một chuyển đổi unicast để phát sóng.

Cái xấu (giả mạo arp mục)

Làm giả các mục arp không phải là quá tệ, bởi vì các gói đến với mọi người trên đoạn ethernet, nhưng nó có những nhược điểm sau

  • Bạn "tiêu thụ" một địa chỉ IP
  • IP đích trong gói WoL bị sai, mặc dù bạn nhận được nó vì địa chỉ MAC là tất cả FFFF ...
  • Một sự cố IP có thể xảy ra nếu ai đó trên mạng sử dụng địa chỉ IP đó.
  • Nó là một phát sóng Ethernet, và không phải là một phát sóng IP.

Lưu ý: Điều này có thể được thực hiện với arplệnh hoặc ip neighlệnh.

Tốt

socat, như được chỉ ra bởi câu trả lời trước, là badass. Câu trả lời socat trước đây, tuy nhiên, tôi gặp một vài vấn đề với nó.

  1. Xã hội của tôi đã không chuyển tiếp lưu lượng khi đích phát sóng UDP là 255.255.255.255. Tôi đã tránh điều này bằng cách hạn chế mạng con phát sóng đến mạng tôi sử dụng có lẽ an toàn hơn.
  2. Khi tôi đặt địa chỉ liên kết thành 0.0.0.0, tôi đã gặp phải một cơn bão phát sóng do lưu lượng truy cập bị dội lại vào mạng xã hội từ mạng LAN của tôi. Trước tiên tôi đã giải quyết điều này bằng cách ràng buộc với các dd công khai của mình, tuy nhiên điều này không lý tưởng vì các dd có thể không khả dụng và địa chỉ IP được gán động của tôi thay đổi.

Tôi đã có thể liên kết với 0.0.0.0 (tất cả các địa chỉ) và tránh cơn bão phát sóng bằng cách thêm quy tắc iptables để chặn phát sóng đến từ dội lại vào socat từ phía mạng LAN. Quy tắc này, ngoài quy tắc iptables để chấp nhận lưu lượng truy cập trên cổng UDP 9 và quy tắc iptables để ghi nhật ký, chúng tôi nhận được ba quy tắc sau cùng với lệnh socat.

iptables -I input_wan_rule -p udp --dport 9 -j ACCEPT -m comment --comment "firewall entry to allow udp port 9 to socat"
iptables -I input_wan_rule -p udp --dport 9 -j LOG --log-prefix 'Received MAGIC PACKET on udp/9'
iptables -I input_lan_rule -p udp --dport 9 -d 192.168.20.0/24 -j DROP -m comment --comment "block broadcast from bouncing back to socat to avoid storm"

killall socat 2>/dev/null
socat -u -T1 UDP-LISTEN:9,bind=0.0.0.0,fork UDP-DATAGRAM:192.168.20.255:9,broadcast &

Đối với OpenWRTers, dán cái này vào /etc/firewall.uservà phát hành /etc/init.d/firewall restartlà đủ.

Xin chúc mừng, bây giờ bạn sẽ có WoL làm việc cho mạng của bạn từ bất cứ đâu trên web.


0

Trên thực tế netfilter không thể thực hiện bất kỳ phát sóng nào, cơ chế định tuyến thực hiện điều này.

Nhưng nó giảm bất kỳ phát sóng chuyển tiếp theo mặc định.

Có thể chuyển tiếp phát sóng UDP được định hướng trong nhân Linux gần đây (phiên bản 5.0)

Bạn cần sửa đổi bc_forwardingtham số cho giao diện mạng phát sóng:

sudo sysctl -w net.ipv4.conf.eth1.bc_forwarding=1

(Lưu ý: có vẻ như tùy chọn net.ipv4.conf. Tất cả .bc_forwarding không hoạt động)

Vì vậy, bây giờ, kernel khoảng 5.0 + iptables là đủ cho bạn

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.