为OpenWrt配置IPv6 NAT

记录配置OpenWrt的IPv6 NAT和DHCP踩过的一些坑。

IPv6好是好,能夜间不断网(本科限定),能逛其他高校的PT站,还能跑满带宽……唯一的缺点就是配置比较棘手。其实本科的时候就已经配过IPv6了,那时候自己还潜伏在某个路由器群里,而且过程还顺利的,没出什么幺蛾子。直到研究生换了个宿舍之后,IPv6就GG了,还得花一周来时间才把各种玄学问题解决。

可能比较有用的一些博客:
https://tang.su/2017/03/openwrt-ipv6-nat/
https://blog.csdn.net/dengxinfa/article/details/103791465

之所以不用IPv6中继,是因为发现只能正常使用一段时间,然后剩下的就是timed out了,当然也有可能是我比较菜。

软件包#

在路由器上安装IPv6 NAT依赖的软件包:

1
2
opkg update
opkg install ip6tables kmod-ipv6 kmod-ipt-nat6 kmod-ip6tables kmod-ip6tables-extra iputils-traceroute6

IPv6地址#

获取IPv6的方法有很多,最简单就是把网线直接插电脑(连客户端都不需要打开),按Win+R输入cmd打开命令行,直接敲ipconfig /all,然后找到IPv6 地址: 2001:250:3000:3cc3:x:x:x:x(不要选临时地址),这就是自己分配到的IPv6地址了。最后的3cc3视宿舍而定,会有不同。

在路由器上,也可以通过将IPv6配置为dhcpv6自动获取。

配置文件#

/etc/config/dhcp#

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
config dnsmasq
option boguspriv '1'
option localise_queries '1'
option local '/lan/'
option domain 'lan'
option expandhosts '1'
option readethers '1'
option leasefile '/tmp/dhcp.leases'
option noresolv '1'
option domainneeded '1'
option authoritative '1'
option rebind_protection '0'
list server '2001:4860:4860::8844'
list server '1.1.1.1'
list server '222.201.130.30'
list server '114.114.114.114'
option logqueries '1'

config dhcp 'lan'
option interface 'lan'
option ra_default '1'
option start '100'
option limit '150'
option leasetime '12h'
option ra 'server'
option dhcpv6 'server'
option ra_management '1'

config dhcp 'wan'
option interface 'wan'
option ignore '1'
option master '1'

主要的改动:

  • config dnsmasq下增加了IPv6的DNS服务器2001:4860:4860::8844
  • config dhcp 'lan'下的radhcpv6serverra_managementra_default1
    其他不知道自己还记不记得了。

/etc/config/network#

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#config globals globals
# option ula_prefix dd00:db80::/48

config interface 'loopback'
option ifname 'lo'
option proto 'static'
option ipaddr '127.0.0.1'
option netmask '255.0.0.0'

config interface 'lan'
option ifname 'eth0'
option force_link '1'
option type 'bridge'
option proto 'static'
option ipaddr '192.168.1.1'
option netmask '255.255.255.0'
option ip6addr 'fc00:100:100:1::1/64'

config interface 'wan'
option ifname 'eth1'
option _orig_ifname 'eth1'
option _orig_bridge 'false'
option proto 'static'
option ipaddr '125.216.*.*'
option netmask '255.255.255.0'
option gateway '125.216.*.254'
option dns '222.201.130.30 222.201.130.33 114.114.114.114 1.1.1.1'

config interface 'wan6'
option _orig_ifname '@wan'
option _orig_bridge 'false'
option ifname '@wan'
option proto 'static'
option ip6addr '2001:250:3000:3cc3:x:x:x:x/64'

config switch
option name 'switch0'
option reset '1'
option enable_vlan '1'

config switch_vlan
option device 'switch0'
option vlan '1'
option ports '0 1 2 3 4'

主要改动:

  • 注释了ula_prefix
  • config interface 'lan'添加option ip6addr,指的是为LAN分配的DHCP地址/64是子网掩码的长度
  • config interface 'wan6'ifname换成@wanoption ip6addr填上面自己分配到的IPv6地址

/etc/hotplug.d/iface/90-ipv6#

没有这个文件的话就新建一个,用于添加IPv6的默认路由。通常可以通过traceroute6 bt.byr.cn的第一跳获得。

1
2
3
#!/bin/sh
[ "$ACTION" = ifup ] || exit 0
route -A inet6 add default gw 2001:250:3000:3cc3::1

最后加个执行权限:chmod +x /etc/hotplug.d/iface/90-ipv6

/etc/firewall.user#

添加一行(eth1替换为自己实际使用的WAN口):

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

/etc/sysctl.conf#

如果文件里面没有的话就加到文件结尾,开启内核转发和DHCP:

1
2
3
4
net.ipv6.conf.default.forwarding=1
net.ipv6.conf.all.forwarding=1
net.ipv6.conf.default.accept_ra=2
net.ipv6.conf.all.accept_ra=2

最后,重启路由器和所有连接到路由器上的设备……

常见问题#

路由器连不上IPv6#

检查自己路由器的IPv6配置,比如/etc/config/network下的WAN口IPv6地址。DNS不能获得IPv6的AAAA记录的,配置一下/etc/config/dhcp/etc/config/network下面的DNS。

路由器IPv6正常,LAN设备连不上IPv6#

如果设备没有分配到一个fc00:100:100:1:x:x:x:x的IPv6地址,说明路由器的IPv6 DHCP没有正常运行。首先检查/etc/sysctl.conf,这个是很多博客没提及到的。在我实际折腾中发现这个文件需要做出修改才能正常通过DHCP获取IPv6地址。然后就是/etc/config/dhcp的LAN口部分。

IPv6的DNS问题,如果设备没有指定DNS地址,则参考路由器连不上IPv6部分,因为DNS解析是转发到路由器的。如果有指定地址,那我只能建议去掉,或者在IPv6那里也手动指定DNS服务器……

IPv6 ping超时或者一般故障,很大概率是NAT的转发问题,看看路由器的防火墙和IPv6的默认网关。路由器的转发规则如果不配置到脚本中的话,一重启就会丢失。

好像差不多了,剩下的事就是烧个香保佑没那么多破事吧。还没有解决的是IPv6的NAT内网穿透的事,不知道能不能像IPv4那样,通过几条iptable命令就能解决。

其他一些杂七杂八的note#

OpenWrt的SSH Key位置:/etc/dropbear/authorized_keys,当初还天真的以为是~/.ssh/authorized_keys

WAN端的以太网速率除了协商之外,其实也是可以自己调整的:ethtool -s eth1 speed 100 duplex full

建议在修改配置文件前,先把原配置文件备份一遍!!!