首次发帖,请各位多多指教由于经常外出办公, 微软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 基础, 百度找了实现一点点功能的命令, 结合上述脚本的内容, 在该脚本加了几句, 以实现我的思路
- #!/bin/sh -e
- hostname=xxxx.dynv6.net
- token=xxxxxxxxxxxxxxxxxx
- device=br-lan
- file=$HOME/.dynv6.addr6
- [ -e $file ] && old=`cat $file`
- if [ -z "$hostname" -o -z "$token" ]; then
- echo "Usage: your-name.dynv6.net <your-authentication-token> [device]"
- exit 1
- fi
- if [ -z "$netmask" ]; then
- netmask=128
- fi
- if [ -n "$device" ]; then
- device="dev $device"
- fi
- address=$(ip -6 addr list scope global $device | grep -v " fd" | sed -n ‘s/.*inet6 \([0-9a-f:]\+\).*/\1/p’ | head -n 1)
- if [ -e /usr/bin/curl ]; then
- bin="curl -fsS"
- elif [ -e /usr/bin/wget ]; then
- bin="wget -O-"
- else
- echo "neither curl nor wget found"
- exit 1
- fi
- if [ -z "$address" ]; then
- echo "no IPv6 address found"
- exit 1
- fi
- # address with netmask
- current=$address/$netmask
- if [ "$old" = "$current" ]; then
- echo -e "IPv6 address unchanged\n"
- fi
- # send addresses to dynv6
- $bin "http://dynv6.com/api/update?hostname=$hostname&ipv6=$current&token=$token"
- # save current address
- echo $current > $file
- echo `date` $current >> ./ddns-runtime.txt
- prefix=${current%%::*}
- dev1="20"
- dev2="8"
- address1=$prefix"::"$dev1"/128"
- address2=$prefix"::"$dev2"/128"
- #hostname
- hostname1="xxxxx1.dynv6.net"
- hostname2="xxxxx2.dynv6.net"
- #send to dynv6.com
- $bin "http://dynv6.com/api/update?hostname=$hostname1&ipv6=$address1&token=$token"
- $bin "http://dynv6.com/api/update?hostname=$hostname2&ipv6=$address2&token=$token"
- #output hostname and address
- echo "hostname1="$hostname1 "address1="$address1 >> ./ddns-runtime.txt
- echo "hostname2="$hostname2 "address2="$address2 >> ./ddns-runtime.txt
- 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