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.11111::,下载机(如 IP 的)的 IP 为:2.2.2.22222::
其中 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%,明显是支持多人使用的。
image

四、相关问题

  1. 为什么不用 socks5 或者 wireguard 代理,一定要使用 GRE?
    因为 GRE 性能占用几乎为 0。我想实现多人共用一台 BUYVM,毕竟一个月 3.5 刀也不便宜了,要是为了下载 BT,不如直接冲 115 会员。至于你说我抠,emmmmm。确实是有一点吧,毕竟咱是学生啊。
  2. 搭建一个 http 服务器,然后用 QB 只代理 trackers 连接行不行?
    我认为是不行的,只能骗过一些 PT 站,但是他们想要查还是查得到的。比如版权商在 Tracker 上登记了一个下载客户端地址,你这边获取到了这个 peer 地址,然后通过自己的客户端连接也是会暴露你的真实 ip 的。或者 DHT 交换也能把你的真实地址暴露。同时,如果你登记 Tracker 的是一个错误的地址,其他人无法主动连接你,只能你去连接其他人,如果对方开了防火墙就无法连接了。BT 比较吃保种人数,所以会影响下载速度。
  3. 除了下载 BT 还有别的玩法吗?
    我觉得既然 IPV6 给了你了,你可以试试建站。同时 IPV4 以后建站也可使试试 haproxy 端口复用转发后端。至于你要建什么站,emmmmm,buyvm 反正访问速度慢,应该不是面向大陆。