OpenWrt(Linux)下针对 BT 的全自动 STUN 内网穿透(Lucky 版图文教程)
泥浆
编辑于 2024年11月06日 15:28

本文章内容已过时,请查看项目说明

https://gitee.com/oniicyan/stun_bt

本文基于《OpenWrt/WSL下利用nftables修改向Tracker汇报的端口,实现BT下载的全自动STUN内网穿透​》

细节内容请查看以上链接,建议阅读完「前言」部分。

原文内容较为繁琐,很多用户可能不习惯 NATMap 的配置方式。

本文展示更为流行的 STUN 工具 :Lucky 的配置方法。

本文提供方案的特点是通过网关修改 BT 软件向 Tracker 汇报的端口号,因此对 BT 软件透明,不需要程序 API 的支持,并且支持同时对单一 BT 程序的 TCP + UDP,以及多条接入宽带的穿透。

本方案可能不适用于 PT。

由于私有 Tracker 会统计用户的端口信息,若同时发布多个端口可能被判断为作弊。

按 Ctrl + S 键, 保存为 mhtml 文件后打开即可无尾巴复制

右键在新标签页中放大图像

环境要求

本文针对无 IPv4 公网,且宽带为全锥形 NAT(即 NAT1)的用户。

一般来说,即使检测工具显示端口受限锥形 NAT(即 NAT3),实际上运营商提供的是全锥形,也可实现穿透。

以下的情况可能无法穿透

1. 使用电信、联通、移动以外的二级运营商宽带,广电宽带未确认

2. PCDN 严打地区,可能提供对称形 NAT(即 NAT4)

3. 公司或出租屋等多层 NAT 拓扑,且用户无管理权限

本文示例使用 OpenWrt 主路由,但适用与任何使用 nftables 的网关。

未持有 OpenWrt 网关,且使用 Windows 的用户,可配置 WSL2 作为旁路由实现穿透。

运行在 OpenWrt 旁路由,且主路由 UPnP 组件开启安全模式时,需要配置代理服务器。

关于 WSL2 与 UPnP 安全模式请查看原文​

本文省略 Lucky 的安装过程,详细请访问官网 https://lucky666.cn/ 或使用搜索引擎

操作过程

1. 确认防火墙框架

本文的方案基于 nftables,虽然使用 iptables 也可实现同样的效果,但不在考虑范围内。

浏览器访问路由器,Web 管理页中,打开 “状态 -- 防火墙”

确认浏览器地址栏的 URL 结尾是否显示 nftables

若显示 iptables,请更新路由器固件

若无法更新到预装 nftables 的固件,可尝试手动安装 nftables,具体看文末

若使用 WSL2 或其他 Linux 发行版,可执行以下命令确认是否安装了 nftables

代码块
Shell
自动换行
复制代码
nft -v
复制成功

显示版本信息则已安装

2. 安装所需软件包

除 Lucky 外,还需要使用几个软件包

Web 管理页中,打开 “系统 -- 软件包”,点击 “更新列表”

更新列表可能需要一些时间

若等待时间太长,请更换软件源,操作方法建议搜索 "openwrt 清华"

更新列表完成后,在 “下载并安装软件包” 中输入以下 2 个软件包名称并确认安装

curl

xxd

miniupnpc 仅在运行在旁路由时需要,但主路由安装了也没有影响

Lucky 运行在旁路由,且主路由 UPnP 组件开启安全模式时,还需要安装 proxychains,详细内容请查看原文​

其他 Linux 发行版所需的软件包相同,请自行解决

3. 配置 Lucky

浏览器访问 Lucky 页面,默认地址为 http://[路由器 IP]:16601

点击左侧导航栏 “STUN内网穿透”,页面中点击 “添加穿透规则”

注意,大按钮可能无法弹出页面,请尝试点击中间的小按钮

弹出的页面中,配置如下

规则名称:任意,不能留空且不能重复

操作模式:默认为简易模式,仅在多 WAN 时需要选择定制模式,后述

穿透类型:本脚本同时支持 TCP 与 UDP,但需要单独配置,后述

穿透通道本地端口:设置 1024-65535 之间的数字,要求未被其他服务监听

防火墙自动放行:关闭,由脚本配置防火墙规则

UPnP:关闭,由脚本配置 UPnP

NAT-PMP:关闭,同上

不使用Lucky内置端口转发:启用,由脚本配置端口转发

自定义脚本触发:启用

粘贴以下脚本内容,并指定相关信息

代码块
Shell
自动换行
复制代码
IFNAME=
APPADDR=192.168.1.168
APPPORT=61128
L4PROTO=tcp

[ -e /usr/stun_bt_lucky.sh ] || curl -Lso /usr/stun_bt_lucky.sh https://gitee.com/oniicyan/stun_bt/raw/master/stun_bt_lucky.sh
sh /usr/stun_bt_lucky.sh ${ip} ${port} $L4PROT $APPADDR $APPPORT $IFNAME
复制成功

IFNAME 指定网卡,仅在多 WAN 时需要,默认留空,也可以删除本行

APPADDR BT 应用程序的 IPv4 地址;BT 应用运行在路由器上时,请正确区分所用的地址

APPPORT 指定下载设备上运行的 BT 程序的监听端口,要求 5 位数(10000 - 65535),请查看并正确设置 BT 软件中的监听端口

L4PROTO 指定传输协议,与上面的 “穿透类型” 一致,要求小写字母的 tcp 或 udp

以上为需要用户确认并填写的部分

配置完成点击 “添加”

鼠标停留在 “日志” 按钮上,等待约 30 秒左右,显示将会显示运行结果

可能需要移开鼠标再停留,才刷新日志

配图未更新,请忽略

4.配置端口映射

本脚本不再自动配置端口映射,请手动操作

建议使用路由器的端口映射(或叫“虚拟服务器”),本文档示例使用 OpenWrt

  • 地址族限制:仅 IPv4

    仅针对 IPv4 进行穿透,并非所有路由器都有此选项

  • 协议:TCP UDP

    根据实际修改,但一般选择 TCP UDP 即可

  • 外部端口:61127

    对应 NATMap 中的 绑定端口 或 Lucky 中的 穿透通道本地端口

  • 内部 IP 地址

    BT 应用程序的 IPv4 地址;BT 应用运行在路由器上时,请正确区分所用的地址

  • 内部端口:61128

    BT 应用程序的监听端口,HTTP 改包要求 5 位数端口

大多数情况下,外部端口与内部端口允许一致

但在路由器上运行 BT 应用程序时,建议穿透端口与监听端口设为不同值

额外操作

配图未更新,请忽略

配置 TCP + UDP 穿透

UDP 穿透针对 uTP 协议,请确认你的 BT 软件是否需要开启

上面已经添加了一个 TCP 穿透规则,如需要对同一 BT 程序添加 UDP 穿透,如图

echo 已写进脚本,请忽略

与上面的 TCP 穿透规则相比,需要注意以下地方

规则名称:STUN_BT_UDP

穿透类型:IPv4-UDP

L4PROTO=udp

Lucky 要求穿透规则名称唯一不重复,需作修改加以区分

穿透类型为 IPv4-UDP 时,脚本中的 L4PROTO 需要同步,注意使用小写字母

同一宽带下的 TCP 与 UDP 的 “穿透通道本地端口” 可以相同,当然也可以不相同

若需要修改本地端口号,请记得同时修改自定义脚本中的 LANPORT

效果图如下

配置多个网卡

本脚本支持多 WAN,包括多条入户宽带,单线多拨及隧道协议等

需要指定网卡,通常 Lucky 运行在主路由上才有意义

配置如下

echo 已写进脚本,请忽略

规则名称:不留空且不重复

操作模式:定制模式

穿透通道方式:指定网卡

若 Lucky 运行在旁路由上,由主路由进行多线上网,可以选择 “指定IP” 的方式

前提是主路由已配置了基于源 IP 的策略分流

网卡列表:PPPoE 拨号上网的,请选择 pppoe- 开头的网卡

pppoe- 后面的接口名称为自定义,请选择你实际的

IFNAME=pppoe-wanct

IFNAME 要求与上面选择的网卡名称一致

其余未截图的配置项为默认,无需变更

示例如图

由于没有测试环境,4个规则实际上是同一接口,请见谅

配置多个程序

除了 TCP + UDP,以及多 WAN 外,本脚本同时支持配置多个 BT 程序的穿透

包括不同下载设备上,以及同一下载设备上的不同 BT 程序,以下载设备地址与程序监听端口为依据区分

echo 已写进脚本,请忽略

同一设备(192.168.8.168)下不同 BT 程序(12345 / 23456)的穿透

需要区分 规则名称、穿透通道本地端口(即 LANPORT)、APPPORT

echo 已写进脚本,请忽略

不同设备(192.168.8.168 / 192.168.8.169)下不同 BT 程序(12345 / 23456)的穿透

需要区分 规则名称、穿透通道本地端口(即 LANPORT)、APPADDR、APPPORT

不同条件可以自由搭配,只需要正确填写或选择基本信息

穿透类型、网卡、APPADDR、APPPORT

以上任意一项信息不同,都需要不同的穿透规则

每条穿透规则还需要配置唯一不重复的 规则名称 与 穿透通道本地端口(即 LANPORT)

清理规则

删除穿透规则后,需要重启网关清理残留的 nftables 规则

如果不想重启,可使用 nft 命令手动删除

Web 管理页中,打开 “系统 -- 软件包”,过滤器中搜索 ttyd 并安装 luci-i18n-ttyd-zh-cn

安装完成后,刷新页面,再打开 “服务 -- 终端”

输入 root 后再输入密码登录,注意输入密码时无回显反馈

登录后,依次执行以下三行命令

代码块
Shell
自动换行
复制代码
rm /tmp/stun_bt_*.info
nft delete table ip STUN
/etc/init.d/lucky restart
复制成功

rm /tmp/stun_bt_*.info 删除脚本保存的穿透信息

nft delete table ip STUN 删除脚本创建的流量表

/etc/init.d/lucky restart 重启 Lucky,若有启用的穿透规则,将重新创建流量表

旧版兼容

若使用旧版固件 / 插件,可尝试手动安装 nftables

Web 管理页中,打开 “系统 -- 软件包”,点击 “更新列表”

列表更新完成后,搜索 nftables 并安装

安装 nftables 会自动安装依赖包 kmod-nft-core

安装 kmod 内核模块需要校验 Linux 内核的哈希值,而通常网友发布的自编译固件与官方软件源的的内核版本不一致,很可能提示版本不兼容而无法安装

请尽量使用预装 nftables 的固件

若无法使用 curl,可安装 wget 替代

同时需要安装 libustream,可选择 mbedtls openssl wolfssl

如无特别需要,安装 mbedtls 即可

若 nftables 的版本太老,部分规则可能因语法或功能不支持而报错

若 BusyBox 的版本太老,可能无法支持 sh <() 的语法,获取并执行脚本部分改为如下

代码块
Shell
自动换行
复制代码
sh $(curl -Lso /tmp/stun_bt_lucky.sh https://gitee.com/oniicyan/stun_bt/raw/master/stun_bt_lucky.sh && echo /tmp/stun_bt_lucky.sh) ${ip} ${port} ${LANPORT} ${L4PROTO} ${ruleName} $GWLADDR $APPADDR $APPPORT $IFNAME
复制成功

若使用 wget,获取并执行脚本部分改为如下

代码块
Shell
自动换行
复制代码
sh 
复制成功

若频繁出现穿透通道失效的提示,请尝试开启定制模式,找到下图设置项

把 “穿透心跳&通道检测时间间隔” 设置为 2500 毫秒

若仍无改善,一般是运营商的问题