ipv6 only机ipv4通讯教程

源起

昨天的sakura ipv6 only 0.4刀小鸡老板支持hkt的家宽ipv4出口了。

折算下来每个月3块钱的hkt ipv4出口。

虽然我没什么hk家宽的需求,但是性价比如此之高,让我忍不住想折腾一下。

背景

  1. 一台ipv4 only 香港服务器 cstserver 2h2g,用于挂博客的
  2. 新买的sakura ipv6 only 香港服务器
  3. 有域名,已经在cf托管了
  4. 工位机器不支持ipv6(l2tp拨号,这也是我为什么做这件事情),宿舍里电脑支持ipv6。
  5. 我买的深港/厦港的专线转发不支持ipv6,为单栈。

再次鸣谢cloudflare提供的CDN、argo tunnel等服务。

目标用户

和我一样的小白用户,由于本地不支持ipv6,有ipv6入站转ipv4入站的需求,并且香港的机器还不支持ipv6,是单栈的。

当然我日本有一台双栈机,为了延迟,我不想用日本鸡拉,在不增加成本的前提下,尽量提高体验,降低延迟。

如果你已经有一台双栈香港机,直接转发就行,不必我这样麻烦。

出站ipv4

出站不是我们重点考虑的方向,因为我们主要是ipv4转ipv6的入站过程受阻。

这里有两种方法:

  1. 使用cf warp的ipv4出口

    不重复写教程,见:https://www.nodeseek.comhttp://127.0.0.1:5001/post-54704-1

    直接按脚本一键设置即可正确设置ipv4出口。

  2. 使用老板提供的一键脚本

    如果和我一样是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的截图:

参考文献:

  1. https://linux.do/t/topic/431783/14
  2. https://www.nodeseek.comhttp://127.0.0.1:5001/post-54704-1
  3. https://linux.do/t/topic/3628

博客也发了嗷

点赞
  1. robin2025说道:

    BD,太强了

  2. lehuoyisheng说道:

    学习

  3. velezkirsten说道:

    目标用户
    和我一样的小白用户,由于本地不支持ipv4

    捉个虫 应该是不支持ipv6吧

发表回复

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

×
订阅图标按钮