在校园网环境使用路由器获得高可用IPv6

使用桥接方法让Openwrt下的设备也获得可用的IPv6

博主所在学校的实验室提供的网络环境为内网IPv4(需要锐捷认证)+ IPv6(无PD)。而一个学号只能认证两台设备,对博主这样的多设备用户很苦恼,遂通过软路由Openwrt进行代理认证。但这样只有软路由有可用的IPv6,与博主的家庭宽带PPPOE后得到PD的IPv6不同,连入的设备都只有IPv4能力,非常的不优雅。

经过查阅资料后发现,大部分的教育网都是采用SLAAC来分配地址,不带有PD头,路由不知道自己所分配的子网范围。知道了问题所在以及结合匮乏的计网中IPv6知识,于是有以下的集中解决方案:

  1. 通过nat66将IPv6进行NAT操作

    优点:

    • 可以使用原生的IPv6功能

    • 可以让路由来分配自己的内网IPv6,与IPv4使用方式相同(即端口转发)

    • 配置较为简单,只要路由可以上网就可以保证内网中的设备都可以访问IPv6

    缺点:

    • IPv6所谓的每个设备都有自己的IP地址这一广告词就当放屁了

    • 这nat66性能也。。。令人堪忧啊,毕竟这软路由的配置仅仅是双核四线程的辣鸡Atom

  2. 通过已给出的IPv6地址划出一个更小范围的子网

    优点:

    • 地址分配自己可以控制,方便记忆(比如1919:810:114:514)

    • 可以通过防火墙地址范围规划保护设备

    • 保证设备能拿到自己的公网IPv6,外网访问不用再打洞了

    缺点:

    • 由路由器作转发网关,对于软路由这类没有硬件级IPv6转发的设备来说。。。性能和nat66差不多

    • 安卓设备不支持DHCPv6得到IPv6地址(虽然博主自己没有安卓设备),还需要root后手动添加IPv6地址,很不优雅

    • 有些设备上的防火墙会与路由上的防火墙冲突,导致有地址但不可用(说的是你,Windows)

    • 分配了地址后需要路由向上级交换机报告IPv6地址,若上级交换机过于陈旧就不可用

  1. 通过已经拿到IPv6地址的wan6接口来中继到br-lan的网桥上

    优点:

    • 继续使用学校的SLAAC分配子网内的IPv6地址,不用讨论学校上级交换机的情况

    • 因为是SLAAC分配地址,安卓设备也可以拿到IPv6地址

    • 不再使用路由器做网关,流量与性能问题不用再考虑

    • 类原生的IPv6体验

    缺点:

    • 路由器上看不到已连入设备的IPv6地址(很合理嘛,毕竟不是路由器分配的)

    • 防火墙部分可能会失效

    • 有些学校的IPv6部分也会单独计费等,此时每个连入的设备都需要计费认证后才能使用IPv6功能(但博主所在学校IPv6是免费的)

综上,博主选择了第三种方法。给软路由刷入了Openwrt后,装上锐捷认证(minieapmentohust均可)。而后进入Openwrt的shell,更改其dhcp配置

vim /etc/config/dhcp

其中lan部分

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 ra 'relay'
option ndp 'relay'
option dhcpv6 'relay'
option ra_slaac '1'

wan部分

1
2
3
config dhcp 'wan'                   
option interface 'wan'
option ignore '1'

wan6部分(此处是需要手动添加)

1
2
3
4
5
config dhcp 'wan6'                                             
option ra 'relay'
option ndp 'relay'
option dhcpv6 'relay'
option master '1'

全部修改完成后退出并保存,然后重启dhcp服务

/etc/init.d/odhcp restart

再打开Openwrt的IPv6转发功能

vim /etc/sysctl.conf

其中加入以下配置

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

然后就可以发现子网内设备成功拿到了IPv6地址。

但有时又无法ping通阿里云2400:3200::1的DNS服务器,检查一下防火墙。
/etc/config/firewall中的default项加入option disable_ipv6 '1',再重启防火墙即可。


另:

为了确保Openwrt及其子网设备的IPv6的功能是正常的,请确保以下设定是满足的,其包括:

  • 网络——DHCP——高级设置中勾选了“禁止解析 IPv6 DNS 记录”

  • 网络——负载均衡——策略中备用成员是“不可达(拒绝)”而不是“默认(使用主路由表)”