Estou procurando uma solução para meus problemas há 3 dias, mas nada funcionou ainda.
Meta
Preciso ser capaz de ativar meu computador doméstico remotamente. Agora, tenho o WOL funcionando localmente: posso ligar a máquina no meu telefone Android. Preciso que funcione mesmo que eu esteja longe de casa.
Minha configuração de rede
Eu tenho dois roteadores, o roteador principal está conectado ao ISP, executa software proprietário, que suporta encaminhamento de porta, mas não possui funcionalidade WOL. O roteador secundário é conectado ao primeiro via cabo Ethernet e executa dd-wrt. Meu computador doméstico está conectado ao roteador secundário via cabo Ethernet e possui um endereço IP estático. Também configurei DNS dinâmico, vinculando ao roteador primário, graças ao no-ip.
Soluções que tentei
A primeira solução que tentei foi encaminhar o tráfego UDP proveniente da porta 7 do roteador primário para a porta 7 do roteador secundário. Em seguida, encaminhe o UDP vindo da porta 7 do roteador secundário para o meu computador doméstico. Isso não funcionou. Mesmo definir uma entrada estática na tabela arp para meu computador doméstico não funcionou.
A segunda solução, que me parece a mais segura, consiste em fazer com que o dd-wrt verifique os arquivos de log para solicitação ao meu computador doméstico e se encontrar algum, o dd-wrt emite seu comando wol, despertando o computador. Encontrei este script:
#!/bin/sh
#Enable JFFS2 and place script in /jffs/ then run on startup in web interface.
#You can check the log from http://192.168.2.1/user/wol.html
INTERVAL=1
PINGTIME=1
OLD=""
PORT=32400
WOLPORT=9
TARGET=192.168.2.4
BROADCAST=192.168.2.255
MAC=00:1f:5b:32:c6:0c
WOL=/usr/sbin/wol
LOGFILE="/tmp/www/wol.html"
echo "<meta http-equiv=\"refresh\" content=\"10\">" > $LOGFILE
echo "AUTO WOL Script started at" `date` "<br>" >> $LOGFILE
while sleep $INTERVAL;do
NEW=`dmesg | awk '/ACCEPT/ && /DST='"$TARGET"'/ && /DPT='"$PORT"'/ {print }' | tail -1`
SRC=`dmesg | awk -F'[=| ]' '/ACCEPT/ && /DST='"$TARGET"'/ && /DPT='"$PORT"'/ {print $7}' | tail -1`
LINE=`dmesg | awk '/ACCEPT/ && /DST='"$TARGET"'/ && /DPT='"$PORT"'/'`
if [ "$NEW" != "" -a "$NEW" != "$OLD" ]; then
if ping -qw $PINGTIME $TARGET >/dev/null; then
echo "NOWAKE $TARGET was accessed by $SRC and is already alive at" `date` "<br>">> $LOGFILE
else
echo "WAKE $SRC causes wake on lan at" `date` "<br>">> $LOGFILE
$WOL -i $BROADCAST -p $WOLPORT $MAC >> $LOGFILE
echo "<br>" >> $LOGFILE
sleep 1
fi
OLD=$NEW
fi
done
Eu configurei o script, o log armazenado /tmp/www/wol.html
contém apenas a saída dos dois comandos echo antes do loop while no script.
Acho que é um problema dos logs do dd-wrt, eu os inspecionei e eles parecem não conter nenhuma informação sobre endereços IP ou portas:
Sep 1 16:58:00 DD-WRT user.info : dhcpfwd : dhcp forwarder daemon successfully started
Sep 1 17:00:00 DD-WRT user.info : dhcpfwd : dhcp forwarder daemon successfully started
Sep 1 17:02:01 DD-WRT user.info : dhcpfwd : dhcp forwarder daemon successfully started
Sep 1 17:04:00 DD-WRT user.info : dhcpfwd : dhcp forwarder daemon successfully started
Sep 1 17:06:00 DD-WRT user.info : dhcpfwd : dhcp forwarder daemon successfully started
Sep 1 17:06:39 DD-WRT daemon.info hostapd: ath0: STA ac:cf:85:a1:f0:1b IEEE 802.11: disassociated due to inactivity
Sep 1 17:06:40 DD-WRT daemon.info hostapd: ath0: STA ac:cf:85:a1:f0:1b IEEE 802.11: deauthenticated due to inactivity (timer DEAUTH/REMOVE)
Sep 1 17:06:45 DD-WRT daemon.info hostapd: ath0: STA fc:3f:7c:8b:0c:71 IEEE 802.11: disassociated due to inactivity
Sep 1 17:06:46 DD-WRT daemon.info hostapd: ath0: STA fc:3f:7c:8b:0c:71 IEEE 802.11: deauthenticated due to inactivity (timer DEAUTH/REMOVE)
Sep 1 17:07:08 DD-WRT auth.info login[1874]: root login on 'pts/0'
Alguém sabe por que o script não está funcionando? Você tem alguma solução alternativa?
Responder1
Ok, finalmente encontrei uma solução.
No roteador primário eu encaminho o tráfego UDP que chega na porta 9 para o roteador secundário.
Habilitei o log do syslogd e do firewall no dd-wrt para o segundo roteador, esses logs são salvos no arquivo: /proc/net/ip_conntrack
Adicionei este script de inicialização no dd-wrt:
#! /bin/sh
WOL=/usr/sbin/wol
MAC_VMC=cd:6e:a2:32:87:6v
BCAST=192.168.2.255
LOGFILE="/tmp/www/wol.html"
echo "AUTO WOL Script started at" `date` "<br>" >> $LOGFILE
while sleep 5 ; do
if [ `egrep -c udp.+dport=9 /proc/net/ip_conntrack` -gt 0 ] ; then
echo "Sending Magic Packet at" `date` >> $LOGFILE
$WOL -i $BCAST -p 7 $MAC_VMC
sleep 120
fi
done
Ele observa o arquivo de log de tráfego e quando vê o tráfego UDP na porta 9, ele ativa meu computador doméstico usando o comando dd-wrt wol.
Funciona perfeitamente mesmo remotamente, minha única preocupação é a segurança.