【教程】两种实现方法使只有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 |
|
再把原来的东西全部删除,添加DNS64的服务器地址,这里推荐用CloudFlare的,自带NAT64网关。
1 |
|
然后重启,之后服务器应该就能正常访问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 |
|
修改配置文件
然后我们需要更改一下wireguard的配置文件,也就是wgcf-profile.conf
。打开它,长这样
1 |
|
首先,先ping出域名engage.cloudflareclient.com
的IP地址,可以分别得到IPV6和IPV4地址,应该是下面这两个,然后替换掉engage.cloudflareclient.com
。
1 |
|
开始修改:
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 |
|
最终效果如下:
1 |
|
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 main
和PostDown = 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 |
|
对于Debian系的系统,可能需要先进行resolved
的软链接,命令如下
1 |
|
此时,如果看到有wgcf
网卡,那么说明启动成功。
然后,再次访问IPV4/IPV6服务:
1 |
|
发现成功访问,万事大吉!
设置为系统服务并且开机自启
如果确定配置没有问题,那就可以将虚拟网卡设置为系统服务并且开启自启。首先把虚拟网卡断开
1 |
|
然后设置为服务并开机自启
1 |
|
一些常见的问题
resolvconf: command not found
这个问题一般会出现在Debian系的系统中,包括Ubuntu,看上去是因为没有安装resolve,但其实是装了的,只是不同发行版的名字不同而已,比如在Debian系的系统中就叫resolvectl
,因此只需要建立一个软链接即可。
1 |
|
Failed to set DNS configuration: Could not activate remote peer.
从错误信息看出,无法连接到DNS服务器。这当然不是CF或者Google的DNS服务器炸了,大概率是本机的resolve服务没有打开,把它打开来就好了。
1 |
|
RTNETLINK answers: Permission denied
看似是因为没有权限,但连root都没有的权限是什么玩意儿?所以当然不是用户权限问题,那就是其他问题了。我出现这个问题是在IPV4要访问IPV6的机器上,因此怀疑是不是服务商默认设置不允许IPV6。查看配置
1 |
|
然后发现全是1,猜测成立,把这些全部改成0就可以了。配置文件是这个/etc/sysctl.conf
。随后刷新配置,无需重启
1 |
|
搞定。
尾声
还是不得不感叹CloudFlare作为当代赛博活佛,功不可没,不过大家切忌滥用,生成的配置文件可以用在多台机器上,不要过多的注册账号了啊。