IPv6 DDNS 自动更新脚本(Dynv6) 路由器为其他设备更新DDNS

本帖最后由 YiSary 于 2021-9-15 21:34 编辑

首次发帖,请各位多多指教由于经常外出办公, 微软RDP的使用频率较高. 微软RDP的优点很明显: 占用带宽低, 稳定性强, 兼容性强.
但是对我来讲, 也有一个很明显的缺点: 官方不提供服务器以实现远程访问.  之前是使用 内网穿透实现的远程访问,但是带宽和流量限制了使用体验(我用的免费版花生壳,和哲西云 分别是 1Mbps, 1GB ;4Mbps, 1GB)
家里移动宽带已经部署了IPv6, 分配了60位前缀, 手上有大把的IPv6资源; 然后客户端设备一般是手机, 手机(非物联网卡)都已经部署了IPv6, 那么我可以通过IPv6实现公网访问.
思路如下
家庭网络 为 中国移动光猫桥接至PandoraBox路由器, 该路由器拨号, 另一台路由器OpenWrt 作为AP和五口交换机, 接有我工作学习用的电脑, 和一台装有ESXI的主机(双网卡,三网口)
准备在ESXI主机中部署NAS和Windows以及Ubuntu. 其中这些设备都得上公网. IPv6前缀60位, 公网IPv6地址多了非常多. 但是路由器每次拨号都会变化IPv6和内网IPv4地址. 因此需要DDNS实现任意时刻公网访问内网
DDNS的思想是该设备将本机设备发送至DDNS的服务商, 路由器可以轻松实现该功能, 但是目前还没有找到比较方便的方法实现Windows等其他设备自动更新IPv6地址
(注, 由于IPv4资源匮乏 , 使用了NAT, 即使家宽拨到了IPv4的公网, 也是32位子网掩码, 也就是一个公网IP地址, 大部分人的情况是路由器开启 多对一的NAT Server , 也就是端口映射,但是IPv6就不一样了,IP地址多到一台设备可以有多个Ipv6, RA和DHCPv6获取到的都是公网,其中RA是设备用随机的或者自己的MAC地址加上IPv6前缀合成一个IP地址, DHCPv6的原理和DHCP类似, 用前缀+随机/顺序数合成一个; 例如 2409:1234::1,  2409:1234::2,  2409:1234::3. DHCPv
6服务器可以是OpenWrt路由器或者PandoraBox路由器, 那么我们可以通过更改路由器的DHCP实现固定设备后缀) 设置如图1 所示  (为保护个人信息安全,MAC地址和IPv6前缀已抹去).

图1 PandorBox路由器web网管界面

IPv6地址的后缀固定住了, 既然路由器可以7*24H运行,而且路由器知道各种设备的地址, 为什么不用路由器更新其他设备的地址呢
这就是我的思路
那么现在应该想办法实现, 路由器更新其他设备IPv6地址的脚本
以Dynv6为例 (Dynv6是一个免费二级域名DDNS提供商)
Linux设备更新自身IPv6的脚本已经有了(特别鸣谢 KoolShare论坛 lupos208 用户 的脚本和思路  原帖https://koolshare.cn/thread-158240-1-1.html )
我没有Linux 基础, 百度找了实现一点点功能的命令, 结合上述脚本的内容, 在该脚本加了几句, 以实现我的思路

  1. #!/bin/sh -e
  2. hostname=xxxx.dynv6.net
  3. token=xxxxxxxxxxxxxxxxxx
  4. device=br-lan
  5. file=$HOME/.dynv6.addr6
  6. [ -e $file ] && old=`cat $file`
  7. if [ -z "$hostname" -o -z "$token" ]; then
  8.           echo "Usage: your-name.dynv6.net <your-authentication-token> [device]"
  9.             exit 1
  10. fi
  11. if [ -z "$netmask" ]; then
  12.           netmask=128
  13. fi
  14. if [ -n "$device" ]; then
  15.           device="dev $device"
  16. fi
  17. address=$(ip -6 addr list scope global $device | grep -v " fd" | sed -n ‘s/.*inet6 \([0-9a-f:]\+\).*/\1/p’ | head -n 1)
  18. if [ -e /usr/bin/curl ]; then
  19.           bin="curl -fsS"
  20.   elif [ -e /usr/bin/wget ]; then
  21.             bin="wget -O-"
  22.     else
  23.               echo "neither curl nor wget found"
  24.                 exit 1
  25. fi
  26. if [ -z "$address" ]; then
  27.           echo "no IPv6 address found"
  28.             exit 1
  29. fi
  30. # address with netmask
  31. current=$address/$netmask
  32. if [ "$old" = "$current" ]; then
  33.           echo -e "IPv6 address unchanged\n"
  34. fi
  35. # send addresses to dynv6
  36. $bin "http://dynv6.com/api/update?hostname=$hostname&ipv6=$current&token=$token"
  37. # save current address
  38. echo $current > $file
  39. echo `date` $current >> ./ddns-runtime.txt
  40. prefix=${current%%::*}
  41. dev1="20"
  42. dev2="8"
  43. address1=$prefix"::"$dev1"/128"
  44. address2=$prefix"::"$dev2"/128"
  45. #hostname
  46. hostname1="xxxxx1.dynv6.net"
  47. hostname2="xxxxx2.dynv6.net"
  48. #send to dynv6.com
  49. $bin "http://dynv6.com/api/update?hostname=$hostname1&ipv6=$address1&token=$token"
  50. $bin "http://dynv6.com/api/update?hostname=$hostname2&ipv6=$address2&token=$token"
  51. #output hostname and address
  52. echo "hostname1="$hostname1  "address1="$address1 >> ./ddns-runtime.txt
  53. echo "hostname2="$hostname2  "address2="$address2 >> ./ddns-runtime.txt
  54. echo -e "\ncomplete\n"

复制代码

其中,hostname是在Dynv6注册的域名, token就是token ,然后前边的都是照抄的, 后面的才是更新其他设备的命令, 我使用了两台设备举例,分别是后缀20的Windows电脑和后缀为8的ESXI服务器, device为接口.
使用该脚本需要如下参数: [1.路由器域名  2.Token 3.接口名(PandoraBox为Br-lan, 具体的ifconfig看看就知道了,找有公网IPv6的接口) 4.设备1的域名 设备1后缀 5.设备2的域名 设备2后缀 ] 可以根据需要复制粘贴改序号实现更多设备更新IPv6
运行效果如下
路由器SSH如图2 所示

图2 路由器运行该脚本结果图







运行时间和更新的IPv6地址记录如图3 所示

图3 路由器运行该脚本后输出的运行时间和IP地址图

Dynv6控制台如图4 所示

图4 Dynv6控制台如图所示




手机4G网络公网访问RDP界面如图5 所示

图5  RDP

班门弄斧,如有不完善的地方,请多多指教

感谢您的支持与阅读

现在我不打算用一台设备更新所有设备的IPv6 DDNS地址了,放一下Windows 的脚本

for /f %%i in (‘curl "http://ip.zxinc.org/getip" ‘) do curl "http://dynv6.com/api/update?hostname=这里填你的域名&ipv6=%%i/128&token=这里填你的token"


原文链接:https://www.right.com.cn/forum/thread-4041933-1-1.html

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享