OpenWrt iStoreOS X-WRT 配置 IPv6 NAT6

OpenWrt iStoreOS X-WRT 配置 IPv6 NAT6

为什么要使用NAT6?

通常情况下,IPv6为每个设备都配备了公网IPv6地址。公网IPv6地址数量很多,黑客用枚举法一时半会儿扫不进来。但是,随着量子计算机的发展,未来这一优势将会进一步减弱。

在缺乏网络安全管理的家庭、中小企业中,通常会使用IPv6进行外网远程访问,一些设备由于系统精简、年份较老,如果没有配置好详细的防火墙规则,就会被黑客扫描破解。在量子计算机发展普及的将来,这些攻击将会变得轻而易举。

IPv6在正式普及用起来之前,反而算是一片攻击者的蓝海。

为了提高安全性,同时兼具IPv6升级,我们可以考虑在IPv6网络中使用NAT技术。

此外,一些地区的宽带拨号后没有下发DHCPv6-PD前缀信息,而是直接下发64位IPv6地址,路由器无法分配IPv6地址(当然可以把IPv6相关选项设置成relay模式,但获取的IPv6地址不是你路由器分配的)。

OpenWrt系统配置NAT6

1、安装并更新软件包。

1
2
3
opkg update
opkg install ip6tables
opkg install kmod-ipt-nat6

这几个包通常是默认安装的。

2、修改ULA前缀。

这个在IPv6中近似于IPv4的LAN口内网地址。

默认情况下,iStoreOS、X-WRT等系统在第一次启动时会随机生成好ULA前缀,因此我们可以直接跳到第3步。

修改/etc/config/network文件中的ula_prefix,如果已有内容,无需修改,直接:q退出。

1
vi /etc/config/network
1
2
config globals 'globals'
option ula_prefix 'fd38:eb73:c847::/48'

如果此时重启网络或OpenWrt系统,下联的设备会获取到ULA前缀开头的64位和128位IPv6地址。

3、配置DHCPv6。

这步千万不能省!!!!!!!

修改/etc/config/dhcp文件中lan口的DHCPv6配置,如果已有多余的内容,建议从option dhcpv6开始删除替换。

1
vi /etc/config/dhcp
1
2
3
4
5
6
7
8
9
10
config dhcp 'lan'
option interface 'lan'
option start '100'
option limit '150'
option leasetime '12h'
option dhcpv4 'server'
option dhcpv6 'server'
option ra 'server'
option ra_management '1'
option ra_default '1'

建议从第六行就开始覆盖替换,别自作聪明,直接在浏览器里面用LuCI修改,太强大了你把持不住的。千万别开混合模式。

4、打开IPv6 NAT。

默认情况下,X-WRT在“网络->防火墙->NAT 规则”里面配置好一条名为“nat6”的规则,默认没有启用,我们勾选“启用”,然后点击页面下方的“保存并应用”即可完成配置。

还有些系统,支持FullCone NAT6,虽然支持有限,但建议开启。

其它系统需要修改/etc/firewall.user脚本,自定义防火墙规则。

方法一:http://路由器的IP地址/cgi-bin/luci/admin/network/firewall/custom

方法二:vi /etc/firewall.user

1
2
3
WAN6=这里填写IPv6 WAN6口的网卡名称,如eth0
LAN=这里填写LAN口的网卡名称,一般就填br-lan
ip6tables -t nat -A POSTROUTING -o $WAN6 -j MASQUERADE

安全起见,下面两条不建议添加,基本不影响使用:

1
2
ip6tables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
ip6tables -A FORWARD -i $LAN -j ACCEPT

5、正确配置网关。

这是本文的重点。

在路由器上看一下自己的默认网关。

1
ip -6 route show default
1
2
default from 2409:8a6c:5722:daf1::52c via fe80::213:32ff:fe09:216d dev eth0 proto static metric 512 pref medium
default from 2409:8a6c:5722:daf1::/64 via fe80::213:32ff:fe09:216d dev eth0 proto static metric 512 pref medium

如果获得的是这样坑爹的网关,在转发NAT包的时候会有问题,需要创建一个脚本/etc/hotplug.d/iface/99-ipv6,把去掉from 2409:8a6c:5722:daf1::52c这一部分的以后的默认路由添加到路由表中。

1
vi /etc/hotplug.d/iface/99-ipv6

网上的教程中,基本上都只获取到一个IPv6地址,如SLAAC或DHCPv6无状态,然而我这边有两个IPv6地址,如DHCPv6有状态+无状态,即使上级路由也有ULA前缀,但实际上网关地址都相同,这回使获取到的信息重复,从而配置无效。用网上的脚本都会出现这个问题 ,自己手动添加路由又正常,就是这个原因导致的。

下面的脚本我已经修改过,只会使用获取到的第一个IPv6地址的网关地址及信息,均测试有效

第一种:

1
2
3
#!/bin/sh
[ "$ACTION" = ifup ] || exit 0
ip -6 route add `ip -6 route show default|sed -e 's/from [^ ]* //'|sed -n '1p'`

第二种:

1
2
3
#!/bin/sh
[ "$ACTION" = ifup ] || exit 0
route -A inet6 add default gw `(ip -6 route | grep default | awk '{print $5,$6,$7}' | sed -n '1p')`

设置权限:

1
chmod +x /etc/hotplug.d/iface/99-ipv6

6、重启路由器使配置生效。

1
reboot

7、开启IPv6 DNS解析。

默认情况下,X-WRT已经开启IPv6 DNS解析。

其它系统需要浏览器访问http://路由器的IP地址/cgi-bin/luci/admin/network/dhcp ,点击高级设置,取消“禁止解析 IPv6 DNS 记录”,然后点击页面下方的“保存并应用”。

8、测试。

http://[上一层的IPv6网络设备地址]

http://ch.test-ipv6.com/

http://ipv6-test.ch/

如果ipv6-test已出IPv4地址,5秒内未出IPv6地址,那么基本上失败,不用继续等待。

如果第5步网关配置错误,会表现为上一层的IPv6网络设备正常访问,上上层的网络设备(公网)无法访问,ipv6-test失败。

这种情况可以尝试更改/etc/hotplug.d/iface/99-ipv6文件sed -n '1p'中的1

正常情况下,ipv6-test应该可以正常(10/10)通过,显示的 IPv6 地址为上级路由的 IPv6 地址。

不过这个IPv6的NAT目前还有一些问题,而且相关问题和应用开发的积极性不高,毕竟这与IPv6要消除NAT的初衷相悖,不过对于多线聚合等应用还是有一定意义。相信以后随着IPv6的普及和大佬的进一步研究,以及在企业等大型公共网络中的部署,肯定会出现更完善甚至更独特的解决方案。

参考:

https://openwrt.org/docs/guide-user/network/ipv6/ipv6.nat6

https://tang.su/2017/03/openwrt-ipv6-nat/

https://www.jianshu.com/p/2a5e0ba31835