【教程】两种实现方法使只有IPV6的机器(或VPS)访问IPV4内容

Last updated on July 11, 2024 am

背景

  因为公网IPV4地址十分稀缺,所以一些非常便宜甚至免费的VPS只分配了IPV6地址,比如传家宝EUServ的免费小鸡(不知道谁现在还留着),Vultr的IPV6-only系列,还有Pacificrack跑路之后又复活的Neko云。但是,只有IPV6地址的小鸡并不能访问绝大多数互联网内容,因为大部分服务,尤其是海外服务(点名GitHub),都只支持IPV4访问。如图:

因此,本文将展示如何让只有IPV6的机器访问到IPV4的内容。如果你目前的网络不支持IPV6,可以用手机热点或者使用服务器商给你提供的VNC。

方法一:使用DNS64 + NAT64

原理

  当机器访问到不支持IPV6的服务时,DNS64会将返回的IPV4地址转化为特殊的IPV6地址,这个IPV6地址会指向NAT64的代理机器,随后代理机器会将访问得到的内容通过该IPV6地址返还给你的机器。但是我自己从来没有成功过😅

  • 优点:简单,且内地可用
  • 缺点:有很大概率访问失败,且并非原生IPV4

方法

编辑/etc/resolv.conf,用nano或者vim都行,先备份

1
2
cd /etc
cp resolv.conf resolv.conf.bak

再把原来的东西全部删除,添加DNS64的服务器地址,这里推荐用CloudFlare的,自带NAT64网关。

1
2
nameserver 2606:4700:4700:0:0:0:0:64
nameserver 2606:4700:4700:0:0:0:0:6400

然后重启,之后服务器应该就能正常访问IPV4内容了。但是我的不正常,所以抬下去,下一个

方法二:使用WirdGuard虚拟网卡

原理

  这个原理从字面意思就可以看出来,使用WireGuard创建一张虚拟网卡,而这张虚拟网卡支持IPV4,达到近似原生的IPV4访问。我知道你们平时用WireGuard都做些什么见不得光的事情,但是这次不是😛具体来说,我们需要用到CloudFlare提供的Warp服务(CF真是赛博活佛),将其伪装成WireGuard虚拟网卡。这种方法可以使IPV4和IPV6实现互相访问。

方法

生成WireGuard配置文件

请在一台可以访问IPV4的机器上进行。
如果是方法一失败才来方法二的,方法一更改过的nameserver需要改回来。

从Github上下载对应版本的wgcf,并放在一个专门的文件夹内:
https://github.com/ViRb3/wgcf/releases
因为蠢死的macOS以为wgcf是个病毒从而禁止其运行,所以我就换到Windows上罢。打开Windows上的文件夹,在地址栏输入cmd,打开命令行,将程序拖进去,再在后面加上 register进行注册,然后根据提示同意条款阿巴阿巴,就像这样:

然后再将程序拖一遍,这一次在后面加上 generate来生成WireGuard配置文件。此时会生成两个文件:

尤其是这个wgcf-profile.conf文件,要保存好,不要泄露。

安装WireGuard

首先当然是安装WireGuard啦。

1
2
3
4
5
6
7
8
9
# RHEL系(CentOS, Rocky Linux, Fedora...)
# 我习惯用yum了,其实用dnf当然是可以的
# 先更新一下源
yum update -y
yum install wireguard-tools -y

# Debian系(包括Ubuntu)
apt update
apt install wireguard

修改配置文件

然后我们需要更改一下wireguard的配置文件,也就是wgcf-profile.conf。打开它,长这样

1
2
3
4
5
6
7
8
9
10
11
[Interface]
PrivateKey = ************************=
Address = 172.16.0.2/32
Address = 2606:4700:110:806b:87c5:3ab8:5ec7:f344/128
DNS = 1.1.1.1, 1.0.0.1, 2606:4700:4700::1111, 2606:4700:4700::1001
MTU = 1280
[Peer]
PublicKey = *****************************=
AllowedIPs = 0.0.0.0/0
AllowedIPs = ::/0
Endpoint = engage.cloudflareclient.com:2408

首先,先ping出域名engage.cloudflareclient.com的IP地址,可以分别得到IPV6和IPV4地址,应该是下面这两个,然后替换掉engage.cloudflareclient.com

1
2
162.159.192.1
2606:4700:d0::a29f:c001

开始修改:

IPV4访问IPV6

对于有IPV4需要访问IPV6的机器,删除AllowedIPs = 0.0.0.0/0,留下AllowedIPs = ::/0,使所有IPV6流量均通过WireGuard。随后,将DNS一行修改为DNS = 8.8.8.8,8.8.4.4,2001:4860:4860::8888,2001:4860:4860::8844以优先IPV4的DNS查询。然后,在[Interface]中加入以下代码,使访问本机的网络不通过WireGuard,以防止失联

1
2
PostUp = ip -4 rule add from <公网IP或者VPC的IP> lookup main
PostDown = ip -4 rule delete from <公网IP或者VPC的IP> lookup main

最终效果如下:

1
2
3
4
5
6
7
8
9
10
11
12
[Interface]
PrivateKey = **********=
Address = 172.16.0.2/32
Address = 2606:4700:110:806b:87c5:3ab8:5ec7:f344/128
DNS = 8.8.8.8,8.8.4.4,2001:4860:4860::8888,2001:4860:4860::8844
MTU = 1280
PostUp = ip -4 rule add from 1.1.1.1 lookup main
PostDown = ip -4 rule delete from 1.1.1.1 lookup main
[Peer]
PublicKey = **********=
AllowedIPs = ::/0
Endpoint = 162.159.192.1:2408

IPV6访问IPV4

  • 删除AllowedIPs = ::/0留下AllowedIPs = 0.0.0.0/0
  • 将DNS一行修改为DNS = 2001:4860:4860::8888,2001:4860:4860::8844,8.8.8.8,8.8.4.4
  • [Interface]中加入PostUp = ip -6 rule add from <公网IPV6> lookup mainPostDown = ip -6 rule delete from <公网IPV6> lookup main
    最终效果如下:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    [Interface]
    PrivateKey = **********=
    Address = 172.16.0.2/32
    Address = 2606:4700:110:806b:87c5:3ab8:5ec7:f344/128
    DNS = 2001:4860:4860::8888,2001:4860:4860::8844,8.8.8.8,8.8.4.4
    MTU = 1280
    PostUp = ip -6 rule add from 1:1:1:1:1:1 lookup main
    PostDown = ip -6 rule delete from 1:1:1:1:1:1 lookup main
    [Peer]
    PublicKey = **********=
    AllowedIPs = 0.0.0.0/0
    Endpoint = 2606:4700:d0::a29f:c001:2408

应用WireGuard配置文件

/etc/wireguard中创建一个文件wgcf.conf,然后想办法把刚刚的配置文件内容丢进去,然后启动。

1
2
sudo wg-quick up wgcf
sudo ip a

对于Debian系的系统,可能需要先进行resolved的软链接,命令如下

1
ln -s /usr/bin/resolvectl /usr/local/bin/resolvconf

此时,如果看到有wgcf网卡,那么说明启动成功。

然后,再次访问IPV4/IPV6服务:

1
2
curl -6 ip.p3terx.com
curl -4 ip.p3terx.com

发现成功访问,万事大吉!

设置为系统服务并且开机自启

如果确定配置没有问题,那就可以将虚拟网卡设置为系统服务并且开启自启。首先把虚拟网卡断开

1
sudo wg-quick down wgcf

然后设置为服务并开机自启

1
sudo systemctl enable --now wg-quick@wgcf

一些常见的问题

resolvconf: command not found

这个问题一般会出现在Debian系的系统中,包括Ubuntu,看上去是因为没有安装resolve,但其实是装了的,只是不同发行版的名字不同而已,比如在Debian系的系统中就叫resolvectl,因此只需要建立一个软链接即可。

1
ln -s /usr/bin/resolvectl /usr/local/bin/resolvconf

Failed to set DNS configuration: Could not activate remote peer.

从错误信息看出,无法连接到DNS服务器。这当然不是CF或者Google的DNS服务器炸了,大概率是本机的resolve服务没有打开,把它打开来就好了。

1
sudo systemctl enable --now systemd-resolved

看似是因为没有权限,但连root都没有的权限是什么玩意儿?所以当然不是用户权限问题,那就是其他问题了。我出现这个问题是在IPV4要访问IPV6的机器上,因此怀疑是不是服务商默认设置不允许IPV6。查看配置

1
sysctl -a |grep disable_ipv6

然后发现全是1,猜测成立,把这些全部改成0就可以了。配置文件是这个/etc/sysctl.conf。随后刷新配置,无需重启

1
sysctl -p

搞定。

尾声

还是不得不感叹CloudFlare作为当代赛博活佛,功不可没,不过大家切忌滥用,生成的配置文件可以用在多台机器上,不要过多的注册账号了啊。


【教程】两种实现方法使只有IPV6的机器(或VPS)访问IPV4内容
https://www.qwqwq.com.cn/tutorial/ipv6-only-access-ipv4/
Author
Stephen Zeng
Posted on
July 11, 2024
Licensed under