「捯饬记录」配置一下Padavan的IPV6动态域名解析

记录时间: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获取,除了发送邮件外不会连接任何第三方服务器。

  1. 什么方法都可以,只要把脚本文件放进路由器即可,这里以简单的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已完成同步
  2. 用ssh连接到路由器,对脚本文件添加可执行权限,保存已有的计划任务
    1
    2
    3
    cd /etc/storage
    chmod +x dynv6.sh
    crontab -l > dynv6cron
  3. 添加需要进行 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
  4. 启动计划任务
    1
    crontab dynv6cron
  5. 在 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 到指定邮箱

  1. 用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
  2. ssh连接到路由器,添加mailuip,sh的可执行权限,保存之前的计划任务
    1
    2
    3
    cd /etc/storage
    chmod +x mailuip.sh
    crontab -l > mailcron
  3. 添加需要发送 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
  4. 启动计划任务
    1
    crontab mailcron
  5. 在 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