记录时间:2020 年 1 月 8 日
关键词:Padavan IPV6 DDNS 邮件 脚本 stateless
START
想要体验一下拥有公网 IPV6 的便捷,无奈家庭宽带的 IP 都是动态分配的,为了方便使用只好找个 DDNS,本文采用的是 dynv6 提供的免费 DDNS 和二级域名。顺便说一下,Padavan 内置的 DDNS 貌似无法使用,那就只好用脚本来解决了。
更新:不多赘述,具体查看这两个帖子 家庭宽带 私设 web 被检测 魔都电信被停宽带 和 应对家宽 Web 的收紧,讨论一下在外网控制家庭设备的方案,因此不再推荐自家家用用途采取DDNS的方法!推荐用邮件或其他方式获取ip,采用ip来访问,邮件脚本见下文。
使用脚本配置 DDNS
使用前提
本文使用到的脚本适用于下图中的这种情况,WAN IP 与 LAN IP 都为无状态分配(stateless),并且 pppoe 也在此路由器上进行,其他的路由配置情况没有测试,待测试后再来更新。
路由器和下级设备的 DDNS
注意!该脚本仅更新临时地址
,不支持其他类型地址。另外本脚本的IPV6地址直接使用ip命令和NDP获取,除了发送邮件外不会连接任何第三方服务器。
- 什么方法都可以,只要把脚本文件放进路由器即可,这里以简单的winscp举例:用winscp连接到路由器,然后在/etc/storage目录下新建一个名为dynv6.sh的文本文件,复制以下脚本,并修改填写你的token信息。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59#!/bin/bash -e
#脚本使用方法
#./dynv6.sh [mode] [hostname] [name] [mac] # mode: router or neigh
########填写dynv6的token信息#######
token=xxxxxxxxxxxx
#获取参数
mode=$1
hostname=$2
name=${3:-'Router'}
mac=$4
#有必要的话更改网络设备名
device=ppp0
#模式选择错误处理
if [ "$mode" != "router" -a "$mode" != "neigh" ]; then
echo "please select router or neigh"
exit
fi
#neigh模式处理下级设备IP
if [ "$mode" = "neigh" ]; then
if [ -z $mac ]; then
echo "mac is empty"
exit
fi
mac=$( echo $mac | tr '[A-Z]' '[a-z]' )
file=$HOME/.dynv6.neigh.$name
[ -e $file ] && old=`cat $file`
#获得下级设备的ip
macinf=$(echo $mac | tr '[A-Z]' '[a-z]' | awk -F ':' '{print $5$6}' )
ipaddress=$(ip -6 neighbor | grep $mac | grep -v $macinf | grep -v 'fe80' | awk '{print $1}')
#router模式处理路由器IP
else
file=$HOME/.dynv6.router
[ -e $file ] && old=`cat $file`
#获取ip地址
ipaddress=$(ip -6 addr list scope global $device | grep "global" | sed -n 's/.*inet6 \([0-9a-f:]\+\).*/\1/p')
fi
#判断ip地址是否存在
if [ -z "$ipaddress" ]; then
echo "no IPv6 address found"
exit 1
fi
#检查地址是否改变
if [ "$old" = "$ipaddress" ]; then
echo "IPv6 address unchanged"
exit
fi
#发送新的ipv6地址到dynv6
curl -s -S -f -k "https://dynv6.com/api/update?hostname=$hostname&ipv6=$ipaddress&token=$token"
#缓存当前ip地址到文件
echo $ipaddress > $file
#打印系统日志
logger 监测到设备 $name 的IPv6变更, dynv6 DDNS已完成同步 - 用ssh连接到路由器,对脚本文件添加可执行权限,保存已有的计划任务
1
2
3cd /etc/storage
chmod +x dynv6.sh
crontab -l > dynv6cron - 添加需要进行 DDNS 的设备,每 10 分钟自动执行一次检查。注意!把命令中的
域名
改为你的域名,比如 xxxx.dynv6.net,设备名
自定但必须是英文否则会出错,MAC 地址
要求按照带有冒号分隔符的格式,例如xx:xx:xx:xx:xx:xx
1
2
3
4
5
6
7
8
9
10
11
12#参数格式说明:./dynv6.sh [模式] [域名] [设备名] [MAC地址]
cat >> dynv6cron <<EOF
#添加路由器的DDNS
*/10 * * * * /etc/storage/dynv6.sh router 域名
#添加下级设备的DDNS
*/10 * * * * /etc/storage/dynv6.sh neigh 域名 设备名 MAC地址
# ......
EOF
#可以添加多个设备,每一行对应一个设备
#举例如下
#*/10 * * * * /etc/storage/dynv6.sh router xxx.dynv6.net
#*/10 * * * * /etc/storage/dynv6.sh neigh xxxx.dynv6.net phone 11:22:33:aa:bb:cc - 启动计划任务
1
crontab dynv6cron
- 在 Padavan 的后台管理页找到
高级设置
->自定义设置
->脚本
->在 WAN 上行/下行启动后执行
中添加以下命令,就可以在重启路由后立即更新地址。1
2
3
4#对于路由器
/etc/storage/dynv6.sh router 域名
#或者是下级设备
/etc/storage/dynv6.sh neigh 域名 设备名 MAC地址使用邮件的方式获得当前 IPV6 地址
在搜集相关问题时,看到了这篇 《IPV6网络下建立安全的家庭服务器[NAS]》 ,其中
在 ipv6 下,由于不再只分配一个 ip 地址,而是一下子给了你海量的 ipv6 地址,这就形成了天然的安全屏障。大家都知道,要尝试对某个家庭服务器发起攻击尝试,首要的条件就是知道对方的服务器地址。
最大的安全是什么,你的服务器 ipv6 地址只有你自己知道,如果你不对家庭服务器捆绑 DDNS(动态域名),那么有心人即使知道了你家宽带今天 ipv6 的 64 位前缀,为了尝试获得服务器的真实 ipv6 地址,它需要对 16 亿亿个 ipv6 地址进行扫描,再牛的黑客,没有几年的时间是无法完成的。而你的 ipv6 地址一般每 3 天更换一次前缀,意味着黑客必须在 3 天内完成 16 亿亿个有效扫描,这是无法完成的任务。
而如果你捆绑了动态域名,这就好比直接打开了你家 ipv6 网络的一道门,任何人只要知道你的动态域名,根本不需要扫描,就可以直接知道你服务器的 ipv6 地址,然后进行攻击尝试。
由于家庭服务器,一般只为有限的家庭成员提供服务,因此服务器地址只需要家人能够解析就可以,因此通过服务器端发送邮件,用户直接在软件里自动通过电子邮件进行解析的方式,可以极大的保护建立在动态 ipv6 地址上的家庭服务器不被泄漏。
使用这种方式,黑客要获取服务器 ipv6 地址,就必须尝试获取邮件,而电子邮箱由于是需要用户名和口令才能登录,而破解大公司的邮箱服务器口令和用户名是非常非常的困难。也就是通过电子邮件解析服务器地址的方法,对比使用动态域名,多了一道由电子邮箱提供的安全防火门,让你家的服务器 ip 地址真正大隐隐于市了。
总结一下就是,使用 DDNS 域名一旦泄露被公布在互联网上,受到精准攻击的风险就会上升,因此直接使用动态变化的 IP 会安全一些。当然这只是针对自家家用用途,如果要对外提供服务还得上 DDNS。(下级设备可以使用 DHCPv6 stateful 有状态分配 ip,不推荐 EUI64 地址)
自动发送新的 IP 到指定邮箱
- 用winscp在路由器中的/etc/storage目录下,新建一个文件名为mailuip.sh的文本文件,复制脚本内容如下,务必填写SMTP的配置信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80#!/bin/bash -e
#脚本使用方法
#./mailuip.sh [mode] [name] [mac]
#SMTP配置 #(例子)
#SMTP服务器#smtpserver=smtp.126.com
#邮箱账号#fromaddress=xxxxxx@126.com
#邮箱密码fromaddresspwd=xxxxxxxxxxxxx
#收件人信息#toaddress=xxxxxx@qq.com 多个收件人用英文逗号分隔
#SMTP配置
smtpserver=
fromaddress=
fromaddresspwd=
toaddress=
#参数配置
mode=$1
name=${2:-'Router'}
mac=$3
#有必要的话更改网络设备名
device=ppp0
#模式选择错误处理
if [ "$mode" != "router" -a "$mode" != "neigh" ]; then
echo "please select router or neigh mode"
exit
fi
#neigh模式处理下级设备IP
if [ "$mode" = "neigh" ]; then
if [ -z $mac ]; then
echo "mac is empty"
exit
fi
mac=$( echo $mac | tr '[A-Z]' '[a-z]' )
file=$HOME/.mailuip.neigh.$name
[ -e $file ] && old=`cat $file`
#获得下级设备的ip
macinf=$(echo $mac | tr '[A-Z]' '[a-z]' | awk -F ':' '{print $5$6}' )
ipaddress=$(ip -6 neighbor | grep $mac | grep -v $macinf | grep -v 'fe80' | awk '{print $1}')
#router模式处理路由器IP
else
file=$HOME/.mailuip.router
[ -e $file ] && old=`cat $file`
#获取ip地址
ipaddress=$(ip -6 addr list scope global $device | grep "global" | sed -n 's/.*inet6 \([0-9a-f:]\+\).*/\1/p')
fi
#判断ip地址是否存在
if [ -z "$ipaddress" ]; then
echo "no IPv6 address found"
exit 1
fi
#检查地址是否改变
if [ "$old" = "$ipaddress" ]; then
echo "IPv6 address unchanged"
exit
fi
mailtxt=$HOME/.mail.$name
sdate=`date +%Y年%m月%d日%t%H:%M:%S`
#写好邮件
cat > $mailtxt <<EOF
From:${fromaddress}
To:${toaddress}
Subject:IP发生变更,打开查看详情
系统于 ${sdate} 检测到设备:${name} 的IP已发生变更!
新的IP为 ${ipaddress}
EOF
#发送邮件
sendmail -f $fromaddress -t $toaddress -S $smtpserver -au$fromaddress -ap$fromaddresspwd < $mailtxt
#缓存当前ip地址到文件
echo $ipaddress > $file
#打印系统日志
logger 监测到设备 $name 的IPv6变更,已邮件通知 $toaddress - ssh连接到路由器,添加mailuip,sh的可执行权限,保存之前的计划任务
1
2
3cd /etc/storage
chmod +x mailuip.sh
crontab -l > mailcron - 添加需要发送 ip 的设备,每 10 分钟自动执行一次检查。注意!
设备名
自定但必须是英文否则会出错,MAC 地址
要求按照带有冒号分隔符的格式,例如xx:xx:xx:xx:xx:xx
1
2
3
4
5
6
7
8
9
10
11
12#参数格式说明:./mailuip.sh [模式] [设备名] [MAC地址]
cat >> mailcron <<EOF
#添加路由器
*/10 * * * * /etc/storage/mailuip.sh router
#添加下级设备
#可以添加多个设备,每一行对应一个设备
*/10 * * * * /etc/storage/mailuip.sh neigh 设备名 MAC地址
# ......
EOF
#对于下级设备举例如下,注意空格不能丢
#*/10 * * * * /etc/storage/mailuip.sh neigh iphone 11:22:33:aa:bb:cc
#*/10 * * * * /etc/storage/mailuip.sh neigh mypc ee:ff:gg:11:22:33 - 启动计划任务
1
crontab mailcron
- 在 Padavan 的后台管理页找到
高级设置
->自定义设置
->脚本
->在 WAN 上行/下行启动后执行
中添加以下命令,就可以在重启路由后立即发送最新 IP 地址。1
2
3
4#对于路由器
/etc/storage/mailuip.sh router
#或者是下级设备
/etc/storage/mailuip.sh neigh 设备名 MAC地址END
记一下编辑脚本时遇到的问题
在 windows 下的换行与 Linux 的换行不同,互不兼容,这就导致在 windows 记事本中编辑过的 shell 脚本,放在 Linux 下无法运行。最后处理方法是用 VS Code 打开,点击右下角CRLF
,选择行尾序列,改为LF
保存即可。
参考
家用宽带的 IPv6 配置: https://lwz322.github.io/2019/07/25/IPv6_Home.html
V2EX › 宽带症候群 如何远程找到家里设备的 IPV6 地址?: https://www.v2ex.com/t/592571
知乎-IPV6 网络下建立安全的家庭服务器[NAS]: https://zhuanlan.zhihu.com/p/75247811
老毛子华硕 Padavan 外网 IP 变化自动发送邮件脚本 Padavan 添加 shell 脚本: https://aisoa.cn/post-2506.html
dynv6.com official update script: https://gist.github.com/corny/7a07f5ac901844bd20c9
V2EX › 宽带症候群 家庭宽带 私设 web 被检测 魔都电信被停宽带: https://v2ex.com/t/608821?p=1
V2EX › 宽带症候群 应对家宽 Web 的收紧,讨论一下在外网控制家庭设备的方案: https://v2ex.com/t/635028#reply63