关于软路由ipv6与外网访问的那些事(已更新)
https://koolshare.cn/thread-165156-1-1.html
(出处: KoolShare)
我是快乐的搬运工!
动态解析LEDEipv6
目前为止,三大运营商提供的ipv6地址前缀每隔几天都会变动,因为每隔几天都会网络都会重启一次,重启意味着要重新分配ipv6前缀。虽然直接访问ipv6可以连接到设备,但是一旦网络重启就无法连接了。所我们需要ipv6的ddns解析。
同样首先要申请一个域名,如果你要同时使用frp穿透和ipv6访问,那么你需要重新申请一个域名。
申请好域名后,在lede酷软中心下载koolshare动态域名解析工具.
安装后进入设置
如图设置,主域名填写你申请好的域名,如xxxxx.com,子域名可以自己随便填写,比如lede,那么你将会通过lede.xxxxx.com访问路由器.
校验码获取方式以万网为例,登录进入万网,点击个人头像,如图
点击会进入如下界面
如果你是新用户,以前没有创建过key,那这个界面应该是空的,你需要创建一个。
Accesskey id对应校验码1,access key secret对应校验码2。填到上面插件中,接口类型选择ipv6,点击应用并保存。
此时,还需要在万里面对域名进行解析。
进入万网域名解析,选择刚刚申请的域名,添加解析
Ipv6的记录类型要选择AAAA,主机记录里就是你刚刚在路由里填的子域名,下面记录值你需要随便输入一个ipv6,其它默认。点击确定。
然后在路由动态域名解析工具里点击手动更新,此时你再看看你的域名记录值你会发现他已经变成你路由的ip地址了。2409前缀是目前中国移动ipv6前4位,中国电信应该是240e,中国联通应该是2400
打开的浏览器,在地址栏输入域名lede.xxxxx.com,你会惊喜的发现你已经可以进入lede后台了。开心吗?爽吗?是不是已经觉得万事大吉了?No! No! No!
这只是在内网环境下可以通过域名访问了,我们要的结果是在外网也能访问。如果测试呢?
打开LEDE防火墙
接下来我教大家设置防火墙
依次进>网络>防火墙,点击通信规则往下拉,你需要打开路由器的80端口。
添加,保存并应用。确保如下图所示:
以上设置全部完成后,再次在手机4G环境下输入域名,你会惊奇的发现你已经可以通过ipv6进入路由器后台了。
群晖动态解析ipv6
- 确定你的群晖已经获取到ipv6地址.
红框里面的两个为移动分配的公网ipv6地址,其中一个临时的。
- 同样的由于ipv6会动态更新,此时就还是需要阿里云的ddns。Lede有ddns插件来实现,而群晖没有,我们需要一个ddns脚本,然后添加到群晖的定时任务里。该脚本来自于网络,感谢脚本原作者,向原作者致敬!保存为aliyun.sh!!!
#!/bin/sh
aliddnsipv6_ak="XXXXXXXXXXX"
aliddnsipv6_sk="XXXXXXXXXXX"
aliddnsipv6_name1='nas'
aliddnsipv6_domain='XXXX.cn'
aliddnsipv6_ttl="600"
if [ "$aliddnsipv6_name1" = "@" ]
then
aliddnsipv6_name=$aliddnsipv6_domain
else
aliddnsipv6_name=$aliddnsipv6_name1.$aliddnsipv6_domain
fi
now=`date`
die () {
echo $1
}
ipv6s=`ip addr show eth0 | grep "inet6.2409" | awk '{print $2}' | awk -F"/" '{print $1}'` || die "$ipv6"
for ipv6 in $ipv6s
do
#ipv6 = $ipv6
break
done
echo $ipv6
current_ipv6=`nslookup -query=AAAA $aliddnsipv6_name 2>&1`
#echo $current_ipv6
current_ipv6=`echo "$current_ipv6" | grep 'Address: ' | tail -n1 | awk '{print $NF}'`
echo $current_ipv6
if [ "$?" -eq "0" ]
then
current_ipv6=`echo "$current_ipv6" | grep 'Address: ' | tail -n1 | awk '{print $NF}'`
echo $current_ipv6
if [ "$ipv6" = "$current_ipv6" ]
then
echo "skipping"
fi
# fix when A record removed by manual dns is always update error
else
unset aliddnsipv6_record_id
fi
timestamp=`date -u "+%Y-%m-%dT%H%%3A%M%%3A%SZ"`
urlencode() {
# urlencode <string>
out=""
while read -n1 c
do
case $c in
[a-zA-Z0-9._-]) out="$out$c" ;;
*) out="$out`printf '%%%02X' "'$c"`" ;;
esac
done
echo -n $out
}
enc() {
echo -n "$1" | urlencode
}
send_request() {
local args="AccessKeyId=$aliddnsipv6_ak&Action=$1&Format=json&$2&Version=2015-01-09"
local hash=$(echo -n "GET&%2F&$(enc "$args")" | openssl dgst -sha1 -hmac "$aliddnsipv6_sk&" -binary | openssl base64)
curl -s "http://alidns.aliyuncs.com/?$args&Signature=$(enc "$hash")"
}
get_recordid() {
grep -Eo '"RecordId":"[0-9]+"' | cut -d':' -f2 | tr -d '"'
}
query_recordid() {
send_request "DescribeSubDomainRecords" "SignatureMethod=HMAC-SHA1&SignatureNonce=$timestamp&SignatureVersion=1.0&SubDomain=$aliddnsipv6_name&Timestamp=$timestamp&Type=AAAA"
}
update_record() {
send_request "UpdateDomainRecord" "RR=$aliddnsipv6_name1&RecordId=$1&SignatureMethod=HMAC-SHA1&SignatureNonce=$timestamp&SignatureVersion=1.0&TTL=$aliddnsipv6_ttl&Timestamp=$timestamp&Type=AAAA&Value=$(enc $ipv6)"
}
add_record() {
send_request "AddDomainRecord&DomainName=$aliddnsipv6_domain" "RR=$aliddnsipv6_name1&SignatureMethod=HMAC-SHA1&SignatureNonce=$timestamp&SignatureVersion=1.0&TTL=$aliddnsipv6_ttl&Timestamp=$timestamp&Type=AAAA&Value=$(enc $ipv6)"
}
#add support */%2A and @/%40 record
if [ "$aliddnsipv6_record_id" = "" ]
then
aliddnsipv6_record_id=`query_recordid | get_recordid`
#echo '-----------------' $aliddnsipv6_record_id
fi
if [ "$aliddnsipv6_record_id" = "" ]
then
aliddnsipv6_record_id=`add_record | get_recordid`
echo "added record $aliddnsipv6_record_id"
else
update_record $aliddnsipv6_record_id
echo "updated record $aliddnsipv6_record_id"
fi
-
该脚本需要根据实际情况来改几处地方.
用notepad++软件打开脚本,前文中提到的阿里云里的Accesskey id对应Key1,access key secret对应Key2,代替图中的XXXXXX,第4行引号内填写你的子域名,
如我的为nas,第5行domain引号内填写你的域名,如XXXX.com,这样你将来访问nas的域名就是:nas.XXXX.com
第21行 eth0为你的群晖网卡名,请确认是否为eht0,如果不是请更换为你的网卡名。
如何确认自己的群晖网卡名呢?
我们打开群晖的控制面板,左边拉到最下面,点开终端机和SNMP,启用SSH,打勾,然后应用保存。
接下来用ssh工具,如putty,xshell等工具,登入群晖后台ip,这里的ip是ipv4,如我的为192.168.2.187,端口号为22,用户名为你的群晖用户名,密码也是你的群晖密码。进入后输入命令ifconfig,回车就会看到你的网卡名称。如图:
再接下来,同样是21行的2409替换为你的ipv6前缀4位,在上图中可以看到。如果是中国移动的宽带这里就无需再变更。
这样脚本就修改完毕。
改完别忘了将你的群晖ssh关闭,这是为了安全!安全第一!安全第一!
- 在阿里云控制台里再添加一条域名解析,注意:还是用之前申请的域名,无需重新买域名.
记录类型 同样选择AAAA记录
主机记录 里面填写刚刚在脚本里第3行填的了域名,如nas
记录值 里面随便输入一个ipv6地址
添加好后如图所示:
- 以上工作完成好后,我们需要将修改好的脚本添加到群晖的计划任务里面,并且定时运行。将脚本上传至你的群晖的共享文件夹里面。
右键属性,记住(复制)该脚本路径。
打开控制面板—》计划任务—》新增—》计划的任务---》用户自定义的脚本.
任务名称根据自己喜好随便填。
计划根据需要填,我是填的每30分钟运行一次脚本.
关键是下一步,将刚刚复制的脚本路径粘贴在任务设置最下面的框里面。
点击确定,然后再点击一下顶部的运行。如无意外,你阿里云控制台里刚刚添加的域名已经指向你的群晖ipv6。可以打开控制台看看域名解析地址是否已经变更为群晖ipv6。
此时在内网环境下通过域名nas.XXXX.com已经可以访问nas。
LEDE打开群晖防火墙
外网访问还需要在lede里添加相应的防火墙规则。
依次进>网络>防火墙,点击通信规则往下拉,你需要打开5000,5001,5005等端口。
添加后,再点击该防火墙规则的编辑.
进入后里面的选项按照下图设置。端口用空格隔开.
此时,已经可以从拥有ipv6的外网访问群晖了。
拿出你的手机,在4G模式下,在浏览器输入域名nas.XXXX.com,就可以进入nas登录界面了。在手机上下载DS file APP,输入相关域名就可以登入就可以看到你群晖里的共享文件夹,那个速度比内网穿透给力太多了,你可以尽情在外网看你家里的小电影了。