GitHub:
Docker Hub:
https://hub.docker.com/r/bitcometpostbar/bitcomet
目前主要的功能是
-
NAT 映射行为检测
通过 STUN 的 Binding Request 获取公网 IP 地址与端口,检测每次访问是否一致
可判断 锥形 NAT,对称形 NAT,公网 IP
由于不检测过滤行为,所以不区分 NAT 1-3,默认用户为 NAT3
-
STUN 穿透
仅在 锥形 NAT 下启用;对称形 NAT 无法穿透,公网 IP 不需要穿透
目前支持传统模式,也就是热更新 BitComet 的监听端口,仅可在 host 网络下使用
后续会新增改包模式,也就是使用 nftables 修改 Tracker 汇报信息,可在 host 与 bridge 及其他网络下使用,但需要 NET_ADMIN 权限
此前脚本由于操作难度的原因,未支持 HTTPS Tracker 改包,但容器内可预先集成
-
PeerBanHelper
-
默认设置项目调教
详细内容请查看以上链接,欢迎试用反馈
3個讚
目前文档还未完善,以下是初步的使用方法
拉取镜像(只使用默认的 latest
标签)
docker pull bitcometpostbar/bitcomet:latest
执行命令
docker run -d \
--name BitComet \
--net host \
-v /BC目录:/BitComet \
-v /DL目录:/Downloads \
-v /PBH目录:/PeerBanHelper \
-e BITCOMET_WEBUI_USERNAME='BC WebUI 用户名' \
-e BITCOMET_WEBUI_PASSWORD='BC WebUI 密码' \
-e BITCOMET_WEBUI_PORT='BC WebUI 端口' \
-e BITCOMET_BT_PORT=‘BC BT 端口’ \
-e PBH_WEBUI_TOKEN='PBH Token' \
-e PBH_WEBUI_PORT='PBH WebUI 端口' \
bitcometpostbar/bitcomet:latest
BC / PBH 的 WebUI 鉴权信息及端口如未指定,会自动生成并输出到日志
如未挂载目录,则存储在容器层,重启后可能丢失
可先使用以下命令测试运行
docker run -d --name bc_test --net host bitcometpostbar/bitcomet:latest
其他设置使用环境变量控制,后续补充
1個讚
然后在自己塞一些配置文件docker优化代替默认值,我现在nas里用的供参考,也可以照抄
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<BitComet>
<Settings>
<DiskCacheMaxSizeMB>256</DiskCacheMaxSizeMB>
<LTSeedCacheMaxSizeMB>256</LTSeedCacheMaxSizeMB>
<StartupAutoRunTask>true</StartupAutoRunTask>
<PassportLastUser></PassportLastUser>
<PassportLastUserPassword></PassportLastUserPassword>
<GlobalMaxUploadRate>10485760</GlobalMaxUploadRate>
<ConditionAutoStopTask>false</ConditionAutoStopTask>
<bittorrent.max_connections_per_ltseed>10</bittorrent.max_connections_per_ltseed>
<network.max_connections>1500</network.max_connections>
<ListenPort>6082</ListenPort>
<network.start_connect_interval_ms>0</network.start_connect_interval_ms>
<network.max_connecting_connections>60</network.max_connecting_connections>
<network.max_connecting_connections_per_tracker>10000</network.max_connecting_connections_per_tracker>
<network.tcp_connection_timeout>10</network.tcp_connection_timeout>
<LastSaveLocation>/root/Downloads</LastSaveLocation>
<bittorrent.enable_v1_upgrade_to_v2>true</bittorrent.enable_v1_upgrade_to_v2>
<bittorrent.torrent_http_try_max_count>1000</bittorrent.torrent_http_try_max_count>
<bittorrent.torrent_http_try_interval>5</bittorrent.torrent_http_try_interval>
<system.compact_memory_interval>0</system.compact_memory_interval>
<dht.udp_send_queue_threshold>1</dht.udp_send_queue_threshold>
<network.dns_query_thread_count>100</network.dns_query_thread_count>
<network.enable_open_dns>false</network.enable_open_dns>
<EnableDHT>false</EnableDHT>
<bittorrent.anti_leech_stable_sec>180</bittorrent.anti_leech_stable_sec>
<bittorrent.anti_leech_min_byte>10000</bittorrent.anti_leech_min_byte>
<bittorrent.anti_leech_banned_ports>15000</bittorrent.anti_leech_banned_ports>
<bittorrent.anti_leech_banned_peer_ids>XL0018</bittorrent.anti_leech_banned_peer_ids>
<RssFetchInterval>2</RssFetchInterval>
<RssFeedMaxItems>5</RssFeedMaxItems>
<EnableAutoDownloadRssTorrent>true</EnableAutoDownloadRssTorrent>
<bittorrent.utp_after_holepunch>0</bittorrent.utp_after_holepunch>
<bittorrent.save_connected_peers_only>true</bittorrent.save_connected_peers_only>
<bittorrent.separate_sources_for_failed_piece>false</bittorrent.separate_sources_for_failed_piece>
<bittorrent.max_torrent_size_mb>100</bittorrent.max_torrent_size_mb>
<HttpDownloadTryAgainMaxCount>10000</HttpDownloadTryAgainMaxCount>
<HttpDownloadDefaultConnectionNumber>300</HttpDownloadDefaultConnectionNumber>
<http.max_mirror_count>1000</http.max_mirror_count>
<HttpDownloadConnectionCacheSize>16777216</HttpDownloadConnectionCacheSize>
<TotalUpload>0</TotalUpload>
<TotalDownload>0</TotalDownload>
<WebInterfaceUsername>admin</WebInterfaceUsername>
<WebInterfacePassword>itzmx.com</WebInterfacePassword>
<WebInterfacePort>6080</WebInterfacePort>
<EnableAddTrackerList>true</EnableAddTrackerList>
<TrackerListForNewTorrent>http://tracker1.itzmx.com:8080/announce
http://tracker2.itzmx.com:6961/announce
http://tracker3.itzmx.com:6961/announce
http://tracker4.itzmx.com:2710/announce
udp://tracker1.itzmx.com:8080/announce
udp://tracker2.itzmx.com:6961/announce
udp://tracker3.itzmx.com:6961/announce
udp://tracker4.itzmx.com:2710/announce
http://tracker.opentrackr.org:1337/announce
udp://tracker.opentrackr.org:1337/announce</TrackerListForNewTorrent>
<TrackerListUpdateUrl>http://github.itzmx.com/1265578519/OpenTracker/master/tracker.txt</TrackerListUpdateUrl>
<TrackerListUpdateUrlList>http://github.itzmx.com/1265578519/OpenTracker/master/tracker.txt</TrackerListUpdateUrlList>
<EnableBtTaskIpFilter>true</EnableBtTaskIpFilter>
</Settings>
</BitComet>
注:v2.12.3版network.tcp_connection_timeout不起效果,会强制默认值为128秒超时,也就是说这个v2.12.3版本可以调整network.max_connecting_connections为750,后续修复了在改回60
1個讚
感谢,目前设置方面还没动,到时候参考。
改包和 HTTPS 解密已经完成了
但在测试中发现 natmap 在一些情况下缺乏灵活性,现在打算干脆自己手搓一个 STUN 方案
正式版已构建
支持 nftables 改包,以及基于 socat 的纯手搓 STUN 方案
执行日志示例如下
开始执行 BitComet 贴吧修改版
/BitComet 目录未挂载
/PeerBanHelper 目录未挂载
应用程序配置及数据保存到容器层,重启后可能会丢失
BitComet 配置文件不存在,执行初始化
/Downloads 目录未挂载,默认保存位置在容器层,重启后可能会丢失
未挂载任何自定义下载目录
BitComet WebUI 用户名未指定,随机生成以下 8 位用户名
OWM2ODU1
BitComet WebUI 密码未指定,随机生成以下 16 位密码
ZTIyNmE4NTYtMzJh
BitComet WebUI 用户名与密码已保存至 /BitComet/Secrect
BitComet WebUI 端口未指定,自动分配
PeerBanHelper 配置文件不存在,执行初始化
PeerBanHelper WebUI Token 未指定,随机生成以下 Token
5b002f92-7c4c-4fb8-b419-88dfda4abae1
PeerBanHelper WebUI Token 已保存至 /PeerBanHelper/Secrect
PeerBanHelper 未配置本机 BitComet,执行初始化
BitComet BT 端口未指定,自动分配
BitComet BT 端口当前为 56082
检测当前为 host 网络
已启用 STUN,更新 STUN 服务器列表,最多等待 15 秒
更新 STUN 服务器列表成功
已加载 61 个 STUN 服务器
检测 TCP 映射行为
使用 56082/tcp 进行第 1 次绑定请求
使用 56082/tcp 进行第 2 次绑定请求
两次端口一致,当前 TCP 为锥形映射
56082/tcp 的检测结果如下
191.231.117.63:54249 via 95.216.78.222:3478
191.231.117.63:54249 via 157.161.10.32:3478
检测 UDP 映射行为
使用 56082/udp 进行第 1 次绑定请求
使用 56082/udp 进行第 2 次绑定请求
两次端口一致,当前 UDP 为锥形映射
56082/udp 的检测结果如下
191.231.117.63:54260 via 23.21.199.62:3478
191.231.117.63:54260 via 44.230.252.214:3478
当前使用 TCP + UDP 改包模式
已启用 STUN,BitComet BT 端口 56082 将作为穿透通道的本地端口
已启用 UPnP,添加规则后再启动 BitComet
本次 UPnP 规则:转发 外部端口 56082/tcp 至 内部端口 56082/tcp
未找到 IGD UPnP 设备,尝试使用 br-lan 接口
更新 UPnP 规则成功
本次 UPnP 规则:转发 外部端口 56082/udp 至 内部端口 56082/udp
更新 UPnP 规则成功
BitComet BT 端口未监听,3 秒后重试
BitComet launched in console mode.
To quit program gracefully, press Ctrl + C
BitComet 2.12 is running on:
CPU : 12th Gen Intel(R) Core(TM) i5-12500T
RAM Size : 981.7 MB
OS Version: Ubuntu 24.04.1 LTS
Configuration file folder: /home/bitcomet/.config/BitComet
Metadata cache folder: /home/bitcomet/.config/BitComet/torrent_cache
The username of Web UI is specified in environment variable: OWM2ODU1
The password of Web UI is specified in environment variable.
Connecting DHT Network...
The TCP listen port for BitTorrent is specified in environment variable: 56082
The TCP listen port for Web UI is specified in environment variable: 8080
TCP listen port for BitTorrent: 56082
TCP listen port for WebUI: 8080
IPFilter loaded. record count = 0
IP2Location data loaded. version = 2024-5-1
IP2Location multilingual file loaded.
WebUI file loaded from /files/BitComet/share/resources/webui/webui.zip
BitComet 已启动,使用以下地址访问 WebUI
http://10.108.179.74:8080
http://10.24.8.1:8080
http://100.64.103.183:8080
http://11.124.88.254:8080
http://172.17.0.1:8080
http://172.26.3.118:8080
http://192.168.11.3:8080
http://192.168.12.3:8080
http://192.168.8.1:8080
http://192.168.8.2:8080
已启用 PeerBanHelper,60 秒后启动
当前 STUN 心跳间隔为 25 秒
本次穿透通道为 191.231.117.63:50416/tcp
当前为改包模式,更新 nftables 规则
获取 HTTPS Tracker 列表,最多等待 15 秒
获取 HTTPS Tracker 列表成功
解析 HTTPS Tracker 列表,可能需要一些时间
已加载 227 个 HTTPS Tracker
更新 nftables 规则完成
本次 UPnP 规则:转发 外部端口 56082/tcp 至 内部端口 56082/tcp
检测到软件加速,绕过 Tracker 流量
更新 UPnP 规则成功
已启用 TCP 通道,执行 HTTP 保活
若保活失败,穿透通道可能需要在缩短心跳间隔后才稳定
更新 HTTP 服务器列表,最多等待 15 秒
191.231.117.63:50416/tcp 连通性检测成功
当前 STUN 心跳间隔为 25 秒
本次穿透通道为 191.231.117.63:54260/udp
当前为改包模式,更新 nftables 规则
更新 HTTP 服务器列表成功
已加载 100 个 HTTP 服务器
更新 nftables 规则完成
本次 UPnP 规则:转发 外部端口 56082/udp 至 内部端口 56082/udp
更新 UPnP 规则成功
191.231.117.63:54260/udp 连通性检测成功
PeerBanHelper 已启动,使用以下地址访问 WebUI
http://10.108.179.74:9898
http://10.24.8.1:9898
http://100.64.103.183:9898
http://11.124.88.254:9898
http://172.17.0.1:9898
http://172.26.3.118:9898
http://192.168.11.3:9898
http://192.168.12.3:9898
http://192.168.8.1:9898
http://192.168.8.2:9898
清理容器环境
2025/03/01 18:00:38 socat[1364] W exiting on signal 15
清理 nftables 规则完成
Session terminated, killing shell...
1個讚
文档已完善,初期测试稳定,欢迎有兴趣的用户试用并反馈
TODO
- 初始配置优化
- 自主 UPnP/NAT-PMP/PCP
- 移植其他下载器
- Windows + PowerShell 自动 STUN 的可行性
1個讚
能不能增加一个方法:虽然是公网映射,但是没有权限,或者无法放行端口,也能够开启STUN?
显式指定环境变量 STUN=1
时,即使检测结果为公网映射,仍然执行 STUN
1個讚
STUN=1 无效,依然自动禁用。
docker run -d --name BitComet --net host -v /home/BitComet:/BitComet -v /home/Downloads:/Downloads -v /home/PBH:/PeerBanHelper -e STUN=1 bitcometpostbar/bitcomet:latest
上面没说清楚。
这个是昨天才加的方法,要重新拉取镜像。
已启用 STUN,更新 STUN 服务器列表,最多等待 15 秒
更新 STUN 服务器列表成功
已加载 62 个 STUN 服务器
检测 TCP 映射行为
使用 56082/tcp 进行第 1 次绑定请求
使用 56082/tcp 进行第 2 次绑定请求
内外端口一致,当前 TCP 为公网映射
56082/tcp 的检测结果如下
60.8.8.49:56082 via 159.69.191.124:3478
60.8.8.49:56082 via 159.69.191.124:3478
检测 UDP 映射行为
使用 56082/udp 进行第 1 次绑定请求
使用 56082/udp 进行第 2 次绑定请求
内外端口一致,当前 UDP 为公网映射
56082/udp 的检测结果如下
60.8.8.49:56082 via 157.161.10.32:3478
60.8.8.49:56082 via 192.172.233.145:3478
当前网络为公网映射;显示指定 STUN = 1 时,跳过自动禁用
未指定 STUN 穿透模式,自动设置
未开启 NET_ADMIN 权限,使用 TCP 传统模式
已启用 STUN,BitComet BT 端口 56082 将作为穿透通道的本地端口
刚测试了一下
由于公网映射的内外端口一致,因此在传统模式下会出现端口占用的问题
BitComet 目前不支持端口复用,虽然有一些方法可以开启复用,但需要较高版本内核以及额外的权限,暂不考虑
如果要在公网映射下强制开启 STUN,需要使用改包模式(添加 NET_ADMIN
权限)
改包模式是通过 NAT 在连接跟踪的层面上实现端口复用的
docker run -d --name BitComet --net host --cap-add NET_ADMIN -v /home/BitComet:/BitComet -v /home/Downloads:/Downloads -v /home/PBH:/PeerBanHelper -e STUN=1 bitcometpostbar/bitcomet:latest
1個讚