安卓对指定WiFi禁用IPv6

1. 背景

这是笔者之前的家庭网络架构,所有设备集中在宽带网关的二级 NAT 下,同时有一台旁路由设备用于透明代理:

后来由于某些设备有连接公网 IPv6 地址的需求,所以笔者将二级 NAT 改成了无线 AP ,所有设备直连宽带网关以拿到 IPv6 地址:

OP 的安卓设备在之前的网络架构中将旁路由作为网关。但在新的网络架构中,由于安卓设备无法设置静态 IPv6 ,所以 IPv6 流量无法经过旁路由;而且即使 OP 将安卓设备的 DNS 和 IPv4 网关设置为旁路由,但其 DNS 请求还是有可能直接发送到宽带网关上。

由于笔者对基于旁路由的透明代理和自定义DNS有较强需求,所以笔者决定让安卓设备在家庭网络中不使用IPv6(且不影响在其它网络环境中使用IPv6)。

2. 远程端控制(失败)

安卓设备通过无线AP接入网路,笔者首先想到的解决方案是在无线AP处进行控制。只要避免安卓设备获取到IPv6地址,问题就解决了。按照锐捷的文章介绍[1],主机无状态配置IPv6是通过 ICMPv6协议进行的:

IPv6主机无状态自动配置的过程

但笔者在无线AP(运行着padavan系统的路由器)上用tcpdump探测安卓设备相关的网络流量,只发现了邻居请求(NS)的流量:

1
tcpdump -i br0 ether src ${安卓mac} or ether dst  ${安卓mac}
1
2
10:56:16.700518 IP6 :: > ff02::1:ff48:xxx: ICMP6, neighbor solicitation, who has fe80::xxx, length 32
10:56:16.705741 IP6 :: > ff02::16: HBH ICMP6, multicast listener report v2, 2 group record(s), length 48

再考虑到ICMP是网络层协议,无法通过iptables等工具进行过滤,故笔者选择放弃。

3. 安卓端控制(成功)

虽然不能阻止安卓设备获取IPv6地址,但我们依然可以直接在安卓端禁用IPv6功能。Reddit[2]论坛有人指出,安卓在root后可以通过如下命令禁用WiFi的IPv6功能:

1
2
echo 0 | tee /proc/sys/net/ipv6/conf/wlan0/accept_ra
echo 1 | tee /proc/sys/net/ipv6/conf/all/disable_ipv6

笔者通过JuiceSSH验证后确认有效,但重连WiFi后IPv6地址会恢复。再加上笔者只想在家庭网络禁用安卓的IPv6,所以笔者使用Tasker软件进行了额外配置:

在Tasker内创建一个配置 当WiFi连接到指定SSID 使用root执行对应命令

配置完成后,保持Tasker运行,就可以让笔者的安卓设备在接入家庭网络时不使用IPv6了。

引用


安卓对指定WiFi禁用IPv6
https://www.yooo.ltd/2022/12/17/安卓对指定WiFi禁用IPv6/
作者
OrangeWolf
发布于
2022年12月17日
许可协议