本站跑在Scaleway的纯IPv6服务器上,之前为了给它加上IPv4,用了Cloudflare warp脚本。

不知道从什么时候开始,服务器就开始经常掉线、失联,也查不出什么问题。后来,换了个脚本,服务器倒是不失联了,但就是连不上,表现为明明已经获得了IP,但不走warp线路。

所以,我决定索性放弃一键warp,只借用Cloudflare补全IPv4就行。

简单来说,新方案是在worker上部署一个vless服务,然后让IPv4走socks代理,IPv6不走代理。

配置代理

先找到另一台双栈服务器搭建服务,然后在本地创建socks5代理。

这里有个现成的在Cloudflare worker上部署vless的方案。
在Cloudflare面板里创建一个worker,然后把这个代码粘贴进去。
Cloudflare屏蔽vless关键词,现将它全局替换成其他词,然后把userID改为自己的UUID。

这就已经部署完了,不清楚vless配置的话访问 https://【your_domain】.workers.dev/【UUID】

一点小毛病

Worker无法访问已经套了Cloudflare CDN的网站。如果配置了socks5Address,就会改走socks5代理。没条件自己搭建socks5代理,或者不在意安全性,可以用这个修改版,里面内置了代理IP。
甚至也可以不配置,只是一些网站不能访问。

现在已经可以跳到下一个步骤——测试连通性。

如果一定要完全访问,且在意安全性,这里有两个方案。

【方案1:自有服务器搭建socks5】

找一台IPv4服务器,用glider配置socks5,例如:
./glider -listen user:pass@[::]:5005
然后将 socks5Address设定为user:pass@【yourServer】:5005

【方案2:无自有服务器建立代理链】

使用任意支持IPv4的代理服务,用CloudFlare作为跳板,承接所有流量。
例如:在HuggingFace Space上建立一个vless服务(复制别人的项目作为参考)
本地连接命令形如:./glider -listen :14159 -forward=wss://【CF-sub】.workers.dev,vless://【CF-UUID】@,wss://【HF-sub】.hf.space,vless://【HF-UUID】@
此时,CloudFlare仅用于桥接用途。

测试代理连通性

由于我的VPS可以直连Worker,所以没有绑定域名。

在服务器上用glider测试一下IPv4连接:

./glider -listen=127.0.0.1:14159 -forward=wss://【your_domain】.workers.dev/?ed=2048,vless://【userID】@
# 有结果,代表CF代理正常。
curl -4 -x socks5h://127.0.0.1:14159 https://google.com

# 有结果,代表可访问CF CDN网站(非必要)
curl -4 -x socks5h://127.0.0.1:14159 https://stackoverflow.com

配置redsocks

安装:apt install redsocks

socks5代理将运行在14159端口,对应的/etc/redsocks.conf配置如下:

base {
  log_debug = off;
  log_info = off;
  daemon = on;
  redirector = iptables;
}
redsocks {
  local_ip = 127.0.0.1;
  local_port = 12345;
  ip = 127.0.0.1;
  port = 14159;
  type = socks5;
}
# 启动redsocks
systemctl restart redsocks
systemctl enable redsocks

设置IPv4转发

# 启用IP转发
sysctl -w net.ipv4.ip_forward=1

# 配置规则
iptables -t nat -N REDSOCKS
iptables -t nat -A REDSOCKS -p tcp -d 0.0.0.0/8 -j RETURN
iptables -t nat -A REDSOCKS -p tcp -d 10.0.0.0/8 -j RETURN
iptables -t nat -A REDSOCKS -p tcp -d 127.0.0.0/8 -j RETURN
iptables -t nat -A REDSOCKS -p tcp -d 169.254.0.0/16 -j RETURN
iptables -t nat -A REDSOCKS -p tcp -d 172.16.0.0/12 -j RETURN
iptables -t nat -A REDSOCKS -p tcp -d 192.168.0.0/16 -j RETURN
iptables -t nat -A REDSOCKS -p tcp -d 224.0.0.0/4 -j RETURN
iptables -t nat -A REDSOCKS -p tcp -d 240.0.0.0/4 -j RETURN
iptables -t nat -A REDSOCKS -p tcp -j REDIRECT --to-ports 12345

iptables -t nat -A OUTPUT -p tcp -d 0.0.0.0/0 -j REDSOCKS

# 如果 ip -4 route 结果为空,则需要
# 添加虚拟网关
ip addr add 192.0.2.1/24 dev lo
ip route add default via 192.0.2.1 dev lo

curl -4 google.com试试,应该有结果了。
如果成功,将转发脚本加入开机启动。

顺便解决一下ping问题

由于ping是无法通过socks5代理的,可以用tcping作为替代。

wget -c https://github.com/cloverstd/tcping/releases/download/v0.1.1/tcping-linux-amd64-v0.1.1.tar.gz
tar -xf tcping-*.tar.gz && rm tcping-*.tar.gz
chmod +x tcping && mv tcping /usr/bin
echo "alias ping=tcping" >> ~/.bashrc

至此,tcping完全取代了ping

总结

本文提供了一种用redsocks搭配iptables,为纯IPv6服务器添加访问IPv4能力的方案。

好处是灵活、稳定,自有双栈服务器的话,也可以不依赖Cloudflare。