OpenWrt路由器校园网下发IPV6地址的两种方式:NAT6和伪装PD前缀

On

Update

In

OpenWrt路由器校园网下发IPV6地址的两种方式:NAT6和伪装PD前缀

本文介绍使用Openwrt路由器在校园网下发IPV6地址的两种方式。我立足于浙江大学紫金港校区西区的情况,但应该也适用于浙大其他校区和其他中国大学的一般情况。如果家用宽带用户发现自己路由器的IPv6地址无法下发,也可以参考伪装PD前缀的配置方式。

1 有线网+NAT6

从2024年7月开始,浙江大学有线网放弃了L2TP连接方式,而是也采用了跟ZJUWLAN一样的Web认证,并且继续提供IPv6地址。不过,由于提供的IPv6地址是/128位的,这导致该地址无法下发给其他设备。/128位的IPv6地址只能通过配置NAT6的方式来完成下发。网上提供了许多校园网配置NAT6的教程,但是由于不清晰的写作方式导致它们大多令人困惑或者根本不起作用。

1.1 准备工作

找到一根网线,一端插在墙上的网线口上,另一端插在路由器的Wan口上。使用电脑连接上路由器后,应该会弹出Web认证提示,完成认证后即可上网。

1.2 让Wan口获取IPv6地址

大多数路由器默认有一个DHCP接口和DHCPv6接口,此时DHCP接口获取到了IPv4地址,但DHCPv6接口并未获取IPv6地址。

在Luci界面的DHCPv6接口设置中,“请求指定长度的 IPv6 前缀”选择“禁用”,再点击“保存&应用”,此时应该可以让DHCPv6接口获取到IPv6地址。

1.3 NAT6的配置

目前,网上流行的大多数配置NAT6的教程都是过时、繁琐且无用的,以下我介绍两种简单的办法,主要适用于22.03及以上使用了nftables防火墙的Openwrt系统版本,这里我推荐方法一。如果低于此版本且使用iptables防火墙的OpenWrt系统,请使用方法二。

1.3.1 方法一:SSH配置

本方法参考了浙江大学校内论坛CC98的一个帖子《openwrt配置IPv6 NAT(2024)》,该帖子使用公网无法打开。恩山论坛也有一个帖子提到了这种方法。实际上,这种方法来自OpenWrt的官方教程,非常简单易用,直接看官方教程就可以了。

这也告诉我们一个道理:有时候与其在各种论坛上搜索各种第三方教程,不如直接参考官方的使用说明。由于nftables防火墙自带了NAT6功能,所以不再需要安装其他的软件包。

1.设置 nftables 的 IPv6 NAT 规则

ssh到路由器,运行:

uci set firewall.@zone[1].masq6="1"
uci commit firewall
service firewall restart

2.关闭 IPv6 包过滤器

ssh后运行:

uci set network.wan6.sourcefilter="0"
uci commit network
service network restart

3.编辑 LAN 接口选项

高级设置:IPv6分配长度选择“64”

DHCP服务器-IPv6设置:RA服务选择“服务器模式”,DHCPv6服务选择“服务器模式”,禁用NDP代理

DHCP服务器-IPv6 RA设置: 默认路由器选择“强制的”

1.3.2 方法二:NAT配置助手

在软件包里更新软件列表,搜索一个软件包叫luci-app-nat6-helper,安装后刷新管理页面,在“服务”里多出一个软件叫“NAT6配置助手”。安装该软件会自动安装相关依赖,如果此事没有发生则请手动安装。点击“启用”和“执行IPv6初始化脚本”,该软件会自动配置NAT6,完成后重启路由器使其生效。此时路由器应该就能下发IPv6地址到设备了。

2. 无线中继+伪装PD前缀

在像校园网这样的特殊网络环境下,我们还可以通过无线中继的方式来配置路由器。在理论上,无线中继的延迟要大于有线网连接,但这种差异不是你会感受到的,即便你是FPS游戏玩家。

2.1 创建无线网络

使用您的路由器的5G频段搜索网络,连接信号最好的无线网络。

浙江大学校园网的无线网目前提供两种连接,一种叫ZJUWLAN,采用Web认证方式,不提供IPv6地址;另一种叫ZJUWLAN-Secure,采用WPA2-EAP认证方式,提供/64位的IPv6地址。我们要连接的是ZJUWLAN-Secure,加密选择“WPA2-EAP“,算法“自动”,EAP类型选择“PEAP”,认证为“EAP-GTC”。填写自己的校园网账户和密码,不填写匿名身份。

如果您的固件没有“WPA2-EAP”选项,请安装完整版的wpad-XXXX并卸载软件包里的wpad-basic-XXXX并。请自己选择wpad的实现方式,23.05版本的OpenWrt的默认选择是mbedtls。如果您的路由器连不上网,您可以暂时连接手机无线热点来完成此步骤,或者在编译阶段就选择好软件包。

2.2 创建wwan6网络接口

确保有两个网络接口,一个是wwan的DHCP,一个是DHCPv6,这两个接口分别获取IPv4和IPv6地址。wwan的DHCP接口在连接Wifi的时候就创建好了,这时一般要自己新建一个DHCPv6接口,名称可以填写为wwan6,注意分配好跟wan和wan6相同的防火墙区域。创建好wwan6口后,该接口应该能直接获取到了/64的IPv6地址,但无法下发到其他设备。

2.3 伪装PD前缀

使用“伪装PD前缀”的方式来确保IPv6地址下发到设备。这里没有采用NAT6的方式,因为在能够获取/64位的IPv6地址的情况下,伪装PD前缀是更好的解决方案。《odhcpd 中继模式原理、局限以及解决方案》一文解释了校园网/64的IPv6地址无法正常下发的原因,并且提供了两种解决方案。以下是对该文所提供的伪装PD前缀解决方案的引用。家庭宽带用户如果发现路由器本身能获取IPv6地址但却无法下发到设备,也可以采用有线网+伪装PD前缀的解决方案。

使用SSH软件连接路由器编辑 /etc/odhcp6c.user 文件,可使用命令:

vi  /etc/odhcp6c.user

如果您不知道如何编辑文件,请寻找一个好的教程。复制以下代码,并粘贴到该文件之中:

#!/bin/sh

log() {
	logger -t "odhcp6c[fake-ipv6pd]" "$@"
}

reset_envs() {
	local entry

	local raroutes=""
	local userprefix=""
	for entry in $RA_ROUTES; do
		local route="$entry"
		local addr="${entry%%/*}"
                entry="${entry#*/}"
                local mask="${entry%%,*}"
                entry="${entry#*,}"
                local gw="${entry%%,*}"
                entry="${entry#*,}"
                local valid="${entry%%,*}"
                entry="${entry#*,}"
                local metric="${entry%%,*}"

		if [ "$addr" != "::" ]; then
			local prefix="$addr/$mask"
			log "found ipv6 prefix $prefix"
			userprefix="$userprefix $prefix"
			continue
		fi
		log "preserve ra route $route"
		raroutes="$raroutes $route"
	done

	RA_ROUTES="$raroutes"
	USERPREFIX="$userprefix"
}

fake_ipv6pd() {
	local device="$1"
	local action="$2"

	[ "$action" != "ra-updated" ] && return
	[ -n "$PREFIXES$USERPREFIX" ] && return
	[ -z "$ADDRESSES$RA_ADDRESSES" ] && return

	reset_envs

	[ -n "$ADDRESSES$RA_ADDRESSES$PREFIXES$USERPREFIX" ] && setup_interface "$device"
}

fake_ipv6pd "$@"

保存后运行 /etc/init.d/network restart 让路由器重新配置网络,或者直接重启路由器,过一会儿路由器应该就能下发IPv6地址了。

2.4 ZJUWLAN-Secure的特殊情况

最后我讨论一下ZJUWLAN-Secure的特殊情况,其他用户不必阅读这部分。近段时间,我发现路由器连接ZJUWLAN-Secure WIFI有断流的现象,每隔大约8小时24分断一次,具体表现为连接虽然保持,但其实没有流量。在反复研究检索后,发现问题出在WPA2-EAP认证的PMKSA缓存中。缓存的默认有效期就是8小时24分,而有效期一过就要重新验证,但实际上重新验证的过程由于某种未知原因并不会完成,这就导致了断流的出现。具体日志为:

Tue Aug 20 13:19:51 2024 daemon.notice wpa_supplicant[2103]: phy1-sta0: CTRL-EVENT-EAP-STARTED EAP authentication started
Tue Aug 20 13:19:51 2024 daemon.notice wpa_supplicant[2103]: phy1-sta0: CTRL-EVENT-EAP-PROPOSED-METHOD vendor=0 method=4 -> NAK
Tue Aug 20 13:19:51 2024 daemon.notice wpa_supplicant[2103]: phy1-sta0: CTRL-EVENT-EAP-PROPOSED-METHOD vendor=0 method=25
Tue Aug 20 13:19:51 2024 daemon.notice wpa_supplicant[2103]: phy1-sta0: CTRL-EVENT-EAP-METHOD EAP vendor 0 method 25 (PEAP) selected
Tue Aug 20 13:19:51 2024 daemon.notice wpa_supplicant[2103]: EAP-TLV: TLV Result – Success – EAP-TLV/Phase2 Completed
Tue Aug 20 13:19:51 2024 daemon.notice wpa_supplicant[2103]: phy1-sta0: CTRL-EVENT-EAP-SUCCESS EAP authentication completed successfully
Tue Aug 20 13:19:51 2024 daemon.notice wpa_supplicant[2103]: phy1-sta0: PMKSA-CACHE-REMOVED dc:da:80:1c:e8:21 0
Tue Aug 20 13:19:51 2024 daemon.notice wpa_supplicant[2103]: phy1-sta0: PMKSA-CACHE-ADDED dc:da:80:1c:e8:21 0
Tue Aug 20 13:19:51 2024 daemon.notice wpa_supplicant[2103]: phy1-sta0: WPA: Key negotiation completed with dc:da:80:1c:e8:21 [PTK=CCMP GTK=CCMP]

虽然日志看起来没有异常,但是一次成功的连接的最后一条相关日志应该是CTRL-EVENT-CONNECTED。

有一位用户报告了相同的现象,但该用户给出的解决方案对本人的情况无效。我尝试禁用PMKSA缓存,但完全不起作用。PMKSA缓存似乎是被服务端控制的,而不是客户端。由于断流原因,最近我已经转而使用有线网+NAT6的方式。这一问题我会在近期传达给信息技术中心。

3. 结论

以上就是在校园网或部分家庭宽带环境下获取IPv6地址的两种方式。

最新文章

相关文章


评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注


了解 心的道理 的更多信息

Subscribe to get the latest posts sent to your email.