Nas / 自建服务 · 2022年11月11日 0

启用ipv6以及如何做基于ipv6的ddns实现内网设备穿透

通过访问以下网站可以查询自己是否开启了ipv6

https://ip.zxinc.org/ipquery/

ipv6查询

https://ipw.cn/

ipv6地址查询

ipv6的制定是为了解决ipv4不足的问题,ipv6一共有2的128次方地址,这个数字有多大,最经典的形容是我们可以给地球上的每一粒沙子分配一个地址。

把这个数字展开,没有存储设备能存下它们,你可以认为是无限大。

而ipv4地址数量只有43亿,ip数量早已严重不足,催生了nat 网络的发展,一方面通过nat我们可以让许多设备共享一个ip地址,另一方面,nat阻挡了处在不同网络中设备的直连,这也是为什么我们需要zerotier,tailscale内网穿透工具。

ipv4 nat技术本身也提供了一定的安全上的防护,而ipv6不需要nat进行映射,每台设备都是独立的公网ip,所以nat无法提供安全保障了,就需要防火墙来提供

还有就是ipv4能否访问ipv6网络呢,可以是可以,需要对客户端进行特殊配置,安装一些转换工具,操作相对来说比较繁琐,现在绝大部分地区都可以直接使用ipv6了,建议还是开启ipv6。

开启ipv6

以lede/openwrt x86为例,建议大家直接去官网下载https://openwrt.org/zh/downloads

登录openwrt主路由后台,打开网络-接口

如果现在已有wan6,删除它,保存。

重新打开网络-接口,设置lan

ipv6分配长度64

高级设置,使用内置的ipv6勾选

dhcp服务器,ipv6,依次是混合,服务器,混合,无状态+有状态

保存

回到网络-接口-打开wan口的编辑,配置如下:

保存。

会跳转回网络-接口,刷新一下,如果你的运营商支持ipv6,那么网络接口中会多了一个wan6口,这个口有一个很长的ipv6地址,这就是获取到了。

如果你的设置跟我的类似的话就是成功了,现在路由器已经获取到ipv6地址了。

配置局域网设备

打开你的局域网的设备,以windows为例,最好是直接重启电脑。

重启电脑完成后,win键-输入cmd(快捷键Win+R)

输入ipconfig /all

执行后即可查看本地网络,如果获取成功了的话,ipv6那里会有至少4个ip6地址

首选的ipv6地址是固定的,这个地址不怎么会变的,坚决不能泄露,为什么呢

因为ipv6的安全措施之一就是ipv6地址是无限的,在不知道你的ipv6地址的情况下,是无法攻击你的,也没办法跟ipv4一样,通过漫无目的的扫描来找到网络中的设备。

所以,ipv6地址保密本身就是最强的安全措施。

那你要问了,那我访问人家网站,人家不就知道我的ip了么

你再往下看,有许多临时ipv6地址。

打开一个ipv6地址查询网站,比如

https://ip.zxinc.org/ipquery/

会显示你当前的ip,可以看到ipv6地址就是首选的临时ipv6地址,这个地址的有效期非常短

ipv6查询

这也是为什么你会有许多临时ipv6地址,你上网的过程中,机器会随机的使用一个地址作为当前的ipv6地址,每个ipv6地址都有存活期。

也就是说,你访问一个网站,这个网站看到的你的ipv6地址也是一直在变化。

ipv6地址本身就是一个隐私,固定ipv6地址切勿泄露

ipv6 DDNS

但是呢许多朋友用ipv6地址得一个最大需求就是通过ipv6访问自己家庭网络中的设备。

通过ddns解析到自己的内网ipv6设备上,从而实现公网访问。

那我们要解析出来的地址不就是一直变得么,是的,他确实是一直变得,反正是自动的,你管他呢。

但是要想公网访问你的内网设备,是要经过你的路由器得,路由器是自带防火墙的,你要去防火墙上允许它。

openwrt来说,防火墙-通信规则中,从lan到wan是通的,否则无法联网,但是从lan到wan是禁止的

如果想要通过公网ipv6地址访问内网中的设备,是千万不能从这里直接修改转发的,一旦这里的允许wan到lan的转发,那内网的所有设备就彻底暴漏在互联网中了,极其危险。

正确的做法是在通信规则中逐个开放自己想要开放的ip或者端口

openwrt ipv6转发

一旦打开上面得防火墙限制,现在通过访问许可的ipv6地址,就可以访问到指定的设备了,但是刚才讲了,这个ipv6地址会一直变,我们需要ddns,ddns就是动态解析,ipv6变成什么,解析得目标地址就变成什么。

如何做ipv6解析得呢,以阿里云为例,添加AAAA记录,就是指向ipv6地址得

ddns实现

需要有一个脚本时时刻刻检测当前我的访问地址,但是这个问题就大了。

ipv4 nat的话,我们只需要在局域网中某一台设备上执行更新ddns的操作即可,现在每一台设备都是独立的ipv6 ip,这意味着每一个设备都需要单独的ddns操作。

nas,pc,路由器,虚拟机,所有的设备。

DDNS项目

我发现了一个极好的项目:https://github.com/jeessy2/ddns-go/

项目介绍里有完整的使用说明,我就不挨着给大家演示了,简单说一下,一看就懂。

这么来说,大家就能明白了,所有的设备,只要有独立ip,要想被访问它就需要单独的进行dns解析。

对我来说,这样其实是很麻烦的,我期望的方案是只有一台设备做ddns,然后这台设备为其他的局域网服务进行端口转发,这样一方面安全性提高了,另一方面配置起来更容易。

于是我找到了这样一个项目socatg,项目主页

https://gitee.com/drophair/luci-app-socatg

https://github.com/big-tooth/luci-app-socatg/

这个项目的作用就是把局域网的ipv4服务映射到路由的ipv6地址上,就可以完美的实现我们需要的功能了。

可以直接去此网盘下载。

https://pan.baidu.com/s/1GUZKwKfNByt2L1FeP_pVgw?pwd=mcnm
cd /tmp/upload

opkg update

opkg install luci-app-socat.ipk
opkg install luci-i18n-socat-zh-cn.ipk

安装完成后

要想使用,首先要启动服务socat,停止服务也是在这里。

现在就可以把内网服务映射到ipv6,现在我们就可以通过ipv6访问内网服务了。

而ddns就只需要在openwrt上部署自动更新脚本即可。

如何在openwrt上运行ddns,以cloudflare为例

opkg update
opkg install luci-i18n-ddns-zh-cn ddns-scripts-cloudflare bind-host bind-libs ca-certificates

刷新页面

先去Cloudflare做一个dns解析,AAAA就是ipv6解析。

在 Cloudflare 的 API 中,用户名对应 Cloudflare 账户的登录邮箱,密码对应的则是 API Key。
登录 Cloudflare 账户之后,访问 API 令牌页面 https://dash.cloudflare.com/profile/api-tokens 即可在下方看到 API 密钥,在下方的 Global API Key 的右侧点击查看,输入 Cloudflare 账户的密码之后即可获取 API Key。

保存,重新加载查看是否更新到ipv6.

现在就可以通过访问

http://域名:端口

来访问内网服务了,这样最大的好处是不需要在每台内网服务器上配置ddns相关的脚本或者容器,跟ipv4实现了一样的用法