GRE 隧道为 BT 下载伪装地址
GRE 隧道为 BT 下载伪装地址
一、前言
总所周知,Buyvm 服务器优点有:带宽大(10Gb/s),不限流量,卢森堡抗 DMCA,无限 ipv6,可挂载存储块。但是 Buyvm 缺点为存储块 IO 较低且价格较高。buyvm 做 BT 下载器每月至少 3.5 刀服务器 + 1.5 刀存储块还是太贵了。同时我还有一台大带宽、大硬盘、高 IO 但是不抗 DMCA 的 online 服务器。
这里我们将 buyvm 当作 online 服务器的下载网关,中转下载 BT,从而实现 online 下载但是抗 DMCA 的效果。同时我们还提出了多台 online 下载服务器共用一台 buyvm 网关,共平摊 3.5 刀成本,共享 10G 带宽。
该方案为 online 上搭建 aria2 服务器,online 和 buyvm 通过 GRE 隧道链接。在下载时,外网看到的下载服务器 ip 是 buyvm 的 ip,从而实现了抗 DMCA。多个服务器共享时,每台服务分配 ipv4 的不同端口,和一个独立的 IPV6。
相较于 wireguard 方案,本方案好处是对性能的要求大大降低,可同时支持多台服务器。本方案的第二个优点是,通过对 linux 五表四链的详细研究,online 服务器无需全局转发,只需转发 aria2 流量即可。本方案的缺点是,GRE 隧道无加密,但是大部分人的 TCP 和 UDP 都在 TLS 层或者应用层进行了加密,所谓无需担心。本方案第二个缺点是,需要用户对 linux 的网络配置有一定的了解,我后面会专门讲一下怎么配置。
是的,我写这篇文章的目的就是为了宣传一下,希望大家提提建议,或者有需要的话加入我。
二、教程
2.1 安装 aria2
你们可以自行安装,也可以通过如下脚本:
wget -N "https://raw.githubusercontent.com/JarmoHu/aria2.sh/master/aria2.sh" && chmod +x aria2.sh && ./aria2.sh
该脚本基于 P3terx 大佬的脚本修改,主要是大佬好像一直不更新了,我就改了改下载源。
2.2 搭建 GRE 隧道
这里假设,中转机(如 BUYVM)的 IP 为:1.1.1.1
和 1111::
,下载机(如 IP 的)的 IP 为:2.2.2.2
和 2222::
。
其中 BUYVM 添加 IPV6 的方式网上有很多了,可以自己去搜索一下。
下载机运行如下脚本:
# 这里是添加GRE隧道叫bt,并且添加隧道内网IPV4和IPV6
ip tunnel add bt mode gre local 2.2.2.2 remote 1.1.1.1 ttl 255
ip addr add 192.168.100.2/30 peer 192.168.100.1 dev bt
ip -6 addr add FEC0::1000:2/124 peer FEC0::1000:1 dev bt
ip link set bt up
sleep 3
# 这里是新建一个路由表(编号2)
ip route add default via 192.168.100.1 dev bt table 2 src 192.168.100.2
ip -6 route add default via FEC0::1000:1 dev bt table 2 src FEC0::1000:2
# 新建路由规则,即隧道IP走上面新建的路由表2
ip rule add from 192.168.100.0/30 table 2
ip -6 rule add from FEC0::1000:0/124 table 2
# 添加默认路由指向隧道对端
ip -6 route add fec0::1000:1 dev bt proto kernel metric 256 pref medium
sleep 3
# 刷新内核参数
sysctl -p
中转机运行如下脚本:
# 这里添加gre隧道叫bt
ip tunnel add bt mode gre local 2.2.2.2 remote 1.1.1.1 ttl 255
ip addr add 192.168.100.1/30 peer 192.168.100.2 dev bt
ip -6 addr add FEC0::1000:1/124 peer FEC0::1000:2 dev bt
ip link set bt up
sleep 3
# 这里将外部51000-52000端口DNAT转发到下载机。当外部IP访问中转机这些端口(如1.1.1.1:51000),实际访问的是下载机的内网IP(192.168.100.2:51000)
iptables -t nat -A PREROUTING -d 1.1.1.1 -p tcp -m multiport --dports 51000:52000 -j DNAT --to-destination 192.168.100.2:51000-52000
iptables -t nat -A PREROUTING -d 1.1.1.1 -p udp -m multiport --dports 51000:52000 -j DNAT --to-destination 192.168.100.2:51000-52000
# 这里通过SNAT实现网关功能。即下载机发出的包,通过gre隧道来到中转机,此时中转机将源地址改为中转机的外部IP,实现IP伪装。
iptables -t nat -A POSTROUTING -s 192.168.100.0/30 -p tcp -j SNAT --to-source 1.1.1.1
iptables -t nat -A POSTROUTING -s 192.168.100.0/30 -p udp -j SNAT --to-source 1.1.1.1
# 这里ipv6所有端口都进行转发,基本原理和上述IPV4一样
ip6tables -t nat -A PREROUTING -d 1111:: -p tcp -j DNAT --to-destination FEC0::1000:2
ip6tables -t nat -A PREROUTING -d 1111:: -p udp -j DNAT --to-destination FEC0::1000:2
ip6tables -t nat -A POSTROUTING -s FEC0::1000:0/124 -p tcp -j SNAT --to-source 1111::
ip6tables -t nat -A POSTROUTING -s FEC0::1000:0/124 -p udp -j SNAT --to-source 1111::
# 添加默认路由
ip -6 route add fec0::1000:2 dev bt proto kernel metric 256 pref medium
sleep 3
# 刷新内核参数
sysctl -p
搞完之后,可以在下载机里运行 ping 192.168.100.1
,查看结果
(base) root@sd-160887:~# ping 192.168.100.1
PING 192.168.100.1 (192.168.100.1) 56(84) bytes of data.
64 bytes from 192.168.100.1: icmp_seq=1 ttl=64 time=8.62 ms
64 bytes from 192.168.100.1: icmp_seq=2 ttl=64 time=8.50 ms
64 bytes from 192.168.100.1: icmp_seq=3 ttl=64 time=8.39 ms
2.3 中转机实现路由功能
这里需要对中转机的内核参数进行一些修改,在 /etc/stsctl.conf 中添加运行转发的选项。
net.ipv6.conf.all.disable_ipv6 = 0
net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1
然后通过和 ChatGPT 合理的交流,中转机可以进行如下优化。同样建议加在 /etc/stsctl.conf 后面。
net.core.optmem_max = 25165824
net.core.netdev_max_backlog = 5000
net.core.wmem_default = 262144
net.core.rmem_default = 262144
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.somaxconn = 65535
net.ipv4.tcp_rmem=4096 87380 16777216
net.ipv4.tcp_wmem=4096 65536 16777216
# net.ipv6.tcp_rmem = 4096 87380 33554432
# net.ipv6.tcp_wmem = 4096 65536 33554432
net.ipv4.route.max_size = 16384
net.ipv6.route.max_size = 16384
net.ipv4.tcp_fastopen = 3
net.ipv4.ip_local_port_range = 10240 65535
net.ipv4.tcp_tw_reuse = 0
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_keepalive_probes = 5
net.ipv4.tcp_keepalive_intvl = 15
fs.file-max = 65536
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.default.rp_filter = 0
修改完后建议运行 sysctl -p
加载内核参数。
2.4 aria2 设置
如果你是用的我上面的脚本,设置文件路径为./.arai2c/aria2.conf
。这里说几个很关键的设置。
# 这里写上面新建的gre隧道,叫bt。我不知道为什么,当我设置为特定IP的时候(如第二行),aria2会出现不稳定的情况。
multiple-interface=bt
#multiple-interface=192.168.100.2,FEC0::1000:2
# 这里填写中转机的外部IP
bt-external-ip=1.1.1.1, 1111::
# 这是rpc的链接端口,需要填写成ipv4分配给这台下载机的端口中一个,即上述51000-52000
rpc-listen-port=51000
# BT下载端口,也是要填写分配给你的端口中的一个51000-52000
listen-port=51001
# DHT端口,建议和BT端口一样
dht-listen-port=51001
# 异步DNS,不知道为什么,反正配置之后更加稳定。注意第二行的server也要配置。1.1.1.1这里指的不是中转机IP,就是CF的DNS节点,无需修改。
async-dns=true
async-dns-server=8.8.8.8, 1.1.1.1
三、结果展示
通过 aria2 下载 ubuntu.iso 的过程如下,下载的速度达到了 700Mb/s,但是 buyvm 的 CPU 占用不到 2%,明显是支持多人使用的。
四、相关问题
- 为什么不用 socks5 或者 wireguard 代理,一定要使用 GRE?
因为 GRE 性能占用几乎为 0。我想实现多人共用一台 BUYVM,毕竟一个月 3.5 刀也不便宜了,要是为了下载 BT,不如直接冲 115 会员。至于你说我抠,emmmmm。确实是有一点吧,毕竟咱是学生啊。 - 搭建一个 http 服务器,然后用 QB 只代理 trackers 连接行不行?
我认为是不行的,只能骗过一些 PT 站,但是他们想要查还是查得到的。比如版权商在 Tracker 上登记了一个下载客户端地址,你这边获取到了这个 peer 地址,然后通过自己的客户端连接也是会暴露你的真实 ip 的。或者 DHT 交换也能把你的真实地址暴露。同时,如果你登记 Tracker 的是一个错误的地址,其他人无法主动连接你,只能你去连接其他人,如果对方开了防火墙就无法连接了。BT 比较吃保种人数,所以会影响下载速度。 - 除了下载 BT 还有别的玩法吗?
我觉得既然 IPV6 给了你了,你可以试试建站。同时 IPV4 以后建站也可使试试 haproxy 端口复用转发后端。至于你要建什么站,emmmmm,buyvm 反正访问速度慢,应该不是面向大陆。