Удаленный пробуждение по локальной сети за 2 маршрутизатора

0

Последние 3 дня я искал решение своих проблем, но пока ничего не получалось.

Цель

Мне нужно иметь возможность разбудить мой домашний компьютер с пульта. Теперь у меня есть WOL, работающий в местном масштабе: я могу включить машину с моего телефона Android. Мне нужно, чтобы это работало, даже если я вдали от дома.

Моя настройка сети

У меня есть два маршрутизатора, основной маршрутизатор подключен к Интернет-провайдеру, работает на проприетарном программном обеспечении, которое поддерживает переадресацию портов, но не имеет функциональности WOL. Вторичный маршрутизатор подключен к первому через кабель Ethernet и работает dd-wrt. Мой домашний компьютер подключен к вторичному маршрутизатору через кабель Ethernet и имеет статический IP-адрес. Я также настроил динамический DNS, связываясь с основным маршрутизатором, благодаря no-ip.

Решения, которые я пробовал

Первое решение, которое я попробовал, состояло в том, чтобы перенаправить трафик UDP, поступающий через порт 7 основного маршрутизатора, на порт 7 дополнительного маршрутизатора. Затем перешлите UDP, идущий через порт 7 вторичного маршрутизатора, на мой домашний компьютер. Это не сработало. Даже установка статического входа в таблицу arp для моего домашнего компьютера не работала.

Второе решение, которое кажется мне наиболее безопасным, состоит в том, что dd-wrt проверяет файлы журналов для запроса на мой домашний компьютер и, если он обнаруживает их, dd-wrt выдает свою команду wol, разбудив компьютер. Я нашел этот скрипт:

#!/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

Я настроил сценарий, журнал хранится как /tmp/www/wol.htmlраз и содержит выходные данные двух команд echo до цикла while в сценарии.

Я думаю, что это проблема журналов dd-wrt, я проверил их, и они, кажется, не содержат никакой информации об IP-адресах или портах:

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'

Кто-нибудь знает, почему скрипт не работает? Есть ли у вас альтернативное решение?

ran3000
источник
У меня есть ощущение, что вы должны тщательно изучить, как вы используете номера портов. Что такое 32400? Это должно быть передано от восходящего маршрутизатора до нижестоящего маршрутизатора? Почему вы иногда используете порт 7, а иногда 9? 9 (Discard) - это традиционно используемый порт для WOL на основе IP.
Spiff
Пока я пробовал разные решения, я переключал порт несколько раз. Я наконец нашел решение, хотя, я опубликую это как ответ, когда я вернусь домой. В любом случае, спасибо!
пробег 3

Ответы:

0

Хорошо, я наконец нашел решение.

На основном маршрутизаторе я пересылаю UDP-трафик, поступающий через порт 9, на дополнительный маршрутизатор.

Я включил syslogd и вход в брандмауэр в dd-wrt для второго маршрутизатора, эти журналы сохраняются в файле: / proc / net / ip_conntrack

Я добавил этот скрипт запуска в 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

Он просматривает файл журнала трафика и, когда он видит трафик UDP на порту 9, он пробуждает мой домашний компьютер с помощью команды dd-wrt wol.

Он отлично работает даже удаленно, моя единственная забота - безопасность.

ran3000
источник