参考文章
LCUKY系列教程
一 「LUCKY STUN穿透」使用 cURL 自动修改 Transmission 的监听端口
二 「LUCKY STUN穿透」使用 Webhook 自动修改 qbittorrent 的监听端口
三 LUCKY STUN穿透在Windows上使用UPnP工具为BT客户端自动添加内外端口号不同的映射规则
四「LUCKY STUN穿透」在Docker中使用MiniUPnP为BT客户端自动添加内外端口不同的映射规则
本人环境:
Lucy使用群晖套件安装
transmission使用群晖docker安装(host)
路由器拨号开启upnp
本教程仅作记录
思路 :因为lucky没有办法二次转发端口将获得的公网IP端口自动更新映射,或者是动态更新upnp,比如说stun获取的公网是123.123.123.123:4521
,内部监听(穿透通道本地端口)端口是1111
,那么说白了需要在路由器自动更新一个端口转发,外部端口1111
,内部端口4521
,ip是lucky的ip(群晖nas的ip)
,于此同时在transmission监听端口设置端口是4521
(trans的ip和群晖的ip和lucky的内部ip地址是一样的192.168.31.2
)
参考之前的文章,因为是nas上不是win上,所以我又装了一个miniupnpc,在stun下面的脚本里增加一下自动更新端口转发,然后就可以了,transmission的推送端口号脚本反而是最好设置的
最后设置udp保活端口,因为长时间无流量的话nat会终止端口转发导致穿透失效
标题实践
群晖ssh安装miniupnpc
bash
opkg update
opkg install miniupnpc
常用命令
bash
可执行文件的名称可能不是 upnpc-static
# 查看/opt/bin目录下的upnp相关文件
ls -la /opt/bin/ | grep upnp
# 查看所有安装的文件
find /opt -name "*upnp*" 2>/dev/null
# 查看miniupnpc包安装了哪些文件
opkg files miniupnpc
# 测试命令帮助
/opt/bin/upnpc -h
# 列出UPnP设备和当前端口映射
/opt/bin/upnpc -l
# 再次查看映射是否成功
/opt/bin/upnpc -l
增加stun穿透规则

脚本设置为
bash
#更新transmission端口号
host=192.168.31.2(transmission的ip)
webui=9091(transmission的WEBUI端口)
port=${port}
username=你设置的transmission用户名
password=你设置的transmission密码
json='{"arguments": {"peer-port": '$port'},"method": "session-set"}'
token=$(curl -Ls -X POST http://$username:$password@$host:$webui/transmission/rpc/ | awk -F ': ' '{print$(NF)}' | awk -F '<' '{print$1}')
curl -X POST http://$username:$password@$host:$webui/transmission/rpc/ -H "X-Transmission-Session-Id: $token" -d "$json"
#下面开始增加动态端口映射
sleep 1
#删除之前的端口映射
/opt/bin/upnpc -d 25385 TCP 2>&1 & #注意端口号是穿透通道本地端口
sleep 1
#增加一个名字为QB-TCP的新端口映射
/opt/bin/upnpc -e "QB-TCP" -a 192.168.31.2 ${port} 25385 TCP 2>&1 & #注意端口号是穿透通道本地端口和ip
实际为
bash
host=192.168.31.XX
webui=9091
port=${port}
username=XX
password=XXX
json='{"arguments": {"peer-port": '$port'},"method": "session-set"}'
token=$(curl -Ls -X POST http://$username:$password@$host:$webui/transmission/rpc/ | awk -F ': ' '{print$(NF)}' | awk -F '<' '{print$1}')
curl -X POST http://$username:$password@$host:$webui/transmission/rpc/ -H "X-Transmission-Session-Id: $token" -d "$json"
sleep 1
/opt/bin/upnpc -d 25385 TCP 2>&1 &
sleep 1
/opt/bin/upnpc -e "QB-TCP" -a 192.168.31.XX ${port} 25385 TCP 2>&1 &
transmission关闭端口转发和随机端口
带I标识
表明是有远程传入标致I的用户接入
记录------bilibili @天蝎8110 ↓
bash
这部分做了点小改动以适配用户名密码带'@'的情况:
token=$(curl -Ls -u $username:$password -X POST http://$host:$webui/transmission/rpc/ | awk -F ': ' '{print$(NF)}' | awk -F '<' '{print$1}')
curl -u $username:$password -X POST http://$host:$webui/transmission/rpc/ -H "X-Transmission-Session-Id: $token" -d "$json"
使用UptimeRobot端口保活 (有域名)
参考「LUCKY STUN穿透」使用UptimeRobot使UPnP映射的TCP规则保持活跃
注册步骤省略,获取api,注意UptimeRobot的dns域名解析ip是国外的,所以域名dns解析线路如果设置的国内是会失败的,设置成默认解析线路就行
笔者2025.09.08测试如果是网页创建的监视器是无法修改端口号的,提示成功但是一直失败,必须ssh手动创建监视器再进行修改端口号的操作,能够成功。
获得监视器id不用像参考文章一样那么复杂,点进监视器,网页上的数字就是监视器id

获得api
群晖进入ssh,先删除现有的监视器
bash
curl -X POST \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "api_key=你的API&format=json&id=监视ID" \
"https://api.uptimerobot.com/v2/deleteMonitor"
创建新的监视器,端口随便
bash
curl -X POST \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "api_key=你的API&format=json&type=4&sub_type=99&friendly_name=随便起名字&url=域名&port=端口" \
"https://api.uptimerobot.com/v2/newMonitor"
比如
bash
curl -X POST \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "api_key=u3XXXXXXXXXXa&format=json&type=4&sub_type=99&friendly_name=NAME&url=YOUR.DORMAN&port=5555" \
"https://api.uptimerobot.com/v2/newMonitor"
添加后打开网页看到新创建的监视器id号,
进入lucky的stun修改脚本
bash
curl -X POST -H "Cache-Control: no-cache" -H "Content-Type: application/x-www-form-urlencoded" -d "api_key=YOUR.API&format=json&id=监视器ID&port=${port}" "https://api.uptimerobot.com/v2/editMonitor"

保存后,然后进监视器网页看是否修改成功!