Dobbiamo riattivare alcuni computer sulla nostra LAN interna, da Internet.
Abbiamo un router piuttosto chiuso, con pochissimi modi per configurarlo.
Mi piacerebbe usare netfilter (iptables) per farlo perché non coinvolge un demone o simile, ma altre soluzioni vanno bene.
Quello che ho in mente:
- il computer esterno emette un pacchetto WOL (Wake-On-LAN) all'indirizzo IP pubblico (con il MAC corretto all'interno)
- la porta corretta è aperta sul router (diciamo 1234), reindirizzando i dati su un box Linux
- la scatola di Linux trasforma il pacchetto unicast UDP in un pacchetto di trasmissione (stesso contenuto esatto, solo l'indirizzo di destinazione viene modificato in 255.255.255.255 o 192.168.0.255)
- il pacchetto multicast arriva in ogni scheda di rete e il computer desiderato è ora attivo
Per questo, una regola netfilter molto semplice è:
iptables --table nat --append PREROUTING --in-interface eth+ --protocol udp --destination-port 1234 --jump DNAT --to-destination 192.168.0.255
Purtroppo netfilter sembra ignorare la trasformazione da trasmettere. 192.168.0.255 e 255.255.255.255 non danno nulla. Testato anche con 192.168.0.0 e 0.0.0.0
ho usato tcpdump per vedere cosa succede:
tcpdump -n dst port 1234
13:54:28.583556 IP www.xxx.yyy.zzz.43852 > 192.168.0.100.1234: UDP, length 102
e nient'altro. Dovrei avere una seconda riga come:
13:54:28.xxxxxx IP www.xxx.yyy.zzz.43852 > 192.168.0.255.1234: UDP, length 102
Se reindirizzo a un indirizzo non multicast, va tutto bene. Ho le 2 linee previste. Ma ovviamente questo non funziona per WOL.
C'è un modo per dire a netfilter di emettere pacchetti di trasmissione?
Altri metodi a cui penso:
- usa iptables per abbinare i pacchetti desiderati, registrali e usa un demone per monitorare il file di registro ed eseguire il pacchetto di trasmissione
- usa iptables per reindirizzare i pacchetti desiderati su un demone locale, che attiva il pacchetto di trasmissione (più semplice)
- usa socat (come?)