PT连不上Tracker的通用方法
qaz741wsd856 Lv2

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,可以参考以下流程:

  1. 下载软件和脚本
    下载对应架构的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
    #!/usr/bin/env bash
    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
    46
    log:
    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}}​。

  2. 在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​配置文件。

  3. 在MACVLAN或者IPVLAN网络中运行mosdns容器
    别忘了把cf_ip.txt​、cf_ipv6.txt​和config.yaml​映射进容器。
    我的命令如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    docker 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'
  4. 修改PT客户端的docker命令
    docker run​后、镜像名前加入--dns 10.1.2.125​参数可以指定容器的dns,注意修改为自己的mosdns的ip。
    在unraid中,这个参数加在Extra Parameters​里,其他系统和docker-compose请自行探索。

  5. 配置计划任务

    1
    2
    3
    #!/usr/bin/env bash
    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优选无需特别频繁,如果你经常看的话,建议发现大规模红种再手动优选,不常看的话一周优选一次也够了;只有在晚高峰线路状况明显变差极个别网络情况下,才需要早晚各优选一次。