坑边闲话:IPv6 是一个很老但是又很新的技术,它已经发布很多很多年了,但是它至今没有完全普及。在某些 IPv4 地址特别多的发达国家,你甚至看不到 IPv6 的影子。而在另一些特殊场景,ISP 不愿意给用户分配 IPv6 前缀,而只是分配一个简单的 IPv6 地址。这导致内网里的 IPv6 分配出现麻烦。一种可行的解决方式就是对 IPv6 开 NAT. 然而,这并不是一个优美的做法

1. 查询路由器的默认 IPv6 网关·

首先通过命令 ip -6 route 获取路由器的 default 网关,也就是你路由器的上一级路由器的地址,即下面的 fe80::7625:8aff:fe0e:b250 dev eth2.

1
2
3
root@OpenWrt:~# ip -6 route | grep default
default from 2400:dd01:103a:4008::/64 via fe80::7625:8aff:fe0e:b250 dev
root@OpenWrt:~#

然后将上面查询得到的默认网关设置为当前 NAT6 模式下的默认网关。运行命令如下:

1
route -A inet6 add default gw fe80::7625:8aff:fe0e:b250 dev eth2

记住,这里的地址要写你查询出来的那个地址,eth2 也同样如此。

2. 防火墙配置·

修改文件 /etc/user.firewall,在该文件尾部添加下面这一行。

1
ip6tables -t nat -A POSTROUTING -o eth2 -j MASQUERADE

3. 设置 LAN 口 DHCP·

修改文件 /etc/config/dhcp 如下

1
2
3
4
5
6
7
8
9
config dhcp 'LAN'
option interface 'LAN'
option start '2'
option limit '120'
option leasetime '12h'
option ra 'server'
option dhcpv6 'server'
option ra_default '1'
option ra_management '2' # 有状态

4. 修改网络配置·

修改文件 /etc/config/network 如下:

1
2
3
config globals 'globals'
option ula_prefix 'fd00:2222:6666:8888::/64'
option packet_steering '1'

有的 OpenWRT 发行版,如 eSir 的高大全版本,会把 ULA 前缀删掉,我们需要在 /etc/config/network 里面把这个选项加回来。如果本来就有,可直接在 luci 界面里修改。

总结·

上述 5 个步骤缺一不可,每个配置项都是必须的。

如果还是无法上网,可以尝试更改自己的 DNS 服务器。

最后,本人十分痛恨 NAT 技术,但是无奈 native 的 IPv6 在我的环境下并不稳定,故不得已开启了 NAT6. 而 NAT6 的端口转发颇为复杂,有内网穿透需求的用户,在这种场景下可能左右为难。