源起
昨天的sakura ipv6 only 0.4刀小鸡老板支持hkt的家宽ipv4出口了。
折算下来每个月3块钱的hkt ipv4出口。
虽然我没什么hk家宽的需求,但是性价比如此之高,让我忍不住想折腾一下。
背景
- 一台ipv4 only 香港服务器 cstserver 2h2g,用于挂博客的
- 新买的sakura ipv6 only 香港服务器
- 有域名,已经在cf托管了
- 工位机器不支持ipv6(l2tp拨号,这也是我为什么做这件事情),宿舍里电脑支持ipv6。
- 我买的深港/厦港的专线转发不支持ipv6,为单栈。
再次鸣谢cloudflare提供的CDN、argo tunnel等服务。
目标用户
和我一样的小白用户,由于本地不支持ipv6,有ipv6入站转ipv4入站的需求,并且香港的机器还不支持ipv6,是单栈的。
当然我日本有一台双栈机,为了延迟,我不想用日本鸡拉,在不增加成本的前提下,尽量提高体验,降低延迟。
如果你已经有一台双栈香港机,直接转发就行,不必我这样麻烦。
出站ipv4
出站不是我们重点考虑的方向,因为我们主要是ipv4转ipv6的入站过程受阻。
这里有两种方法:
-
使用cf warp的ipv4出口
不重复写教程,见:https://www.nodeseek.comhttp://127.0.0.1:5001/post-54704-1
直接按脚本一键设置即可正确设置ipv4出口。
-
使用老板提供的一键脚本
如果和我一样是sakura的ipv6小鸡推荐这个,直接挂上就是hkt ipv4出口了。
进群后自己找脚本。
入站:http/https转ipv4
主要思路:利用Cloudflare的双栈CDN,将ipv6的http入口转换为ipv4入口。
因为我懒,不想手搓,尽量都是一键脚本
具体操作案例:使用CDN反代3xui的http入口。组合为CDN NPM 3xui
安装3xui
不是本文的重点,见https://github.com/MHSanaei/3x-ui
直接命令行安装
bash <(curl -Ls https://raw.githubusercontent.com/MHSanaei/3x-ui/refs/tags/v2.5.8/install.sh)
cloudflare开启cdn
托管的cloudflare的域名,加个解析即可:

安装nginx proxy manager
安装docker和docker compose
#docker
apt-get update && apt-get install -y wget vim
wget -qO- get.docker.com | bash
docker -v
systemctl enable docker
#docker compose
apt-get install -y wget vim curl
apt-get install docker-compose
docker-compose -v
安装nginx proxy manager
新建一个文件夹nginx_proxy_manager,新建docker-compose.yml
version: '3'
services:
app:
image: 'chishin/nginx-proxy-manager-zh:release'
restart: always
network_mode: host # 关键修改:使用主机网络模式
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
注:这里我改了网络模式,原来的模式会报错,宿主模式就不会报错了。
然后docker compose up -d,访问ipv6的81端口
默认管理员信息:
Email: [email protected]
Password: changeme
进入界面后修改账号密码,然后新建一个代理服务,下面的2053是我的入站端口:

访问域名
现在使用域名直接访问就应该可以直接ipv4访问了:

入站:tcp/udp 的ipv6转ipv4
这里是我重点研究的地方:
非域名配置
首先,我们测试使用cf自动生成的域名来配置,重启后域名就会发生变化,虽然不长久,但可以用来测试。
这里参考自:https://linux.do/t/topic/431783
ipv6机器的配置
配置文件server.json:
{
"server": {
"token": "quick",
"edge-ips": [
"198.41.192.77:7844",
"198.41.197.78:7844",
"198.41.202.79:7844",
"198.41.207.80:7844",
"[2606:4700:a0::1]:7844",
"[2606:4700:a1::1]:7844",
"[2606:4700:a8::1]:7844",
"[2606:4700:a9::1]:7844"
]
}
}
下载解压运行:
wget https://github.com/fmnx/cftun/releases/download/v2.0.3/cftun-linux-amd64.tar.gz
tar zxvf cftun-linux-amd64.tar.gz
./cftun-linux-amd64 -c server.json
启动后你应该能看到如下信息
./cftun-linux-amd64 -c server.json
INFO[2025-05-14T22:18:13.205853576-04:00] THE TEMPORARY DOMAIN YOU HAVE APPLIED FOR IS: crops-ban-r-coupons.trycloudflare.com
2025-05-15T02:18:13Z INF Starting tunnel tunnelID=d818a586-3d8a-449f-8d97-177a16284812
2025-05-15T02:18:13Z INF Generated Connector ID: 4fcd66cf-4dc8-41ea-9c66-e2ae6b882e37
2025-05-15T02:18:13Z INF Initial protocol quic
2025-05-15T02:18:13Z INF Using [CurveID(4588) CurveID(25497) CurveP256] as curve preferences connIndex=0 event=0 ip=198.41.192.77
2025-05-15T02:18:13Z INF Registered tunnel connection connIndex=0 connection=3aec9142-8d43-429f-9a4b-c3077141a256 event=0 ip=198.41.192.77 location=hkg05 protocol=quic
2025-05-15T02:18:13Z INF Using [CurveID(4588) CurveID(25497) CurveP256] as curve preferences connIndex=1 event=0 ip=198.41.207.80
2025-05-15T02:18:14Z INF Registered tunnel connection connIndex=1 connection=911a4fc6-846d-4fb1-9df5-81ed62236a68 event=0 ip=198.41.207.80 location=hkg11 protocol=quic
2025-05-15T02:18:14Z INF Using [CurveID(4588) CurveID(25497) CurveP256] as curve preferences connIndex=2 event=0 ip=198.41.197.78
2025-05-15T02:18:15Z INF Registered tunnel connection connIndex=2 connection=a0a6da9e-561e-41a2-9cbf-8f2a4b09b351 event=0 ip=198.41.197.78 location=hkg05 protocol=quic
2025-05-15T02:18:15Z INF Using [CurveID(4588) CurveID(25497) CurveP256] as curve preferences connIndex=3 event=0 ip=198.41.202.79
2025-05-15T02:18:16Z INF Registered tunnel connection connIndex=3 connection=b7747757-07b9-47d8-8687-52fda5b70b6d event=0 ip=198.41.202.79 location=hkg12 protocol=quic
这里的crops-ban-r-coupons.trycloudflare.com即是临时域名。
ipv4的机器配置
配置文件:client.json
{
"client": {
"cdn-ip": "198.41.207.80", #这里可以是任意cdn ip
"cdn-port": 80, #如果80连不上,就改为443
"scheme": "ws", #改为443后这里要对应改为wss
"global-url": "crops-ban-r-coupons.trycloudflare.com",
"tunnels": [
{
"说明": "中转到warp",
"listen": "127.0.0.1:2408",
"remote": "162.159.192.1:2408",
"protocol": "udp",
"timeout": 30
},
{
"说明": "中转到ssh",
"listen": "127.0.0.1:2222",
"remote": "127.0.0.1:22",
"protocol": "tcp"
},
{
"说明": "中转到iperf3-udp",
"listen": "127.0.0.1:5201",
"remote": "127.0.0.1:5201",
"protocol": "udp",
"timeout": 30
},
{
"说明": "中转到iperf3-tcp",
"listen": "127.0.0.1:5201",
"remote": "127.0.0.1:5201",
"protocol": "tcp"
}
]
}
}
下载、解压运行:
wget https://github.com/fmnx/cftun/releases/download/v2.0.3/cftun-linux-amd64.tar.gz
tar zxvf cftun-linux-amd64.tar.gz
./cftun-linux-amd64 -c client.json
ssh测试
现在尝试通过ipv4机器ssh ipv6机器:
ssh -vvv -p 2222 [email protected]
.... #出现一大堆忽略
[email protected]'s password: #出现这个,输入密码能正常访问即为成功
现在tcp即正常被转发到了ipv6的机器上。
至于之后的转发,自行配置,本文不涉及任何搭建服务。
域名配置
临时域名终归是不长久的,人总会想转发到自己的域名上,下面我们进行域名的绑定,这样不会每次都刷一个新的临时域名了。
创建zero trust tunnel
进入cf,选择zero trust:

然后:

然后选择cloudflared隧道:

命名后保存:

然后,选择docker,复制命令下来,提取对应的token部分:

在server.json中修改Token的值:
{
"server": {
"token": "Your token",
"edge-ips": [
"198.41.192.77:7844",
"198.41.197.78:7844",
"198.41.202.79:7844",
"198.41.207.80:7844",
"[2606:4700:a0::1]:7844",
"[2606:4700:a1::1]:7844",
"[2606:4700:a8::1]:7844",
"[2606:4700:a9::1]:7844"
]
}
}
在client.json中修改global-url:
{
"client": {
"cdn-ip": "104.17.143.163",
"cdn-port": 80,
"scheme": "ws",
"global-url": "tunnel.0vv0.de",
"tunnels": [
{
"listen": "0.0.0.0:port",
"remote": "127.0.0.1:port",
"protocol":"tcp"
},
{
"listen": "0.0.0.0:port",
"remote": "127.0.0.1:port",
"protocol":"udp",
"timeout": 30
}
]
}
}
重新测试后,就可以看到像我的截图中的连接成功了。
至于后面的如何通过访问ipv4->ipv6的协议,也就很简单了。
成功的截图
补一张通过本地ipv4单栈->香港的ipv4单栈机器->sakura ipv6 only->hkt访问ping0的截图:

参考文献:
- https://linux.do/t/topic/431783/14
- https://www.nodeseek.comhttp://127.0.0.1:5001/post-54704-1
- https://linux.do/t/topic/3628
博客也发了嗷

BD,太强了
学习
捉个虫 应该是不支持ipv6吧