在纯ipv6的WiFi下如何上ipv4的网站

TL;DR

学校最近新装了个ipv6 only的网络,但发现没法访问ipv4的网络,但是安卓手机却可以,研究了一下是要配置464XLAT转换,因为学校提供了一个隧道,可以访问ipv4网站。这里我将用clatd做示例,来配置和安卓手机上一样的效果。

开始配置clatd

先装依赖:

1
sudo pacman -S nftables

安装clatd:

1
paru -S clatd-git

编辑/etc/clatd.conf:

1
2
3
4
5
6
7
clat-dev=clat # clatd虚拟网卡名,默认值clat
clat-v4-addr=192.0.0.3 # 本地clat网段,默认值192.0.0.1
#plat-prefix=2001:114:514:1919::/96 # ipv6隧道前缀(见下一章节),默认是让clatd自动获取,如果获取失败再手动填写
plat-dev=wlan0 # 你的网卡名,默认自动获取
v4-conncheck-enable=yes # 自动判断上面的网卡是否有ipv4访问能力,如果没有就启动clatd,否则不启动,默认yes
v4-defaultroute-enable=yes # 自动强制让所有ipv4的访问经clatd出站,默认yes
v4-defaultroute-metric=2048 # clatd网卡的metric,默认2048

接下来,只要保证clatd服务在后台运行,就会像安卓手机一样能自适应是否是纯ipv6的网络了。

1
sudo systemctl enable --now clatd.service

当网络不支持PLAT的话,就会在日志里打印这段话然后自动退出,做到无感使用:

1
No PLAT prefix could be discovered. Your connection probably doesn't provide NAT64/DNS64 PLAT service. Exiting.

和tun软件冲突解决方案

获取运营商xlat前缀

查看运营商的ipv6隧道前缀:

1
dig +short AAAA ipv4only.arpa

会返回如下结果:

1
2
2001:114:514:1919::c000:aa
2001:114:514:1919::c000:ab

去掉最后的32位,得到前缀就是2001:114:514:1919::

注意,获取前缀这一步是可选的,如果自动检测没法成功的话才需要做

tun代理软件中的配置

排除clatd的网卡,将出口网卡锁定到实际出口网卡

clatd配置

获取你运营商的xlat前缀,再将clatd配置文件改成这样即可:

1
2
3
4
5
6
7
8
#clat-dev=clat
#clat-v4-addr=192.0.0.3
plat-prefix=2001:114:514:1919::/96 # 改成你运营商的xlat前缀
plat-dev=wlan0
#v4-conncheck-enable=no
v4-defaultroute-replace=yes
v4-defaultroute-enable=yes
#v4-defaultroute-metric=2048

⚠️注意:
我个人现在是clatd配置文件置空、tun软件指定出口网卡为实际物理网卡来实现的,缺点是没法连接仅支持ipv4的服务,所以你最好要有一个自己的双栈服务器做中转。

参考的文章

clatd GitHub仓库(各参数解释也在里面)


在纯ipv6的WiFi下如何上ipv4的网站
http://blog.coolenoch.ink/2025/11/24/Linux/29-在纯ipv6的WiFi下如何上ipv4的网站-251124/
作者
CoolestEnoch
发布于
2025年11月24日
许可协议