时刻知道路由器的ip,是常见需求。
之前介绍了DDNS,DDNS可以通过一个网址指向变化的ip。然而免费的DDNS有两个缺陷:
- 有延迟:DDNS生效有时间要求,大概为五分钟。
- 有跑路担忧:万一DDNS 商关机了,跑路了,自己的服务就要受损。
所以来介绍另一个掌握路由器ip的方法。这个方法要求:
- 你有一台云服务器,它具有一个ip
你会基本的ssh,命令行操作不会也没关系,下面有教程- 你有一个安装了OpenWrt的路由器
- 本教程使用的SSH客户端为PuTTY,其他客户端遇到问题可留言
ip 一变更,这个文件夹的脚本会执行
/etc/ppp/ip-up.d/
这是OpenWrt的一个特别目录。OpenWrt会监视ip的变化,一旦pppoe拨号产生ip的改变,就会执行该目录下的脚本,无需其他配置。
我们先建立该文件夹:
mkdir /etc/ppp/ip-up.d/ #OpenWrt 在 pppoe ip 改变 Event 发生后,会自动执行这个目录的脚本,无需其他配置
我会在下面先讲解脚本,大家可以边看边操作。最后我会提供一个一键部署脚本,给希望节省时间的朋友。
脚本代码和讲解
#声明“me”变量是为了在家庭路由器下写 Hosts 中
me=homeNas
#获取 wan 口 ip
ip=$(ifconfig | grep -A 1 "wan" |grep inet | grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}"|sed -n '1p')
# 自定义 hosts 可以让路由器下设备无痛访问家里 ip。
# 先在自定义的 myhosts 中删除上次记录的 wan ip
sed -i "/$me$/d" /etc/myhosts
# 然后在自定义的 myhosts 中更新本次新获得 wan ip
echo $ip $me >>/etc/myhosts
# 下面这个从路由器 ssh 到云服务器
# 请把 your-server-ip/port 换成你自己的;(验证记住云服务器 ip 后,可以删除-y -y)
# OpenWrt使用的shell为Busybox,其ssh客户端为Dropbear
# 因此你可能需要转换自己的私钥格式:OpenSSH -> Dropbear,或者用内置工具生成新公私钥
# 这里假定你已经使用Dropbear格式的私钥,并且公钥已经放在了云服务器中,且用户名为root
ssh root@your-server-ip/port -y -y -i /root/.ssh/id_ras "bash -s" <<EOF
echo $ip>$me
EOF
# 上面代码有一个小小的技巧,就是给服务器传递变量值。这是我见过最好的方法,大家可以记下。
# 给脚本添加执行权限
chmod +x /etc/ppp/ip-up.d/push-route-ip-to-server
代码整合
mkdir /etc/ppp/ip-up.d/ #OpenWrt 在 pppoe ip 改变 Event 发生后,会自动执行这个目录的脚本,无需其他配置
echo '#!/bin/sh
me=homeNas
ip=$(ifconfig | grep -A 1 "wan" |grep inet | grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}"|sed -n "1p") #获取 wan 口 ip
sed -i "/$me$/d" /etc/myhosts # myhosts 中删除上次记录的 wan ip
echo $ip $me >>/etc/myhosts # myhosts 中更新本次新获得 wan ip
# 请把 your-server-ip/port 换成你自己的
ssh root@your-server-ip/port -y -y -i /root/.ssh/id_ras "bash -s" <<EOF
echo $ip>$me
EOF
'>/etc/ppp/ip-up.d/push-route-ip-to-server
chmod +x /etc/ppp/ip-up.d/push-route-ip-to-server
你可以直接复制上面的代码,然后ssh到OpenWrt 中粘贴执行。执行后,脚本就写到这个文件中了: /etc/ppp/ip-up.d/push-route-ip-to-server
脚本写好后,每次 ip 改变,OpenWrt 会自动执行 push-route-ip-to-server。无需其他配置。
亦可以手动执行:sh /etc/ppp/ip-up.d/push-route-ip-to-server
你当然也可以push到其它地方
本脚本主要实现了ip的更新、获取和推送功能。
在获取新ip后,可搭配server酱推送到微信中或者使用命令行邮件客户端给自己发邮件。