OpenWRT IPv6 三种配置方式

1. OpenWRT IPv6

科技网或者教育网有原生的IPv6,其他方式例如VPN或者隧道等亦可以获得IPv6网络的访问。本文介绍了如何通过OpenWRT,让接入的终端也可以获得IPv6网络的访问。主要实现方式有以下几种:

  • IPv6 中继
  • IPv6 穿透
  • IPv6 NAT

下文皆假设OpenWRT为初始化配置

2. IPv6 中继

2.1 简介

中继模式可以让接入客户端获取原生的IPv6地址,OpenWRT路由器也获取了一个IPv6地址。如图2-1所示,所有接入的客户端将IPv6流量转发到OpenWRT路由器的IPv6地址,然后OpenWRT路由器再将流量转发到其IPv6网关,同时IPv4的NAT模式不受影响。

图2-1 IPv6中继模式流量示意图

2.2 配置

实现方式

有两种方式可以实现IPv6中继:

  • 6relay,OpenWRT到Barrier Breaker 14.07版本之后,不再支持,不推荐使用
  • odhcpd,OpenWRTBarrier Breaker 14.07版本之后推荐使用,不是很稳定。升级到Chaos Calmer 15.05.1稳定性提高很多,但是IPv6网络仍会偶尔中断
配置文件修改

OpenWRT在默认情况下,会分配一个IPv6私网地址段,登录网页管理,在Network->Interfaces页面底下有Global network options->IPv6 ULA-Prefix这里应该有一个随机的fd开头的/64IPv6地址段,清空该地址并保存

SSH登录路由器,修改/etc/config/dhcp文件,添加如下部分,使用无状态地址自动配置(SLAAC)IPv6,不使用DHCPv6。

1
2
3
4
5
6
7
8
9
10
11
config dhcp 'lan'
option dhcpv6 'disabled'
option ra 'relay'
option ndp 'relay'

config dhcp 'wan6'
option interface 'wan'
option dhcpv6 'disabled'
option ra 'relay'
option ndp 'relay'
option master '1'

修改之后保存,重启odhcpd服务,否则接入终端无法获取IPv6地址

1
/etc/init.d/odhcpd restart
配置保存

这种方式可以让接入路由器的终端,获取原生的IPv6地址。需要注意的是,每次路由器重启上述配置并不会生效,需要重启下odhcpd服务,接入路由器的终端方可获取IPv6地址。

可以在开机启动脚本/etc/rc.local中添加如下脚本,每次开机系统启动30秒后重启odhcpd服务

1
2
sleep 30
/etc/init.d/odhcpd restart

2.3 总结

以下为个人测试的一些经历

  • IPv6中继方式在Netgear路由器上测试成功,其他品牌路由器以IPv6中继方式可以获取IPv6原生地址,但是无法访问IPv6网络
  • 会偶尔无法访问IPv6网络,重启接入终端的网络适配器之后,又可以访问IPv6网络

3. IPv6 穿透

3.1 简介

NetGear官方固件支持IPv6穿透模式,接入终端可以获取原生IPv6地址。基于OpenWRT固件也可以配置IPv6穿透模式,具体参考这篇博客

解决思路:

  • 将路由器的WAN口、LAN口以及WiFi桥接起来,以brctl实现
  • WAN口、LAN口以及WiFi桥接之后,此时OpenWRT相当于一个交换机,此时WAN口、LAN口以及WiFi都相当于交换机接口。
  • ebtables工作在数据链路层,利用ebtables控制所有非IPv6流量进行路由,IPv6流量仍为交换模式
图3-1 IPv6穿透模式流量示意图

更多关于Linux网络数据包过滤的流程,请查看图3-2

图3-2 Linux网络数据包过滤流程

3.2 配置

软件包安装

安装ebtables,安装之后,会自动加载相关的模块

1
2
opkg update
opkg install ebtables
网卡查看

查看当前桥接,其中eth0.1为OpenWRT缺省使用的VLAN1(LAN)对应的虚拟网卡,wlan0wlan1为无线网卡,三者共同桥接到网桥br-lan上,br-lan同时提供了DHCP功能,为接入终端提供IPv4私有IP地址

1
2
3
4
5
root@OpenWrt:~#brctl show
bridge name bridge id STP enabled interfaces
br-lan 7fff.e4f4c6e90d5a no eth0.1
wlan0
wlan1

通过ifconfig命令或者OpenWRT网页管理页面,可以知晓OpenWRT缺省使用VLAN2(WAN)的虚拟网卡为eth0.2

ebtables配置

ebtables工作在数据链路层,有三个表: filter, natbroute。这里使用broute(Bridge table)表,将所有来自WAN口(eth0.2)的非IPv6流量进行路由

根据官方使用手册的说明,broute表有内建的链:BROUTING。在broute表中,DROPACCEPT有特殊的意义(为了保持通用实现性,没有增加其他字段),DROP字段的意思为数据帧需要被路由,ACCEPT字段的意思为数据被桥接传输(交换模式)

1
ebtables -t broute -A BROUTING -p ! ipv6 -j DROP -i eth0.2

现在需要将eth0.2桥接到br-lan,使得LAN能接收到WAN的IPv6数据包

1
brctl addif br-lan eth0.2

此时已经实现了IPv4路由模式,IPv6交换模式

odhcp服务关闭

此时应该关闭odhcpd服务,同时将br-lan所有关于IPv6选项均置为disabled

1
2
/etc/init.d/odhcpd stop
/etc/init.d/odhcpd disable

若不关闭odhcp服务,logread命令查看,会产生大量相关的日志

1
2
3
4
5
6
7
Fri Apr 21 15:45:07 2017 daemon.warn odhcpd[1262]: DHCPV6 SOLICIT IA_NA from 0001000111111111111111 on br-lan: no addresses available 
Fri Apr 21 15:45:07 2017 daemon.warn odhcpd[1262]: DHCPV6 SOLICIT IA_PD from 0001000111111111111111 on br-lan: no prefix available
Fri Apr 21 15:45:11 2017 daemon.warn odhcpd[1262]: DHCPV6 SOLICIT IA_NA from 0001000111111111111111 on br-lan: no addresses available
Fri Apr 21 15:45:12 2017 daemon.warn odhcpd[1262]: DHCPV6 SOLICIT IA_NA from 0001000111111111111111 on br-lan: no addresses available
Fri Apr 21 15:45:12 2017 daemon.warn odhcpd[1262]: DHCPV6 SOLICIT IA_NA from 0001000111111111111111 on br-lan: no addresses available
Fri Apr 21 15:45:12 2017 daemon.warn odhcpd[1262]: DHCPV6 SOLICIT IA_NA from 0001000111111111111111 on br-lan: no addresses available
Fri Apr 21 15:45:12 2017 daemon.warn odhcpd[1262]: DHCPV6 SOLICIT IA_NA from 0001000111111111111111 on br-lan: no addresses available

3.3 路由器IPv6地址配置

路由器IPv6地址

IPv6穿透模式导致了OpenWRT路由器无法获取在WAN6口IPv6地址,这样导致了路由器无法使用IPv6网络进行离线下载

解决方案1

因为WAN口、LAN口以及WiFi都现在都桥接到网桥br-lan,所以路由器的WAN口、LAN口以及WiFi无法获取IPv6地址,如果想让路由器获取IPv6地址,可以将WAN6口分配给一个新的物理接口。

  • 创建VLAN3,将一个物理接口分配给VLAN3
  • WAN6分配到VLAN3
  • VLAN3对应的物理接口连接到能获取IPv6地址的网口

按照上面的思路,前提条件为WAN口所在为VLAN2,实践方式有如下的三种:

  • 添加一个交换机,拓扑如下,额外成本为需要多使用一台交换机。

    3-3
    图3-3 拓扑1
  • 根据上面的思路,需要添加一台交换机,那么可以在路由器上再额外添加一个VLAN4,相当于一台交换机。但是缺点就是每次数据包都要两次经过路由器,增加了路由器的处理负担。如果路由器只有五个物理接口的话,则LAN所在的VLAN1无物理接口。

    3-4
    图3-4 拓扑2
  • VLAN1(LAN)的某个物理接口接到VLAN3的物理接口,拓扑如下。但是Linux内核会报错,错误内容为br-lan: received packet on eth0.1 with own address as source address所以这种方法不推荐

    3-5
    图3-4 拓扑3
解决方案3

该方案不稳定!

手动给网桥配置br-lan配置IPv6地址以及默认网关

  • 查询设备所在IPv6网络的默认网关和IPv6地址前缀,通过接入路由器的终端,使用ifconfig/ipconfig进行查询,现假设查询到的IPv6全局地址前缀为2001:xxxx:xxxx:xxxx::/64,默认网关为fe80::2ac6:8eff:fe0f:823e

  • br-lan分配IPv6地址,IPv6默认为EUI-64方式,前64位为网络前缀,后64位为根据MAC地址生成,默认情况下,IPv6全局地址IPv6本地链路地址后64位是相同的

    • 为了避免重复,查询br-lanIPv6本地链路地址,假设为fe80::e6f4:c6ff:fee9:d5a/64,则可将br-lanIPv6全局地址配置为2001:xxxx:xxxx:xxxx:e6f4:c6ff:fee9:d5a/64

    • 可以手动填写后64位地址,例如2001:xxxx:xxxx:xxxx:1001:1001:1001:1001/64,但是这样可能导致IPv6全局地址重复,不推荐

    • 配置IPv6全局地址br-lan

      1
      ifconfig br-lan 2001:xxxx:xxxx:xxxx:e6f4:c6ff:fee9:d5a/64
  • 默认路由添加,没有默认路由,路由器无法访问IPv6外网

    1
    route -A inet6 add ::/0 gw  fe80::2ac6:8eff:fe0f:823e dev br-lan

上述配置再路由器重启或者网络重启之后失效!

3.4 总结

  • 如果不进行额外配置,该模式下,OpenWRT路由器无法获取IPv6地址
  • 不要先运行brctl addif br-lan eht0.2命令,如果忘记运行ebtables -t broute -A BROUTING -p ! ipv6 -j DROP -i eth0.2命令,路由器就完全成为交换机模式,会导致br-lan的DHCP广播、ARP广播等数据涌入局域网

4. IPv6 NAT

4.1简介

虽然IPv6在设计之初,没有考虑NAT,在主流的网络设备上也没有IPv6的NAT配置,但 Linux 内核从 3.7 版本开始实现了 IPv6 的 NAT,如图4-1所示,其中黄色为本地私有IPv6链路地址转发,蓝色为全球可路由IPv6地址转发

图4-1 IPv6NAT模式流量示意图

4.2 设置

软件包安装

安装相应的软件包

1
2
opkg update
opkg install ip6tables kmod-ipv6 kmod-ipt-nat6 kmod-ip6tables kmod-ip6tables-extra luci-proto-ipv6 iputils-traceroute6
  • kmod-ipv6并非必须
  • kmod-ipt-nat6提供IPv6的NAT支持
  • ip6tableskmod-ip6tables,kmod-ip6tables-extra等提供IPv6防火墙
  • luci-proto-ipv6为LuCI提供IPv6设置选项
  • iputils-traceroute6为IPv6提供traceroute功能(mtr是个不错的支持双栈的traceroute替代品,占用的存储空间相对大些)
IPv6私网地址

OpenWRT在默认情况下,会分配一个IPv6私网地址段,在Network->Interfaces页面底下有Global network options->IPv6 ULA-Prefix这里应该有一个随机的fd开头的/64IPv6地址段,LAN客户端可以从这个地址段自动获取私有的IPv6地址,DHCPv6无状态地址自动配置(SLAAC)默认已经开启

IPv6私网地址网关配置

缺省配置下,LAN客户端获取的私有IPv6地址没有IPv6网关的

Network->Interfaces->LAN下的DHCP Server部分的IPv6 Settings选项卡部分,勾选Always announce default router,否则OpenWRT不会向LAN客户端推送OpenWRT私有的IPv6网关地址

为了确保设置生效,最好重启路由器

NAT设置

客户端有了私有的IPv6地址之后,私有地址可以单向路由到互联网中的,但是无法被路由回LAN客户端。因此需要在OpenWRT上开启IPv6 NAT。在默认情况下,OpenWRT防火墙不会配置ip6tables的NAT表,因此在OpenWRT命令下手动添加如下规则

1
2
3
ip6tables -t nat -A POSTROUTING -o eth0.2 -j MASQUERADE
ip6tables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
ip6tables -A FORWARD -i br-lan -j ACCEPT
  • eth0.2为OpenWRT的获取全球可路由IPv6地址的WAN口名称,这个名字不是防火墙区域名字,也不是LuCI里面Network->Interfaces里面看到的名字,而是ifconfig看到的网卡名字
  • br-lan为LAN口对应名称,也是通过ifconfig看到的网卡名字
路由条目添加

到当前设置,接入终端可以访问OpenWRT的IPv6公网所在网段,不能访问该网段以外的IPv6地址,原因不明,查看IPv6路由表,发现存在默认路由。添加全球可路由IPv6聚合路由可解决该问题。

查询下一跳IPv6本地链路地址

1
2
root@OpenWrt:~# route -A inet6 | grep ::/0 | awk '{print $2}'
fe80::3a22:d6ff:febf:1b00

查询下一跳IPv6全局地址

1
2
root@OpenWrt:~# traceroute6 -n tv.byr.cn | grep '^ 1' |  awk '{print $2}'
2001:xxx:xxx:xxx:3a22:d6ff:febf:1b00

现在可知fe80::3a22:d6ff:febf:1b00为下一跳的IPv6本地链路地址,2001:xxx:xxx:xxx:3a22:d6ff:febf:1b00为下一跳的IPv6全局地址。

然后添加全球可路由IPv6地址的聚合路由条目,WAN6出口虚拟网卡为eth0.2,出口虚拟网卡名称通过命令uci -q get network.wan6.ifname查看,下面两条命令中的任意一条,都可以添加全球可路由IPv6聚合路由条目。

1
2
route -A inet6 add 2000::/3 gw fe80::3a22:d6ff:febf:1b00 dev eth0.2
route -A inet6 add 2000::/3 gw 2001:xxx:xxx:xxx:3a22:d6ff:febf:1b00 dev eth0.2
配置保存

每次重启,添加的ip6tables会消失,因此添加到开机启动

1
2
3
4
5
cat <<EOF >>/etc/rc.local
ip6tables -t nat -A POSTROUTING -o eth0.2 -j MASQUERADE
ip6tables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
ip6tables -A FORWARD -i br-lan -j ACCEPT
EOF

如果IPv6环境发生改变,路由器的IPv6网关也会随之改变,因此创建 /etc/hotplug.d/iface/90-ipv6脚本,修改文件属性为755,内容如下

1
2
3
4
5
6
7
8
#!/bin/sh

[ "$ACTION" = ifup ] || exit 0

[ "$INTERFACE" = wan6 ] && {
route -A inet6 add ::/0 gw $(traceroute6 -n tv.byr.cn | grep '^ 1' | awk '{print $2}') dev $(uci -q get network.wan6.ifname)
#route -A inet6 add 2000::/3 gw $(route -A inet6 | grep ::/0 | awk '{print $2}') dev $(uci -q get network.wan6.ifname)
}

4.3 总结

  • 该方式适用于只有OpenWRT能获取IPv6全局地址的情况下,例如路由器通过隧道或者VPN等方式获取的IPv6地址
  • 该方式在原生IPv6环境下不推荐使用,经过测试,BT下载速率不会高于5MB/s

5. 实现方式对比

实现方式 原生地址 速率 路由器获取IPv6地址 适用环境 问题
IPv6 中继 很好 可以 原生IPv6 偶尔中断
IPv6 穿透 很好 不可以 原生IPv6 路由器IPv6手动配置
IPv6 NAT 一般 可以 其他 速率慢

修订版本信息

修订版本 时间 备注
文档创建 2017.2.22 20:33 文件创建
文档修改1 2017.7.5 21:03 IPv6 穿透方式路由器获取IPv6地址

参考