PT连不上Tracker的通用方法
前言
因为目前PT站大多套了Cloudflare CDN,默认IP在中国大陆的访问体验不甚友好,我们需要自行选择较为友好的IP。
我最推荐的方式是用CloudflareSpeedTest检测适合你的优选IP,Windows用户使用3Proxy转发流量,Linux用户使用mosdns自建dns。这样的好处是所有套了cf cdn的站点都会自动被优选,无需手动添加;并且考虑到Transmission不会主动上报ipv6地址,故添加了ipv6优选。
直接说结论
用CloudflareSpeedTest检测适合你的优选IP,Windows用户使用3Proxy转发流量,Linux用户使用mosdns自建dns。
因为目前PT站大多套了Cloudflare CDN,默认IP在中国大陆的访问体验不甚友好,我们需要自行选择较为友好的IP。
注意:测速时下载速度为零是正常现象,因为默认的测速域名已被封禁,如需按下载速度优选则需要使用自己的域名,参考这里,或者直接使用Cloudflare官方的测试连接https://speed.cloudflare.com/__down?bytes=size,size建议在100MB以下,即104857600以下。
OpenWrt+透明代理
如果你在OpenWrt上配置了透明代理,且路由的性能强劲,可以考虑直接安装路由器版的Mosdns,一般都自带CloudflareIP优选功能,然后将代理的dns指向mosdns。
注意:测速时需要暂时关闭代理,或者可以考虑以较为靠后的优先级将ip.txt中的Cloudflare IP设为直连,在靠前的优先级手动添加你希望走代理的域名。
当然你也可以现在代理规则中设置一个直连IP,然后用脚本自动更新,具体参考我之后贴出的脚本。
如果你的路由器性能较弱,可以考虑用iptables直接重定向IP,但这样可能会使路由器无法代理其他设备向Cloudflare发起的请求,参考这里。
Windows用户
如果你的PT客户端直接跑在Windows上,仅需要加速pt站的访问,愿意在HOSTS中手动添加域名,可以参考这里。
如果希望一劳永逸加速所有的Cloudflare网站,请参考这个教程。
如果你使用了代理,考虑以较为靠后的优先级将ip.txt中的Cloudflare IP设为直连,在靠前的优先级手动添加你希望走代理的域名。
默认的3Proxy配置似乎会影响IPv6访问,影不影响peers的连接我还没有测试过。
请注意,3Proxy无法与运行在Windows上的代理直接共存,需要手动设置回落规则和绕过规则。
Linux用户
如果你的PT客户端直接跑在Linux上,仅需要加速pt站的访问,愿意在HOSTS中手动添加域名,可以参考这里。
如果希望一劳永逸加速所以的Cloudflare网站,参考这里以及我下面的更新脚本。
为了避免出现奇奇怪怪的问题,如果在本机跑mosdns,可以考虑将端口设为53以外的端口;之后在DNSmasq中添加mosdns的地址。
Docker用户
如果你的宿主机不支持或者不建议安装软件(部分NAS),或者无法持久化保存/etc, /opt等路径,只能使用Docker,可以参考以下流程:
下载软件和脚本
下载对应架构的CloudflareSpeedTest,将ip.txt重命名为cf_ip.txt,ipv6.txt重命名为cf_ipv6.txt。。
编辑脚本cfst_mosdns.sh如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
# --------------------------------------------------------------
# 项目: CloudflareSpeedTest 自动更新 mosdns 配置
# 版本: 1.2.0
# 作者: XIU2,Sving1024
# 项目: https://github.com/XIU2/CloudflareSpeedTest
# --------------------------------------------------------------
_UPDATE() {
echo -e "开始测速..."
# 这里可以自己添加、修改 CloudflareST 的运行参数
./CloudflareST -url "https://speed.cloudflare.com/__down?bytes=104857600" -f "cf_ip.txt" -o "result_hosts.txt"
[[ ! -e "result_hosts.txt" ]] && echo "CloudflareST 测速结果 IP 数量为 0,跳过下面步骤..." && exit 0
BESTIP=$(sed -n "2,1p" result_hosts.txt | awk -F, '{print $1}')
if [[ -z "${BESTIP}" ]]; then
echo "CloudflareST 测速结果 IP 数量为 0,跳过下面步骤..."
exit 0
fi
echo ${BESTIP} > nowip_hosts.txt
echo -e "最优 IP 为 ${BESTIP}\n"
#选取最优IPv6
./CloudflareST -url "https://speed.cloudflare.com/__down?bytes=104857600" -f "cf_ipv6.txt" -o "result_hosts_v6.txt"
[[ ! -e "result_hosts_v6.txt" ]] && echo "CloudflareST 测速结果 IP 数量为 0,跳过下面步骤..." && exit 0
BESTIPV6=$(sed -n "2,1p" result_hosts_v6.txt | awk -F, '{print $1}')
if [[ -z "${BESTIPV6}" ]]; then
echo "CloudflareST 测速结果 IP 数量为 0,跳过下面步骤..."
exit 0
fi
echo ${BESTIPV6} > nowipv6_hosts.txt
echo -e "最优 IP 为 ${BESTIPV6}\n"
# 通过模板更新 YAML 文件
if [[ -f "config_template.yaml" ]]; then
if [[ -f "config.yaml" ]]; then
\cp -f config.yaml config.bak
echo "已备份 config.yaml 到 config.bak"
fi
sed -e "s/\${{CF_IP}}/${BESTIP}/g" -e "s/\${{CF_IPV6}}/${BESTIPV6}/g" config_template.yaml > config.yaml
echo -e "已更新 config.yaml 文件,最佳ipv4: ${BESTIP}, 最佳ipv6: ${BESTIPV6}\n"
else
echo "config_template.yaml 文件不存在,跳过 YAML 文件更新。"
fi
}
_UPDATE编辑
config_template.yaml如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46log:
level: info
plugins:
- tag: query
type: forward
args:
concurrent: 2
upstreams:
- addr: "https://1.12.12.12/dns-query"
- addr: "https://223.6.6.6/dns-query"
- tag: lazy_cache
type: cache
args:
size: 10240
lazy_cache_ttl: 86400
- tag: cf_ips
type: ip_set
args:
files: "/etc/mosdns/cf_ip.txt" # 将 ip.txt 重命名放在 /etc 下
- tag: cf_ipv6s
type: ip_set
args:
files: "/etc/mosdns/cf_ipv6.txt" # 将 ipv6.txt 重命名放在 /etc 下
- tag: seq
type: sequence
args:
- exec: $lazy_cache
- exec: $query
- matches:
- qtype 1
- resp_ip $cf_ips
exec: black_hole ${{CF_IP}}
- matches:
- qtype 28
- resp_ip $cf_ipv6s
exec: blackhole ${{CF_IPV6}}
- tag: udp_server
type: udp_server
args:
entry: seq
listen: 0.0.0.0:53 # 只给本机用的话,记得改成 127.0.0.1:53请自行修改forward后的ip为你希望用的dns
如果你希望使用自己的配置,请在cf优选IP的位置填入${{CF_IP}}和${{CF_IPV6}}。在MACVLAN或者IPVLAN网络中运行bash容器
如果你配置了透明代理,先添加一个未占用的局域网IP至黑名单(不代理)
把第一步中的所有文件放到合适的目录下,映射到容器中/app;给bash容器分配刚才设置的局域网IP(示例中为10.1.2.125),注意修改自定义网络名称br0为你的Docker对应接口。1
docker run -it --rm --name cfst --network br0 --ip 10.1.2.125 -v /mnt/user/appdata/mosdns:/app bash -c "cd /app && chmod +x cfst_mosdns.sh && chmod +x CloudflareST && ./cfst_mosdns.sh"
检查结果和生成的
config.yaml配置文件。在MACVLAN或者IPVLAN网络中运行mosdns容器
别忘了把cf_ip.txt、cf_ipv6.txt和config.yaml映射进容器。
我的命令如下1
2
3
4
5
6
7
8
9
10
11docker run
-d
--name='mosdns-1'
--net='br0'
--ip='10.1.2.126'
-e TZ="Asia/Shanghai"
-e 'TCP_PORT_53'='53'
-e 'UDP_PORT_53'='53'
-v '/mnt/user/appdata/mosdns/config.yaml':'/etc/mosdns/config.yaml'
-v '/mnt/user/appdata/mosdns/cf_ip.txt':'/etc/mosdns/cf_ip.txt'
-v '/mnt/user/appdata/mosdns/cf_ipv6.txt':'/etc/mosdns/cf_ipv6.txt' '601096721/mosdns'修改PT客户端的docker命令
在docker run后、镜像名前加入--dns 10.1.2.125参数可以指定容器的dns,注意修改为自己的mosdns的ip。
在unraid中,这个参数加在Extra Parameters里,其他系统和docker-compose请自行探索。配置计划任务
1
2
3
docker run --rm --name cfst --network br0 --ip 10.1.2.125 -v /mnt/user/appdata/mosdns:/app bash -c "cd /app && chmod +x cfst_mosdns.sh && chmod +x CloudflareST && ./cfst_mosdns.sh"
docker restart mosdns-1
注意:一般来说ip优选无需特别频繁,如果你经常看的话,建议发现大规模红种再手动优选,不常看的话一周优选一次也够了;只有在晚高峰线路状况明显变差极个别网络情况下,才需要早晚各优选一次。