在校园网环境下通过Openwrt配置IPv6

Ryan Lv2

[摘要] 在我校只给连接校园网的设备下发 /128 的IPv6地址的背景下,如何让内网设备取得IPv6访问权,就成了一个问题。本文旨在利用NAT66技术,帮助读者,尤其是同为本校学生的读者,为自己宿舍的内网配置v6环境,以享受各界给予的v6红利(

为简便起见,后文均使用“v6”指代IPv6。

由于本人长期使用Openwrt作为主路由,因此并不清楚使用一般家用路由器时能否正常取得v6访问权。经过简要测试,我发现小米4A路由器无论在设置内选择“Native”或“NAT6”均无法让内网设备获得合适的v6地址并上网,想必大部分的普通路由器也是如此。然而对于Openwrt用户,我们拥有对路由器的深度访问权,因此修复这个支持便成为了可能。

(更新:在亲戚家调试v6时,我发现华为AX3路由器在设置中开启IPv6选项并保持默认配置后,下级设备拿到的v6地址系fd开头,但却能正常上网,我猜测其内部也做了NAT6相关处理,但其能否在校园网环境下工作还是个未知数。)

本人的测试环境为iStoreOS,如果您使用的是其他固件,则可能会缺失部分配置项,届时您可能需要ssh连接到路由器并修改uci配置文件以达到目的。

wan 接口配置

请切换到wan接口的高级设置,并修改以下选项:

  • 获取IPv6地址:自动

  • 使用默认网关:[√]

  • 委托IPv6前缀:[√]

  • IPv6分配长度:已禁用

  • IPv6前缀过滤器:未配置

  • IPv6后缀:::1

  • IPv6首选项:0

并在 DHCP服务器 - IPv6设置 中,关闭所有开关,禁用所有选项。

wan6 接口配置

回到接口界面后,您应该会找到除lan、wan之外的第三个接口:wan6.

如果没有wan6接口,请手动添加:

点击“添加新接口”,名称为wan6,协议为“DHCPv6 客户端”,设备为eth0(该项以您wan接口所属的物理接口为准,可能因设备而异)
理论上,如此添加之后,若该接口获得了2001开头的v6地址,您便可以按照下述步骤完成设置了。

在“常规设置”页面,设置如下选项:

  • 开机自动运行:[√]
  • 请求 IPv6 地址:try
  • 请求指定长度的 IPv6 前缀:已禁用

接下来,在“高级设置”中,请按照和wan接口完全相同的方式进行配置。

随后切换到“防火墙设置”,将wan6接口也加入wan防火墙区域,以便管理。

之后请确保“DHCP服务器”选项卡提示“本接口未配置 DHCP 服务器”,因为本接口是作为dhcp客户端使用的。

全局网络选项

请修改此处IPv6 ULA 前缀为合适的CIDR值,如dd12:3456::/64,该值可以完全由您自定义。

请注意必须以dd开头,这是此次网络配置的重点,用fd开头的ULA地址无法成功完成NAT66的配置;而dd之后的值请自拟,只需位于/64的范围内即可,建议保持在8位hex数之内,以免客户端内网v6地址过长。

lan 接口配置

若您既没有开启合适的远程访问手段,又无法使用键盘和显示器连接到软路由控制台,请小心修改lan接口的配置,因为可能导致路由器失联。

在“常规设置”页面,设置如下选项:

  • 委托IPv6前缀:[√]

  • IPv6分配长度:64

  • IPv6 分配提示:dd123456 (该项请与上文ULA前缀保持一致即可)

  • IPv6前缀过滤器:未配置

  • IPv6后缀:::8

  • IPv6首选项:0

随后请切换到“DHCP服务器”选项卡,

  • 在高级设置中,勾选“动态 DHCP” 和 “强制”

  • 在“IPv6设置”中,将 RA 服务 和 DHCPv6 服务 改为“服务器模式”,NDP代理 设为 已禁用,通告的 IPv6 DNS 服务器设为合适的v6公网DNS,此处可使用清华大学TUNA协会的dns:2001:da8::666

  • “IPv6 RA设置”中,请勾选“启用 SLAAC”,其余选项可选择与我保持一致,见下图:

内核设置

为了在内核中启用IPv6数据包的转发,以下操作需要您通过ssh或控制台登录到软路由来执行。

使用vinano打开 /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

完成后,可以通过sysctl -p命令应用刚刚设置的内核参数,但更推荐的做法是先重启您的设备,再继续接下来的操作。

防火墙 设置

在系统的防火墙设置(luci/admin/network/firewall)中:

  • 切换到常规设置,勾选”启用 FullCone-NAT“,将”转发“设为接受,”入站数据“选项可根据安全性需求,酌情选择是否打开;

  • 检查页面下方”区域“,确保”转发“项设置无误,当然可以打开全部选项,如图:

  • 切换到”自定义规则“,添加如下的iptables规则,以实际地启用NAT66:

    1
    2
    3
    4
    5
    6
    ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
    WAN6=wan6
    LAN=br-lan
    ip6tables -t nat -A POSTROUTING -o $WAN6 -j MASQUERADE
    ip6tables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
    ip6tables -A FORWARD -i $LAN -j ACCEPT

该代码中的eth0wan6br-lan大多数情况下不必修改,若出现异常,请根据实际情况适当修改。

完成后点击”保存“,iptables会自动重启以应用规则。


验收环节

全部设置完成后,就可以开始测试连接性了。请将设备的网络断开再重连,随后观察IPv6可用情况。

以Windows的”网卡状态“页面为例,若如上图所示,v4和v6旁均显示”Internet“,恭喜设置成功,从此你的所有内网设备都将可以访问纯IPv6网站,如东北大学六维空间或某些高校的bt/pt站点(经测试,这样的NAT66网络仍然可以正常下载资源以及做种)……更多的用法,就请自己发掘吧!

如果你成功了,希望也可以去评论区冒个泡(

额外的测试连通性办法:使用命令ping 2001:da8::666,尝试ping TUNA的dns,若成功,则说明你的v6网络已基本成型;

此后可以进入test-ipv6.com,记得关闭科学上网工具再访问,若页面显示得分为10分,那么基本可以放心了。

In case failed

如果显示”无网络访问权限“,不要灰心,可能是设备并未尝试重新获取地址,可以尝试重启v6协议,具体操作方法为,在属性对话框中取消勾选”Internet协议版本6“,确认后重新打开属性对话框,再勾选v6协议,即可观察连接情况了。

若显示”无Internet访问权“,请打开”详细信息“窗口,观察”IPv6地址“项是否符合先前设置的ULA前缀:若不符合,请先尝试按照上文重启本地的v6协议;如果符合,那么说明设置过程出了一些问题,敬请评论反馈😥


我校の悲哀

经观察,无论是通过NAT6还是设备直连校园网,获取到的v6地址都面临过一段时间就失效的问题,我暂未找出该故障的原因,因此只能编写如下的bash脚本,自动检测v6连接性并在失败时重启接口。请将脚本写入/opt/ipv6-check.sh,内容如下。

(提示:下方脚本代码仅供参考,系AI作品

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
#!/bin/bash
# screen -dmS v6 /opt/ipv6-check.sh
# ver=0.1.0?

echo IPv6 Check script is online now.
while true; do
if ! ping6 -c 1 -W 1 2001:da8::666 >/dev/null; then
echo $(date +'%Y-%m-%d %H:%M:%S') reconnecting IPv6...

# Get traffic data TX&RX from ifconfig for eth0 interface
eth0_data=$(ifconfig eth0 | grep -oE 'RX.*TX.*' | sed -n 's/.*RX bytes:[0-9]\+ (\([0-9.]\+ GiB\)) TX bytes:[0-9]\+ (\([0-9.]\+ GiB\)).*/RX: \1 TX: \2/p')
# Get traffic data TX&RX from ifconfig for pppoe-wan interface
pppoe_wan_data=$(ifconfig pppoe-wan | grep -oE 'RX.*TX.*' | sed -n 's/.*RX bytes:[0-9]\+ (\([0-9.]\+ GiB\)) TX bytes:[0-9]\+ (\([0-9.]\+ GiB\)).*/RX: \1 TX: \2/p')
# Concatenate the two interfaces' traffic data into a single string
all_traffic="[Current Traffic] WAN-all[${eth0_data}] WAN4[${pppoe_wan_data}]"

echo "$all_traffic"
echo "$all_traffic" >> /opt2/ipv6_var.log
/sbin/ifup wan6
sleep 8
v6_addr=$(ifconfig | grep -oE '2001:250:[0-9a-fA-F:]+')
#curl https://${your_bark}/Dormitory+IPv6+Changed/$v6_addr.
echo -ne "\n$(date +'%Y-%m-%d %H:%M:%S') $v6_addr"
echo -ne "\n$(date +'%Y-%m-%d %H:%M:%S') $v6_addr" >> /opt2/ipv6_var.log
sleep 53
fi
sleep 10
done

此后请在luci的启动项页面->本地启动脚本 中添加如下行:screen -dmS v6 /opt/ipv6-check.sh

一些闲言碎语

  • 经测试,接入我校校园网的设备,无论是否经过认证,均能获取到/128的v6地址,但是尝试获取前缀却始终失败。鉴于上述情况,我只能采取NAT6的策略了。
  • 据说NAT6对性能要求较高,但是在软路由为D2550、客户端通过千兆网线连接到路由器、访问USTC的ipv6测速网站的情况下,仍能轻松地跑出700Mbps的上下行,期间软路由上CPU占用率最高仅60%左右,因此我认为,非硬路由Openwrt用户不必对性能担忧。
  • 为了发挥v6的最大潜力,我给一个虚拟机直通了网卡使其获取了校园网直接下发的v6地址,并设置DNS为2001:da8::666,但是该机莫名其妙地无法上网,猜测是DNS配置问题,须使其也连接到v4网络并设置v4的DNS,才能成功。(后来因为v6地址需要定期更新的原因也放弃了这样做,回归到路由器NAT6了)
  • 让我继续折腾v6的真正起因是,上次回家,给家里一台旧Lenovo品牌机安装了个黑群晖(详情可见我tg频道),于是回宿舍后希望内网设备可以获得v6访问权,这样就可以方便地访问家中NAS了,最后结果也如我所愿,成功取得了v6地址;然而由于特殊的原因,上传到家中NAS的速度仅4MBps左右😭虽然不算快,但是算下来一晚上也够传30多G了,唉,就酱吧
  • 折腾过程中,我看了好几篇教程,第一篇是官方的,写得很简略;
    第二篇写的倒是很详细,但是一顿操作下来,差点搞得路由器自己都上不了v6,ping哪儿都显示 Network unreachable ;https://zhuanlan.zhihu.com/p/492774540
    第三篇,直击重点,让我把内网分配的ip前缀(全局网络前缀)从fd00这个保留区移出来,改成dd开头,结果一改马上就通网了
    https://zhuanlan.zhihu.com/p/467475294
    其他参考: https://evanzj.com/2021/12/20/NAT6/
  • Title: 在校园网环境下通过Openwrt配置IPv6
  • Author: Ryan
  • Created at : 2024-04-07 21:00:00
  • Updated at : 2024-05-13 16:47:45
  • Link: https://blog.eddy.moe/2024/04/07/在校园网环境下通过Openwrt配置IPv6/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments