私は過去 3 日間、問題の解決策を探してきましたが、まだ何も解決していません。
ゴール
自宅のコンピューターをリモートから起動できるようにする必要があります。現在、WOL がローカルで動作しています。Android フォンからマシンをオンにできます。自宅から離れているときでも動作する必要があります。
私のネットワーク設定
私にはルーターが 2 台あります。プライマリ ルーターは ISP に接続されており、ポート転送はサポートしていますが WOL 機能のない独自のソフトウェアを実行しています。セカンダリ ルーターはイーサネット ケーブル経由で最初のルーターに接続されており、dd-wrt を実行しています。自宅のコンピューターはイーサネット ケーブル経由でセカンダリ ルーターに接続されており、静的 IP アドレスを持っています。また、no-ip のおかげで、プライマリ ルーターにリンクする動的 DNS も構成しました。
私が試した解決策
私が最初に試した解決策は、プライマリ ルーターのポート 7 に着信する UDP トラフィックをセカンダリ ルーターのポート 7 に転送することでした。次に、セカンダリ ルーターのポート 7 に着信する UDP を自宅のコンピューターに転送しました。これはうまくいきませんでした。自宅のコンピューターの ARP テーブルに静的エントリを設定してもうまくいきませんでした。
2 番目の解決策は、私にとって最も安全だと思われるもので、自宅のコンピュータへのリクエストのログ ファイルを 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
スクリプト内の while ループの前の 2 つの echo コマンドからの出力のみが含まれます。
これは 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'
スクリプトが動作しない理由を知っている人はいますか? 代替の解決策はありますか?
答え1
はい、ついに解決策を見つけました。
プライマリ ルータでは、ポート 9 に着信する UDP トラフィックをセカンダリ ルータに転送します。
2番目のルータのdd-wrtでsyslogdとファイアウォールのログ記録を有効にしました。これらのログはファイル/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
トラフィック ログ ファイルを監視し、ポート 9 で UDP トラフィックを検出すると、dd-wrt wol コマンドを使用して自宅のコンピューターを起動します。
リモートでも完璧に動作しますが、唯一の懸念はセキュリティです。