安卓对指定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协议进行的:
但笔者在无线AP(运行着padavan系统的路由器)上用tcpdump
探测安卓设备相关的网络流量,只发现了邻居请求(NS)的流量:
1 |
|
1 |
|
再考虑到ICMP是网络层协议,无法通过iptables
等工具进行过滤,故笔者选择放弃。
3. 安卓端控制(成功)
虽然不能阻止安卓设备获取IPv6地址,但我们依然可以直接在安卓端禁用IPv6功能。Reddit[2]论坛有人指出,安卓在root后可以通过如下命令禁用WiFi的IPv6功能:
1 |
|
笔者通过JuiceSSH验证后确认有效,但重连WiFi后IPv6地址会恢复。再加上笔者只想在家庭网络禁用安卓的IPv6,所以笔者使用Tasker软件进行了额外配置:
在Tasker内创建一个配置 | 当WiFi连接到指定SSID | 使用root执行对应命令 |
配置完成后,保持Tasker运行,就可以让笔者的安卓设备在接入家庭网络时不使用IPv6了。