写在前面
感谢 zu1k 在两年前就已经踩好了坑,因此在我配置的过程中相对比较顺利。本文是基于 https://zu1k.com/posts/tutorials/http-proxy-ipv6-pool/ 的教程进行配置的,在此基础上广播自己的 IPv6 地址。
BIRD 相关的配置
# /etc/bird/bird.conf
protocol static {
ipv6;
route 2a06:a005:1c40::/44 reject;
route 2a06:a005:1c40::/64 via fe80::5cb0:94ff:fe8e:5f24%ens18;
}
当然你可以直接把 2a06:a005:1c40::/64
改成 2a06:a005:1c40::/44
,这样你就可以获得更多的 IPv6 地址,可用的 IPv6 数量为 2^84
个。
网卡配置
# /etc/network/interfaces
auto lo
iface lo inet loopback
iface lo inet6 static
address 2a06:a005:1c40::/64
up ip route add local 2a06:a005:1c40::/64 dev lo
这里有个很坑的地方,我一开始尝试将 /64 添加到 lo
上,但是发现似乎无法通过任何 IP 出站。后来查了一下,似乎必须是 /128。 于是我就干了一件很蠢的事情。我用 Python 写了一个脚本,把整个 /120 的所有 IPv6 地址手动添加到了 lo
上。
iface lo inet6 static
address 2a06:a005:1c40::0/128
iface lo inet6 static
address 2a06:a005:1c40::1/128
iface lo inet6 static
address 2a06:a005:1c40::2/128
...
iface lo inet6 static
address 2a06:a005:1c40::ffff/128
当然,这样的配置可以工作,但是显然我不可能将整个 /64 全部以这样的方式添加。在 Reddit 找到了答案。
ip route add local 2a06:a005:1c40::/64 dev lo
我仅需要执行以上命令添加路由即可。当然为了方便,在上面对 /etc/network/interfaces
的配置中,我添加了 up
命令在 lo
网卡启动时自动添加路由。
当我以为一切准确就绪的时候,似乎又遇到了麻烦,我尝试使用
curl --interface 2406:a005:1c40::1 ipv6.ip.sb
访问外网,发现无论如何都无法访问。得到了以下错误。
curl: (99) Cannot assign requested address
经过检查,发现是 net.ipv6.ip_nonlocal_bind
没有设置。
sysctl net.ipv6.ip_nonlocal_bind=1
需要使用 sysctl net.ipv6.ip_nonlocal_bind=1
命令来允许非本地绑定。为了让它永久生效,需要修改 /etc/sysctl.conf
文件。
nano /etc/sysctl.conf
net.ipv6.ip_nonlocal_bind=1
然后执行 sysctl -p
命令使配置生效。
完成以上步骤之后,使用 curl --interface 2a06:a005:1c40::1 ipv6.ip.sb
测试是否能够访问外网。
创建 HTTP 代理池
我用到的是 zu1k 的 zu1k/http-proxy-ipv6-pool 。由于 zu1k 提供的是 DEMO,并没有编译,因此需要自己完成编译。
我自己配置了一下 Actions,编译了 http-proxy-ipv6-pool
,并把编译好的文件上传到了 missuo/http-proxy-ipv6-pool/releases 。
请注意,如果你使用 v1.0.0 版本,则是原版。如果你使用 v1.0.1 版本,则是修改了部分代码,支持了 HTTP 代理的 Authentication 功能。你可以使用以下命令在启动时设置 Username
和 Password
。
./http-proxy-ipv6-pool -u your_username -p your_password -b 0.0.0.0:51080 -i 2a06:a005:1c40::/64
测试
测试你的 IPv6 代理池是否可以工作。
curl --proxy http://your_username:your_password@your_ip:51080 http://ipv6.ip.sb
顺利的话,你应该会得到以下结果。
{
"ip": "2a06:a005:1c40::1",
"city": "Toronto",
"region": "Ontario",
"country": "CA",
"loc": "43.7064,-79.3986",
"org": "AS206729 Vincent Yang",
"postal": "M5A",
"timezone": "America/Toronto",
"readme": "https://ipinfo.io/missingauth"
}
通过 IPInfo 可见,IP 完全是原生的,来自加拿大多伦多。
{
"ip":"2a06:a005:1c40::1",
"score":"0",
"risk":"low"
}
通过 Scamalytics 可见,IP 的风险分数为 0
,风险等级为 low
。
说明
- 由于我使用的是自己广播的 IPv6 地址,因此无需进行 ndppd 相关的配置。