http-proxy-ipv6-pool 部署完整指南:如何在 Vultr 服务器路由整段 /64 IPv6 子网
【免费下载链接】http-proxy-ipv6-poolMake every request from a separate IPv6 address.项目地址: https://gitcode.com/gh_mirrors/ht/http-proxy-ipv6-pool
http-proxy-ipv6-pool是一个用 Rust 编写的 HTTP 代理工具,它的核心功能是:让每一个请求都从一段 IPv6 子网里随机选取的不同地址发出。在 Vultr 等提供整段 /64 IPv6 子网的服务器上部署后,每次经过代理127.0.0.1:51080的访问,出口 IPv6 地址都会随机变化——非常适合需要多出口地址的爬虫、接口测试、反爬验证等场景。
为什么需要 IPv6 地址池代理?
普通代理所有请求共用同一个出口 IP,很容易被目标网站识别和限制。而IPv6 代理的思路完全不同:
| 对比项 | 传统代理 | http-proxy-ipv6-pool |
|---|---|---|
| 出口地址 | 固定 1 个 | 每请求随机 1 个 |
| 地址池大小 | 依赖购买 | /64 子网约 2⁶⁴ 个地址 |
| 被封风险 | 单点易封 | 地址随机轮换,天然分散 |
一个/64子网包含约 1.8 × 10¹⁹ 个地址,理论上几乎不可能用完,这就是"整段子网即地址池"的由来。
工作原理:三个关键点
阅读 src/proxy.rs 可以很快看懂它的实现逻辑:
- 随机地址生成:
get_rand_ipv6()函数保留子网前缀,随机填充主机部分,从 /64 网段中生成一个随机 IPv6 地址; - 本地绑定发送:普通 HTTP 请求通过 hyper 的
HttpConnector::set_local_address()绑定该随机地址再发起连接; - CONNECT 隧道:对于 HTTPS 请求,走
tunnel()逻辑,新建一个 v6 socket 绑定随机地址后与目标建连,双向转发数据。
命令行入口在 src/main.rs,支持两个核心参数:
| 参数 | 说明 | 默认值 |
|---|---|---|
-b / --bind | 代理监听地址 | 0.0.0.0:51080 |
-i / --ipv6-subnet | 你的 IPv6 子网 | 2001:19f0:6001:48e4::/64 |
部署前提:准备 Vultr 服务器
⚠️前提条件:你需要一台路由了整段 IPv6 子网(而非单个 IPv6 地址)的 VPS。Vultr 在创建实例时勾选 "Route entire IPv6 subnet" 即可获得。
其他准备:
- 🐧 Ubuntu / Debian 系统
- 🦀 Rust 工具链(用于编译源码)
- 🔌 服务器可正常访问外网
第一步:确认你的 IPv6 子网前缀
登录服务器后,执行ip a查看网卡信息:
$ ip a 2: enp1s0: <BROADCAST,MULTICAST,ALLMULTI,UP,LOWER_UP> mtu 1500 inet6 2001:19f0:6001:48e4:5400:3ff:fefa:a71d/64 scope global dynamic注意/64前缀:2001:19f0:6001:48e4::/64就是你的 IPv6 子网,后面所有配置都会用到它。同时记下接口名(例如enp1s0)。
第二步:添加本地路由(关键!)
云厂商通常只给你分配一个"动态地址",子网内的其他地址默认无法直接绑定使用。必须手动告诉内核"这个 /64 网段都由本机接口处理":
ip route add local 2001:19f0:6001:48e4::/64 dev enp1s0⚠️ 将命令中的子网和接口名替换为你自己的值。重启后该路由会丢失,需要写入
/etc/network/interfaces或 systemd 单元持久化。
第三步:开启 ip_nonlocal_bind 内核参数
Linux 默认不允许进程绑定"不属于本机"的 IP 地址。打开ip_nonlocal_bind开关:
sysctl net.ipv6.ip_nonlocal_bind=1如需开机生效,将以下内容追加到/etc/sysctl.conf:
net.ipv6.ip_nonlocal_bind = 1第四步:配置 NDP 代理(ndppd)
即使内核允许绑定随机地址,外部流量也找不到这些地址(邻居发现协议没有响应)。安装ndppd充当 NDP 代理,替子网内所有地址应答:
apt install ndppd编辑/etc/ndppd.conf,按你的子网修改:
route-ttl 30000 proxy eth0 { router no timeout 500 ttl 30000 rule 2001:19f0:6001:48e4::/64 { static } }注意:
proxy eth0中的接口名换成你的实际外网接口(上面示例中的eth0,实际可能是enp1s0)。
启动服务:
systemctl enable --now ndppd第五步:用 curl 验证基础环境
在启动代理之前,先用curl --interface手动绑定两个不同地址测试,确认整段子网已可直连:
$ curl --interface 2001:19f0:6001:48e4::1 ipv6.ip.sb 2001:19f0:6001:48e4::1 $ curl --interface 2001:19f0:6001:48e4::2 ipv6.ip.sb 2001:19f0:6001:48e4::2✅ 如果两次返回的地址与绑定的地址一致,说明路由、ip_nonlocal_bind、ndppd 三项配置全部正确。
第六步:编译并启动 http-proxy-ipv6-pool
获取源码并编译:
git clone https://gitcode.com/gh_mirrors/ht/http-proxy-ipv6-pool cd http-proxy-ipv6-pool cargo build --release带参数启动,-i指定你的子网,-b指定监听地址:
./target/release/http-proxy-ipv6-pool -b 0.0.0.0:51080 -i 2001:19f0:6001:48e4::/64每个请求都会在终端打印一行日志,例如:
ipv6.ip.sb via 2001:19f0:6001:48e4:971e:f12c:e2e7:d92a这正是随机地址轮换在工作。
第七步:最终验证——每请求一个新地址
循环请求ipv6.ip.sb(它会把你的出口 IPv6 地址回显出来):
$ while true; do curl -x http://127.0.0.1:51080 ipv6.ip.sb; done 2001:19f0:6001:48e4:971e:f12c:e2e7:d92a 2001:19f0:6001:48e4:6d1c:90fe:ee79:1123 2001:19f0:6001:48e4:f7b9:b506:99d7:1be9 2001:19f0:6001:48e4:a06a:393b:e82f:bffc 2001:19f0:6001:48e4:245f:8272:2dfb:72ce🎉 每次请求的出口地址都不同——恭喜,IPv6 地址池代理部署成功!任何支持 HTTP 代理的工具(curl、scrapy、requests 等)指向127.0.0.1:51080即可享受随机出口。
常见问题排查(FAQ)
Q1:curl 测试某个子网地址超时?依次检查:①ip route show是否有 local 路由;②net.ipv6.ip_nonlocal_bind是否为 1;③ ndppd 是否在运行(systemctl status ndppd)。
Q2:重启服务器后失效?local 路由和 sysctl 需要持久化:路由写入网络配置或 systemd 服务,内核参数写入/etc/sysctl.conf并sysctl -p。
Q3:代理只监听本机还是允许远程访问?默认绑定0.0.0.0:51080对所有网卡开放。若只想本机使用,建议改为-b 127.0.0.1:51080并在防火墙限制该端口。
Q4:为什么 HTTPS 也走随机地址?代理对CONNECT方法单独处理(见 src/proxy.rs 中的process_connect),为每个隧道新建绑定了随机 IPv6 的 socket,因此 HTTPS 流量的源地址同样是随机的。
写在最后
整套方案的核心就三件事:本地路由 + ip_nonlocal_bind + ndppd,再让 http-proxy-ipv6-pool 在你的 /64 子网上随机取址发请求。配置一次之后,你就拥有了一台出口地址近乎无限的 IPv6 代理服务器。项目基于 Rust + Tokio + hyper 编写(见 Cargo.toml),单二进制、零依赖,非常适合长期运行在 VPS 上。
【免费下载链接】http-proxy-ipv6-poolMake every request from a separate IPv6 address.项目地址: https://gitcode.com/gh_mirrors/ht/http-proxy-ipv6-pool
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考