Kita perlu membangunkan beberapa komputer di LAN internal kita, dari Internet.
Kami memiliki router yang agak tertutup, dengan sangat sedikit cara untuk mengkonfigurasinya.
Saya ingin menggunakan netfilter (iptables) untuk melakukan ini karena tidak melibatkan daemon atau yang serupa, tetapi solusi lain baik-baik saja.
Apa yang ada dalam pikiran saya:
- komputer eksternal mengeluarkan paket WOL (Wake-On-LAN) ke alamat IP publik (dengan MAC yang benar di dalamnya)
- port yang benar terbuka pada router (katakanlah 1234), mengarahkan data ke kotak Linux
- kotak Linux mengubah paket unicast UDP menjadi paket siaran (konten yang sama persis, hanya alamat tujuan yang diubah menjadi 255.255.255.255 atau 192.168.0.255)
- paket multicast datang ke setiap NIC, dan komputer yang diinginkan sekarang bangun
Untuk itu, aturan netfilter yang sangat sederhana adalah:
iptables --table nat --append PREROUTING --in-interface eth+ --protocol udp --destination-port 1234 --jump DNAT --to-destination 192.168.0.255
Alas netfilter tampaknya mengabaikan transformasi untuk siaran. 192.168.0.255 dan 255.255.255.255 tidak memberikan apa pun. Juga diuji dengan 192.168.0.0 dan 0.0.0.0
Saya menggunakan tcpdump untuk melihat apa yang terjadi:
tcpdump -n dst port 1234
13:54:28.583556 IP www.xxx.yyy.zzz.43852 > 192.168.0.100.1234: UDP, length 102
dan tidak ada yang lain. Saya harus memiliki baris kedua seperti:
13:54:28.xxxxxx IP www.xxx.yyy.zzz.43852 > 192.168.0.255.1234: UDP, length 102
Jika saya mengalihkan ke alamat non-multicast, semuanya baik-baik saja. Saya memiliki 2 garis yang diharapkan. Tapi jelas ini tidak bekerja untuk WOL.
Apakah ada cara untuk memberitahu netfilter untuk mengeluarkan paket siaran?
Metode lain yang saya pikirkan:
- gunakan iptables untuk mencocokkan paket yang diinginkan, catat, dan gunakan daemon untuk memantau file log dan nyalakan paket siaran
- gunakan iptables untuk mengarahkan ulang paket yang diinginkan ke daemon lokal, yang meluncurkan paket siaran (lebih sederhana)
- gunakan socat (bagaimana?)
sumber
Jawaban:
socat
adalah utilitas pembunuh. Letakkan suatu tempat di skrip init Anda:Beberapa pengguna memiliki masalah dengan UDP-LISTEN, jadi menggunakan UDP-RECV tampaknya lebih baik (peringatan: dapat mengirim paket siaran dalam loop tanpa akhir):
fork
memungkinkan untuk tetap mendengarkan socat untuk paket berikutnya.T1
batasi umur subproses bercabang menjadi 1 detik.255.255.255.255
lebih umum dari 192.168.0.255. Mengizinkan Anda hanya menyalin-menempel tanpa memikirkan struktur jaringan Anda saat ini. Peringatan: ini mungkin mengirim paket yang disiarkan ke setiap antarmuka.Saat Anda, saya perhatikan WOL bekerja dengan port apa pun. Saya ingin tahu apakah ini dapat diandalkan. Banyak dokumen hanya berbicara tentang port 0, 7 dan 9.
Ini memungkinkan untuk menggunakan port non-pivilegied, sehingga Anda dapat berjalan
socat
dengan penggunanobody
.Terima kasih kepada
lgeorget
Hauke Laging
danGregory MOUSSAT
telah berpartisipasi dalam jawaban ini.Jatuh bebas untuk menambahkan detail.
sumber
Lalu lintas siaran menurut definisi diperuntukkan bagi mesin lokal. Ini berarti paket mendapatkan DNAT'ed ke 192.168.0.255 dan kemudian kernel melihat paket dan memutuskan bahwa itu ditakdirkan untuk router itu sendiri, sehingga Anda akan melihat paket ini dalam rantai INPUT. Router (dan perangkat lainnya) akan berpikir bahwa paket 192.168.0.255 ditujukan untuk dirinya sendiri dan tidak akan meneruskannya lebih lanjut. Paket siaran tidak dialihkan / diteruskan oleh desain.
Ada solusi hebat dengan trik ARP yang disebutkan. Anda akan "kehilangan" satu alamat IP. Saya akan menggunakan dummy
192.168.0.254
dalam contoh ini - ingatlah untuk tidak pernah menetapkan192.168.0.254
ke perangkat apa pun di jaringan Anda:Buat entri ARP statis pada antarmuka LAN untuk alamat IP yang tidak akan pernah Anda gunakan untuk mesin apa pun:
DNAT taffic UDP Wake-On-Lan Anda pada antarmuka WAN ke alamat IP dummy ini:
Ini berfungsi sempurna untuk paket WOL. Solusi ini juga berfungsi pada produk yang didasarkan pada kernel Linux, seperti perangkat Mikrotik dan perangkat openwrt. Saya menggunakan trik ini pada perangkat Mikrotik untuk membangunkan mesin saya dari jarak jauh dengan ponsel saya.
sumber
Saya menemukan pertanyaan ini di Serverfault .
Saya tidak berhasil mendapatkan lalu lintas siaran seperti itu melalui router saya. Paket-paket DNATted bahkan tidak sampai di rantai FORWARD saya. Mungkin ada beberapa opsi kernel aneh yang melarang itu.
Tapi ide ARP menarik. Saya kira itu harus disertai dengan aturan dalam OUTPUT yang melarang paket ke alamat ini sehingga hanya dapat dicapai dengan lalu lintas yang diteruskan.
sumber
OpenWRT Socat
Socat telah dinyatakan sebagai jawaban, namun jawaban yang dinyatakan tidak bekerja untuk saya di platform saya, OpenWRT, dengan alamat WAN yang dinamis.
Tujuan saya adalah untuk meneruskan paket wake-on-lan UDP unicast dari port UDP 9 dari antarmuka WAN ke siaran subnet pada 192.168.20.255.
Yang rusak (iptables)
Saya juga mencoba dengan iptables, tetapi setiap kali saya menambahkan aturan yang berakhir pada 255, aturan tersebut berubah menjadi bubur dengan alamat tujuan 0.0.0.0 ketika saya mencetak dengan:
Saya percaya iptables tidak dapat melakukan multiplexing traffic, seperti yang disyaratkan dalam konversi unicast untuk menyiarkan.
Yang buruk (entri arp palsu)
Memalsukan entri arp tidak terlalu buruk, karena paket dapat diakses semua orang di segmen ethernet, tetapi memiliki kelemahan sebagai berikut
Catatan: Ini dapat dilakukan dengan
arp
perintah atauip neigh
perintah.Yang baik
socat, seperti yang ditunjukkan oleh jawaban sebelumnya, adalah badass. Namun, jawaban socat sebelumnya, saya mengalami beberapa masalah dengannya.
Saya dapat mengikat ke 0.0.0.0 (semua alamat) dan menghindari badai siaran dengan menambahkan aturan iptables untuk memblokir siaran masuk memantul kembali ke socat dari sisi LAN. Aturan ini, selain aturan iptables untuk menerima lalu lintas di port UDP 9, dan aturan iptables untuk mencatatnya, kami mendapatkan tiga aturan berikut selain perintah socat.
Untuk OpenWRTers, menempelkan ini ke dalam
/etc/firewall.user
dan mengeluarkan/etc/init.d/firewall restart
sudah cukup.Selamat, Anda sekarang seharusnya memiliki WoL yang bekerja untuk jaringan Anda dari mana saja di web.
sumber
Sebenarnya netfilter tidak dapat melakukan siaran apa pun, mekanisme routing melakukan ini.
Tetapi secara default ia menjatuhkan siaran yang diteruskan.
Menjadi mungkin untuk meneruskan siaran UDP yang diarahkan pada kernel Linux terbaru (sekitar versi 5.0)
Anda perlu mengubah
bc_forwarding
parameter untuk antarmuka jaringan penyiaran:(Catatan: sepertinya opsi net.ipv4.conf. Semua .bc_forwarding tidak berfungsi)
Jadi sekarang, kernel sekitar 5.0 + iptables sudah cukup untuk Anda
sumber