ルータの外向きIPアドレスは、ルータの外のマシンにアクセスして取得するのが一般的だが、ご家庭ルータがUPnP IGD (Internet Gateway Device)に対応していれば、UPnPクライアントを使うことで外向きIPアドレスを取得できる。
apt-getでインストールする。
sudo apt-get install miniupnpc
$ upnpc -s
upnpc : miniupnpc library test client. (c) 2006-2010 Thomas Bernard
Go to http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
for more information.
List of UPNP devices found on the network :
desc: http://192.168.1.XXX:51382/rootDesc.xml
st: urn:schemas-upnp-org:device:InternetGatewayDevice:1
Found valid IGD : http://192.168.1.XXX:51382/ctl/IPConn
Local LAN ip address : 192.168.1.XXX
Connection Type : IP_Routed
Status : Connected, uptime=48328s, LastConnectionError : ERROR_NONE
Time started : Fri Jul 17 22:36:57 2015
MaxBitRateDown : 1000000000 bps MaxBitRateUp 1000000000 bps
ExternalIPAddress = XXX.XXX.XXX.XXX
Bytes: Sent: 28763112 Recv: 125978505
Packets: Sent: 167209 Recv: 178489
'ExternalIPAddress = 'のあたりをひっかけて取得すればいいようだ。
ただ、外向きIPアドレスを取得したいだけ場合は upnpc -s
よりも、一緒にインストールされる external-ip
コマンドのほうが手っ取り早そうだ。
いくつかのサイトを参考にスクリプトを作る。
get_extip.sh
#!/bin/sh
EXTIP=/usr/bin/external-ip
CAT=/bin/cat
SAVEFILE=$HOME/extip.txt
#PUSH=`dirname $0`/push.sh
PUSH=`dirname $0`/ifttt.sh
STR1=`$EXTIP`
if [ "$STR1" = "0.0.0.0" ]; then
STR1="none"
fi
#echo $STR1
if [ -e "$SAVEFILE" ]; then
STR2=`$CAT $SAVEFILE`
else
STR2="none"
fi
#echo $STR2
if [ "$STR1" != "none" ]; then
if [ "$STR1" != "$STR2" ]; then
echo $STR1 > $SAVEFILE
$PUSH "HOME IP = $STR1"
fi
fi
echo $STR1
ifttt.sh
は、以前の記事で作ったもの。
定期的にcronで実行するようにした。/home/pi/extip.txtに変化があった場合はスマホ等にプッシュ通知される。