OpenWrt(Linux)下针对 BT 的全自动 STUN 内网穿透(图文普及版)
泥浆
编辑于 2024年11月06日 13:45

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

https://gitee.com/oniicyan/stun_bt

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

原文偏向文档性质,内容较晦涩繁杂。

本文将对内容精简并配上实操截图,旨在简化配置过程。

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

本方案可能不适用于 PT。

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

代码块
Shell
自动换行
复制代码
环境要求

操作过程
├─ 登录 SSH
├─ 配置 STUN 脚本
├─ 配置 NATMap
└─ 配置多个实例

运行状况
复制成功

环境要求

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

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

以下的情况可能无法穿透

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

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

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

本文针对 OpenWrt 网关,可以是主路由也可以是旁路由。

未持有 OpenWrt 网关,且使用 Windows 的用户,可通过 WSL2 实现全自动穿透。

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

以上内容请查看原文​

文本大部分操作通过命令行完成,示例中使用 Windows Terminal(PowerShell 或 CMD)

可使用你喜欢的终端工具,推荐 Xshell 或 MobaXterm,不推荐 PuTTY

操作过程

登录 SSH

按下键盘的 Win + R 键,输入 powershell 或 cmd 后,回车运行

PowerShell 或 CMD 均可

或右键点击任务栏的开始按钮,打开 终端

PowerShell 或 CMD 均可

在终端中输入以下命令登录 SSH,IP 地址改为你的路由器地址

Windows Terminal 内可使用左键选定,右键点击的方式进行复制粘贴

包括 Windows Terminal 在内的终端工具的通用快捷键是

Ctrl + Insert 复制

Shift + Insert 粘贴

代码块
Shell
自动换行
复制代码
ssh root@192.168.1.1
复制成功

按照提示输入密码即可

如需使用密钥,请加上 -i 参数

代码块
Shell
自动换行
复制代码
ssh -i C:\Users\username\OpenWrt root@192.168.1.1
复制成功

注意密钥文件需要删除其他非系统内置用户的权限

可能需要在高级设置页中禁用继承后才能删除

安装插件

执行 sed 替换软件源

代码块
Shell
自动换行
复制代码
sed -i 's_downloads.openwrt.org_mirrors.tuna.tsinghua.edu.cn/openwrt_' /etc/opkg/distfeeds.conf
复制成功

该命令只在当前配置为 OpenWrt 官方源时有效,不会更改已自定义的配置

执行 opkg 更新软件列表,并安装所需插件

代码块
Shell
自动换行
复制代码
opkg update
opkg install luci-i18n-natmap-zh-cn curl nano xxd miniupnpc
复制成功

运行在主路由时,不需要安装 miniupnpc,安装了也不影响

运行在旁路由时,若需要代理 UPnP 请求,还需要安装 proxychains-ng

此处不考虑,有需要的请看原文​

执行结果如下,可右键在新标签页中放大图像

与上图连接的设备不同,请勿在意

配置 STUN 脚本

执行 curl 下载脚本到 /usr/stun_bt.sh

代码块
Shell
自动换行
复制代码
curl -Lo /usr/stun_bt.sh https://gitee.com/oniicyan/stun_bt/raw/master/stun_bt.sh
复制成功

若因网络问题下载失败,无需理会,可在后面的 nano 操作中粘贴完整脚本内容

完整脚本内容可在原文​复制

* 更新:脚本已从 GitHub 转移到 Gitee,一般不会出现网络问题 *

代码块
Shell
自动换行
复制代码
touch /usr/stun_bt.sh
chmod +x /usr/stun_bt.sh
复制成功

先 touch 脚本后再执行 chmod 赋予执行权限

脚本下载成功时,touch 操作可跳过,重复执行不影响

脚本下载成功

脚本下载失败

执行 nano 编辑脚本,输入需要指定的基本变量

代码块
Shell
自动换行
复制代码
nano /usr/stun_bt.sh
复制成功

若 curl 命令下载脚本失败,可在这里粘贴完整脚本内容

IFNAME 指定网络接口,默认留空,仅在多 WAN 时需要,详细后述

GWLADDR 指定主路由 LAN 的 IPv4 地址

APPADDR 指定下载设备的 IPv4 地址,允许主路由或旁路由本身运行 BT 应用

由于路由器可能存在多个不同地址的网络接口,当 BT 应用运行在路由器上时,为确保正确匹配数据包,建议设置程序绑定 APPADDR 作为通信地址

APPPORT 指定下载设备上运行的 BT 应用的监听端口,要求 5 位数(10000 - 65535)

以上 4 个变量需要用户按照实际情况修改

OpenWrt 下无法正确显示 # 号后的中文注释内容,但不影响脚本的执行

编辑完成后,按 Ctrl + O 键保存,Enter 键确认,Ctrl + X 键退出编辑

网络接口可在 Web 管理页中打开 “网络 -- 接口 -- 设备” 查看

需要注意的是,PPPoE 拨号接口有前缀 "pppoe-"

上图中拨号接口的正确名称是 pppoe-wan

多 WAN 可能显示如下

下图中拨号接口的正确名称是 pppoe-wanct 和 pppoe-wancm

wanct 与 wancm 为自定义名称,请确认你实际显示的

联网方式为 DHCP 或静态 IP 的,接口名称可能是 wan eth0 lan1 等,请自行区分

配置 NATMap

Web 管理页中,打开 “服务 -- NATMap”,点击左下角的 “添加”

配置内容如下图

协议 按照需求,可以配置 TCP 或 UDP,以及 TCP + UDP (需要添加两个配置项)

若 BT 应用不使用 uTP 协议,则不需要配置 UDP 项

地址族限制 仅 IPv4,目前的 STUN 穿透不考虑 IPv6

接口 仅在多 WAN 时需要指定,注意这里选定的接口与脚本指定的 IFNAME 可能不一致,这是因为物理接口与逻辑接口可能有不同的命名

Keep-alive 保活间隔为 25 秒,一般假定 NAT 网关的老化周期为 30 秒

STUN 服务器 此处建议使用 Cloudflare 的 TURN 服务器 turn.cloudflare.com

HTTP 服务器 指定一个可靠的可访问服务器,这里使用 qq.com

绑定端口 本脚本的场景不需要绑定端口,设置为 0;有需要的话也可以指定,不影响

转发模式 本文通过脚本自动配置端口转发,请勿勾上

通知脚本 指定 STUN 脚本的路径 /usr/stun_bt.sh

保存配置后,勾上启用,再点击 “保存并应用”

如无意外,等待数秒后显示 外部 IP 与 外部端口,代表穿透成功

以上操作也可在命令行中进行

执行 nano 编辑配置文件 /etc/config/natmap

代码块
Shell
自动换行
复制代码
nano /etc/config/natmap
复制成功

修改配置文件如下

代码块
Shell
自动换行
复制代码
config natmap
	option udp_mode '0'
	option family 'ipv4'
	option interval '25'
	option stun_server 'turn.cloudflare.com'
	option http_server 'qq.com'
	option port '0'
	option notify_script '/usr/stun_bt.sh'
	option enable '1'
	option interface 'wan'

config natmap
	option udp_mode '1'
	option family 'ipv4'
	option interval '25'
	option stun_server 'turn.cloudflare.com'
	option http_server 'qq.com'
	option port '0'
	option notify_script '/usr/stun_bt.sh'
	option enable '1'
	option interface 'wan'
复制成功

option interface 仅在多 WAN 时需要指定,注意这里选定的接口与脚本指定的 IFNAME 可能不一致,这是因为物理接口与逻辑接口可能有不同的命名

逻辑接口的名称可在 Web 管理页中打开 “网络 -- 接口 -- 接口” 查看

编辑完成后,按 Ctrl + O 键保存,Enter 键确认,Ctrl + X 键退出编辑

命令行下需要手动重启 NATMap 以生效

代码块
Shell
自动换行
复制代码
/etc/init.d/natmap restart
复制成功

配置多个实例

本脚本支持针对以下场景配置多个穿透实例

  1. 多 WAN,包括多条入户宽带,单线多拨及隧道协议等

  2. 多个 BT 应用运行在单一下载设备上

  3. 多个 BT 应用运行在多个下载设备上

每个条件可以互相叠加

每个实例基于 NATMap 配置项,修改脚本的文件名进行区分,需要正确填写开头的基本变量

具体请查看原文​的文末

运行状况

Web 管理页中打开 “状态 -- 系统日志”,点击 “滚动到底部” 或网页中查找 "natmap"

没有日志输出代表 NATMap 与 STUN 脚本正确执行

下载一个热门种子,查看任务的用户列表,显示有远程发起的 IPv4 连接,代表成功穿透并汇报公网端口

BT 软件本身的端口测试可能仍然显示阻塞,因为本脚本的穿透对于 BT 应用来说是透明的

若软件基于自身的监听端口来判断连通性,则会显示阻塞

BitComet 中,即使监听端口测试失败,只要有远程发起的连接,就会显示绿灯

Web 管理页中打开 “网络 -- 防火墙 -- 端口转发” 查看脚本创建的转发规则

由于 UCI 的限制,仅在未指定脚本中的 IFNAME 时才会在 Web 管理页上显示转发规则

指定了网络接口的转发规则,需要在防火墙中查看

* 更新:不再使用 UCI 配置端口转发,无需再确认此页面 *

Web 管理页中打开 “状态 -- 防火墙”,网页中查找 "STUN"(通常在最底部)

可以查看脚本创建的防火墙规则与计数器记录

指定了网络接口的转发也可会在此处显示

Web 管理页上的显示内容可读性较差,可在命令行中显示防火墙规则

代码块
Shell
自动换行
复制代码
nft list table ip STUN
复制成功

该命令会输出 nftset 内容,可能会刷屏,加上 -t 参数省略

代码块
Shell
自动换行
复制代码
nft -t list table ip STUN
复制成功

可单独输出 nftset 内容

代码块
Shell
自动换行
复制代码
nft list sets table ip STUN
复制成功

该列表为 1 小时内访问过的 HTTP 与 UDP Tracker 的 IPv4 地址与端口

代码块
Shell
自动换行
复制代码
cat /tmp/stun_bt.info
cat /tmp/stun_bt.log
复制成功

cat 查看穿透信息 /tmp/stun_bt.info

cat 查看穿透记录 /tmp/stun_bt.log

穿透记录若显示短时间内频繁更换端口,可尝试更换 STUN 服务器

若未改善,通常是运营商的问题,用户无法干预