[2020.08.19] OpenWRT 在某大学校园网环境下通过NAT方式配置IPv6互联网访问

封面配图 PID 19136833

今天试着玩了一下宿舍里的 IPv6 接入,在这里记录一下自己的踩坑过程

网络环境

博主所在的学校宿舍区采用 DHCPv6 的方式下发 IPv6 地址,无需拨号。接入墙上网口的终端只能获取到一个 128 前缀的 IPv6 地址。
查找了网上其他关于在 OpenWRT 路由器中对 IPv6 的配置过程,总的来说分为三类接入类型:

  1. 路由器作为中继
    所有接入的客户端以及路由器本身的 IPv6 流量转发到 OpenWRT 路由器本身的 IPv6 地址,然后 OpenWRT 路由器再将流量转发到其 IPv6 网关。路由器作为接入客户端的下一跳。此接入类型要求上级网关可以分配一个 IPv6 地址 给路由器。博主尝试了在路由器上要求上级分配长度不同的地址段,但都没有成功。这大概率是因为上级(学校网络中心机房)没有配置 允许下级设备(学生们插在宿舍里的路由器)获取地址段。所以,路由器作为中续在博主所在的学校不适用。Capture.PNG其他选项都试过了,只有设置为 disable 可以顺利拿到地址
  2. IPv6 穿透
    路由器将 WAN 口和 LAN 口(包括无线网络接口,如果有的话)桥接在一起,路由器相当于一个交换机,转发接入的客户端的 DHCPv6 请求给上级,这样接入的客户端都可以从上级获取到一个 IPv6 地址了。而路由器对于接入设备发送的 IPv4 流量,则采用传统 NAT 的方法路由出 WAN 口。博主咱个人认为,配置穿透较为复杂(涉及到链路层和网络层的切换),加上需要手动配置 IPv6 防火墙,不小心手滑按错可就麻烦了。再加上 原生 Android 不支援也不计划支援 DHCPv6,以及不能控制设备获取到的 DNSv6 地址(采用 IPv6 地址的 DNS 服务器地址),这个接入方法也被博主抛弃了。
  3. 传统 NAT
    传统 NAT 就是传统 NAT,路由器获取一个 IPv6 地址,同时向接入设备下发路由器自己给接入设备分配的内网地址(段)。路由器作为网关,所有流量流入路由器并经过路由器转换地址(NAT)后发送给上级(公网)。可以说是把 IPv4 的模式 copy 到 IPv6 下了。此接入方式配置简单,缺点是接入设备只能获取到内网地址,不可自由 互联网上的其他设备访问(外网访问需要手动在路由器上设置端口转发,或在路由器上开启 upnp。也可以说是在另一面上方便了咱们对接入设备的防火墙管理),以及对路由器的地址转换性能有些的要求(接入设备访问互联网时需要路由器改写数据包的源地址)(但目前关于 IPv4 和 IPv6 两种协议在 NAT 时谁更吃性能这个问题尚无定论,可能因路由器型号及路由器系统内是否支援硬件转发而不同)。总之性能方面博主宿舍桌上供着的 MT7621 洋垃圾应该是不成问题的。

那么博主就采用第③种方法好了

路由器刷机

刷机包采用目前最新的 OpenWRT 19.07.3 官方稳定版本,刷机具体过程略。

路由器从上级获取 IPv6 地址

新建一个 WAN 口取名WAN6(已经有的就不需要再建了),接口协议DHCPv6客户端启动时连接勾上,请求IPv6地址选择总是请求指定长度IPv6选择禁用。高级设置选项卡中,使用对端通告的DNS地址取消勾勾,使用自定义DNS服务器填上清大的 DNS 服务器2001:da8::666
保存,保存并应用。
稍等两三秒钟,不出意外可以看到这个接口被分配到一个 128 前缀的 IPv6 地址了。一般在大陆的校园网环境中,这个 IPv6 地址是以2001:da8:开头的。
Capture1.PNG

现在咱们来确认 IPv6 接入的有效性:
ssh 连入路由器,ping 一下2001:da8::666看看通不通。
如果是通的,那么恭喜你..... 的路由器,已经成功获取到 IPv6 地址并接入 IPv6 互联网了。
如果不通,先试试 traceroute2001:da8::666,如果只有第一跳,而且第一跳是路由器的 IPv6 公网地址(2001:da8:开头),延迟还巨高(大概 3000ms 左右),并附有!H 的标志(代表下一跳路由不可达),请给路由器加上一条路由表。可以参考 这篇文章 。我使用的 OpenWRT 官方固件已经自动帮我加好了,可能只在部分老版本 OpenWRT 以及自编译版本上需要手动添加。
其他情况,询问学校网管或许是最好的解决办法

修改路由器默认的 IPv6 地址前缀

在 OpenWRT 官网给出的 IPv6 NAT 上网指南 最后说明了关于 ULA 前缀需要修改的原因。
翻译成白话文是说,OpenWRT 默认的IPv6 ULA前缀是以fd**开头的,这是一个 IPv6 私网地址段,不能用于路由出内网。
解决方法是将IPv6 ULA前缀的第一位字符由f改为d

在 OpenWRT 19.07.3 版本中,IPv6 ULA前缀设置项被单独放到了名为全局网络选项的选项卡中。见下图↓
(打码是为了防止泄露 MAC 地址,还请见谅)
Capture2.PNG
修改后保存并应用。

路由器下发内网 IPv6 给接入设备

回到接口 >> LAN >> DHCP服务器 >> IPv6设置,设置为:

路由通告服务 服务器模式
DHCPv6 服务 服务器模式
NDP 代理 已禁用
DHCPv6 模式 无状态 + 有状态
总是通告默认路由 勾上

保存并应用,拔插一下接入路由器的设备(可以的话最好重启路由器和接入路由器的所有设备)
最后检查一下笔电和手机平板等设备是否获取到了d开头的 IPv6 地址
Capture3.PNG

Untitled4.png

路由器转发来自接入设备的 IPv6 流量

首先需要安装 NAT6 的内核模块,确定路由器已连入互联网并可以正常下载 opkg 软件源,ssh 执行

opkg update
opkg install kmod-ipt-nat6

少女祈祷后回到管理页面中,进入防火墙Custom Rules,下面的框框中追加一条:(请将 {IPv6 ULA 前缀} 替换成之前修改后的IPv6 ULA前缀,别忘了结尾有个/48

ip6tables -t nat -A POSTROUTING -s {IPv6 ULA前缀} -j MASQUERADE

Capture5.PNG

保存并应用,生效后打开笔电上的 cmd,ping 一下2001:da8::666。看到来自清大那霸气的 28ms 回复,NAT6 就算配置成功了。(28ms 经供参考,因高校所处具体地理位置及校内网络 优化而有所增减)

后续

至此已经实现了宿舍内接入路由器的设备通过 NAT 方式访问 IPv6 互联网 ,魔法上网的姿势增加了。 关于端口转发以及 DDNS 等奇怪的玩法,等博主的新 NAS 机箱壳做好寄到再开工吧。这些留着再水一篇新的博文(咕咕咕咕

附一张魔法上网测速图,BJ 时间晚上 10 点测得的
300 多的延迟,FPS 是别想了。但接近 300M 的带宽你管 4K 推流还是毫无压力的
Capture6.PNG


参考链接:
OpenWRT IPv6 三种配置方式
Android does not support DHCPv6 and Google 'Won't Fix'that
OpenWrt 配置 IPv6 NAT
NAT6 and IPv6 masquerading - OpenWRT

本文链接:https://blog.hiirachan.moe/archives/1598021438.html
This blog is under a CC BY-NC-SA 3.0 Unported License

本站不提供任何可用于侵入、非法控制计算机信息系统的程序、工具
不提供非法定信道进行国际联网

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.