基于ip6tables构建随机出口
前言
上文讲到基于Tunnelbroker搭建的随机ipv6代理,但是它的运行效率实在是低下,并发达到200左右就已经是极限。此外,Tunnelbroker政策不断在收紧,部分IDC还不允许6IN4协议,大部分waf也已经开始直接封锁/64的IPv6地址
正文
俗话说车到山前必有路,部分IDC也在更新技术,比如Buyvm提供/48的IPv6,相当于65536个/64,并且可以自己决定路由的最后一跳。这就为我们提供了很多便利
和上文一样,首先启用ip_nonlocal_bind
特性
echo "net.ipv6.ip_nonlocal_bind = 1" >> /etc/sysctl.conf
sysctl -p
然后使用命令ip a
查看自己的分配到的子网
root@localhost:~# ip a
...<此处省略一部分输出>...
inet 209.55.56.95/24 metric 100 brd 209.55.56.255 scope global dynamic eth0
valid_lft 2532037sec preferred_lft 2532037sec
inet6 2605:6466:4481::/48 scope global
valid_lft forever preferred_lft forever
inet6 2605:6434:20:554::/48 scope global
valid_lft forever preferred_lft forever
inet6 fe80::216:67ff:fefc:98a8/64 scope link
valid_lft forever preferred_lft forever
其中,2605:6466:4481::/48
就是分配到的子网。在拿到子网之后,我们为其添加路由,告诉系统这整个段都归自己了:
ip route add local <被分配的IPv6子网> dev lo
添加好路由之后,就可以用curl来验证一下了:
curl --int <子网中的随便一个IPv6地址> ip.sb
如果返回的IPv6地址和int参数指定的IPv6地址的一样就没有问题,可以开始添加ip6tables规则了。
同时使用ip6tables中的statistic和SNAT模块,就可以按一定规则指定出口ip,这里使用random模式,再递增地指定概率probability。举个例子,假如有三个IP,就可以写成:
ip6tables -t nat -A POSTROUTING -m statistic --mode random --probability 0.33 -j SNAT --to-source <IP1>
ip6tables -t nat -A POSTROUTING -m statistic --mode random --probability 0.5 -j SNAT --to-source <IP2>
ip6tables -t nat -A POSTROUTING -m statistic --mode random --probability 1.0 -j SNAT --to-source <IP3>
为什么概率要这样写,是因为ip6tables的规则是有先后顺序的,从上到下第一条有33%的概率匹配到,第二条是剩下的66%中的50%概率,而最后一个则是另外50%。这样就可以变相达到“随机”的目的。
为了方便配置,我写了一个Python脚本,有一些瑕疵,但已经可用了:
(由于潜在的滥用行为,暂时不提供脚本)
下载后执行时需要加上参数:
python3 ip6tables_rule_gen.py <子网,如2605:6466:4481::/48> <IP个数,建议4000> >> temp.sh
执行后当前目录将生成一个shell脚本temp.sh
,执行它就可以生效了
可以用以下命令来验证一下,如果每次返回都是不同的IPv6地址就成功了(Ctrl+C退出):
while true; do curl ip.sb;done
如果你想要将其搭建成代理,可以考虑使用singbox或者squid等软件,这里就不再赘述了
大佬 buyvm不会绑定 /48的ipv6 能帮忙吗有偿
wget https://raw.githubusercontent.com/Rainscall/RO6PG.sh/main/ip6tables_rule_gen.py
404 NOT FOUND
gb地址失效了
另外想付费请教大佬问题,大佬有空的话可以发联系方式到我邮箱