我正在考虑在与 torrent 相关网站所在的同一台专用服务器上设置 torrent 跟踪器。我想这样做是因为我的网站和跟踪器将相互交互,我希望这些交互顺畅,并且不想干扰复制。
我将使用 cloudflare 或其他 CDN 来防止我的网站遭受 DDOS 攻击。但我还想保护在不同端口上运行的 http torrent tracker (XBT tracker)。因此,我还希望 torrent 像通过代理一样通过 CDN,但不使用缓存和验证码,因为 torrent 软件无法解决验证码。是否可以通过像 cloudflare 这样的 CDN 代理 http torrent-tracker,或者我必须为 torrent-tracker 订购额外的 DDOSable 服务器?
答案1
我不认为你会得到任何事物通过使用 CloudFlare 或任何其他 CDN 作为 Torrent Tracker。
CDN 的全部意义在于通过以下方式卸载工作:缓存对请求的答复。
使用 torrent 跟踪器时,每个请求对于每个客户端来说几乎都是唯一的。
因此它们无法被缓存(或者即使它们被缓存也不会有任何区别),这使得 CDN 对于该特定类型的工作负载基本上毫无用处。
以 TL 为例。这是一个巨大的私人种子追踪器。它的网站在 CloudFlare 上,但它的追踪器在卢森堡的服务器上。似乎没有涉及 CDN。该 IP 后面可能有一个集群能够处理所有请求,但我猜不是 CDN。
客户每次提出的每个请求都是唯一的。
此 GET 消息的示例可能是:
http://some.tracker.com:999/announce ?info_hash=12345678901234567890 &peer_id=ABCDEFGHIJKLMNOPQRST &ip=255.255.255.255 &port=6881 &downloaded=1234 &left=98765 &event=stopped
https://wiki.theory.org/BitTorrent_Tracker_Protocol
更多细节:http://www.bittorrent.org/beps/bep_0003.html
即使所有客户端的每个参数都相同(但事实并非如此 - 根据 BEP0003,每个客户端、每个 torrent 的 peerid 都是唯一的),您仍然会在其中拥有独特的内容每个客户每个请求.例如:
&downloaded=1234
&left=98765
上述参数会随着 torrent 客户端的每次后续请求而变化,具体取决于自上次请求以来的流量。
CDN 通常会根据请求 URI 缓存内容。因此,如果每次请求都是唯一的,它将无法提供任何缓存内容,从而违背了其目的。
现在我想起来,如果你的追踪器是匿名的,你可以,或许,在 Varnish 上使用非常自定义的配置,以便能够缓存每个 info_hash 的回复,忽略请求的唯一性。但这样您的跟踪器将无法测量任何实际统计数据(总启动/关闭/对等/等等),因为只有一小部分请求会到达跟踪器。
这样,您就无法真正受到 DDoS 攻击的保护(尽管 Varnish 是一款很棒的软件,可以处理大量请求!)
更新:
有少数提供商拥有 DDoS 保护硬件(例如:Arbor Peakflow)。这些硬件可让您在没有任何 CDN 或缓存的情况下运行跟踪器,并能够阻止 DDoS 攻击到达您的服务器。但当然,这样的解决方案也有自己的成本 :)
答案2
我迟了将近 5 年,但这更多是针对谷歌搜索的人。我的跟踪器实际上位于 Cloudflare 后面,因为它有助于为使用 IPv6 的用户路由流量。它有助于确保他们被路由为使用 IPv4 作为跟踪器。它允许更多人使用跟踪器。如果我愿意,我也可以添加 DDOS 保护,但我使用页面规则来绕过缓存和许多其他选项。
您的页面规则应如下所示:
http://tracker.example.com:8080/*
Cache Level: Bypass
和
http://tracker.example.com:2052/*
Cache Level: Bypass
首先,您必须查找 Cloudflares 支持的端口,使用适合您的端口。这里有一个列表:
默认情况下,Cloudflare 代理发往下面列出的 HTTP/HTTPS 端口的流量。
Cloudflare 支持的 HTTP 端口:
80
8080
8880
2052
2082
2086
2095
Cloudflare 支持的 HTTPS 端口:
443
2053
2083
2087
2096
8443
然后你需要将 Nginx 放在你的 torrent tracker 前面。例如,如果你使用 Xbt Tracker,你需要像这样使用 Nginx 重写,在 conf.d 文件夹中的“default.conf”或你想命名为 .conf 的任何文件中:
server {
listen 8080;
server_name localhost;
location / {
rewrite ^(.*)$ $1?ip=$remote_addr break;
proxy_pass http://127.0.0.1:2052/;
proxy_redirect off;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
access_log off;
log_not_found off;
}
}
基本上,您将从端口 2052 运行您的跟踪器,然后从端口 8080 运行代理的 Nginx。然后您将端口 8080 插入到您的种子中。
我认为就是这样,你可以了解如何向 Nginx 添加更多选项,例如工作者数量和保持活动时间。
如果您没有将 Nginx 放在跟踪器前面,那么跟踪器将获取所有 Cloudflare IP 地址,并且无法正确通信和跟踪。
另外,在 Nginx conf.d 文件夹中创建另一个名为 cloudflare.conf 的文件,并将以下内容放入其中,这将允许您获取真实的 IP:
set_real_ip_from 103.21.244.0/22;
set_real_ip_from 103.22.200.0/22;
set_real_ip_from 103.31.4.0/22;
set_real_ip_from 104.16.0.0/12;
set_real_ip_from 108.162.192.0/18;
set_real_ip_from 131.0.72.0/22;
set_real_ip_from 141.101.64.0/18;
set_real_ip_from 162.158.0.0/15;
set_real_ip_from 172.64.0.0/13;
set_real_ip_from 173.245.48.0/20;
set_real_ip_from 188.114.96.0/20;
set_real_ip_from 190.93.240.0/20;
set_real_ip_from 197.234.240.0/22;
set_real_ip_from 198.41.128.0/17;
set_real_ip_from 2400:cb00::/32;
set_real_ip_from 2405:8100::/32;
set_real_ip_from 2405:b500::/32;
set_real_ip_from 2606:4700::/32;
set_real_ip_from 2803:f800::/32;
set_real_ip_from 2c0f:f248::/32;
set_real_ip_from 2a06:98c0::/29;
real_ip_header CF-Connecting-IP;
尽情享受吧。并监控数据库的正确 Ips,以确保其正常运行。