[LUCKY STUN穿透] 在Windows上使用UPnP工具为BT客户端自动添加内外端口号不同的映射规则

[LUCKY STUN穿透] 在Windows上使用UPnP工具为BT客户端自动添加内外端口号不同的映射规则


本教程基于:

在该教程中实现了使用 路由器/光猫 的端口转发功能 处理流量 其效率更高且可以使BT客户端正确的显示其他连入用户的IP地址

但是其使用的是 静态的 端口转发/映射规则 在 stun穿透 端口发生变化后 需要手动修改转发规则 无法实现自动化

可以使用 UPnP 来替代 静态的端口转发规则
但是lucky内置的 UPnP 功能所添加的规则的内部端口和外部端口是相同的

但我们所需要的映射是内外端口不同的
尽管在 v2.5.3 版本中增加了 自定义 UPnP/NAT-PMP 内部端口 的功能但其内部端口号是静态的 无法跟随 外网端口变化

但好在 v2.5.1版本中 已经增加了 在STUN穿透变化时触发自定义脚本的功能 这为使用其他程序实现 自动添加内外端口号不同的UPnP映射规则 提供了极大的方便

lucky更新日志:链接


所以要实现 本教程中的效果 lucky版本要大于等于 2.5.1

还需要下载 UPnP Wizard
官网地址:UPnP Wizard - Port Mapping Tool

建议使用网盘下载 官网下载版本需要安装网盘版解压即可使用
网盘:https://wwm.lanzoul.com/iaut01mmbmuj


网络环境检测

实现穿透并不需要 NAT检测为 全锥型
只需要最外面一层的 NAT 即运营商NAT为全锥型即可光猫/路由器的NA 类型可以为端口受限型

可以参考这篇教程进行网络环境优化
教程:比特彗星-端口阻塞解决方案-2.3网络环境检测和优化 - 哔哩哔哩
优化到只剩一层运营商NAT和 和一层光猫/路由器 NAT
共两层NAT 且NAT类型检查结果不为对称型即可进行穿透


设置方法

关闭 BT软件中的UPnP映射功能 防止其影响自定义规则的添加

BC 在 选项>网络连接>端口映射 取消勾选 添加UPNP端口映射

qb在 选项>连接 取消勾选 使用我的路由器的UPnP/NAT-PMP端口转发

打开路由器/光猫上的UPnP功能


下载并解压 lucky
建议把文件名改短一些 比如将 lucky_2.6.2_Windows_x86_64 改为 lucky_2.6.2
文件路径过长会对接下来的设置造成麻烦

同时下载解压 UPnP Wizard 建议与lucky放在一起

来到 UPnP_Wizard 目录 打开 UPNPWizard.exe 后面没有C
应该可以看到这样的窗口

可以看到本地IP UPnP设备名和地址以及一些映射规则
这些说明光猫/路由器上的UPnP功能已经打开

若弹出 下面这个窗口说明 路由器/光猫上的 upnp 功能 没有开启

UPnP_Wizard对一些设备的兼容性较差如果打开路由器/光猫上的 UPnP 功能后
依然会看到此错误提示请尝试换用 MiniUPnP Client


接下来
双击运行 lucky.exe任务栏会出现一个图标

右键这个图标 弹出菜单 选择打开 lucky 后台
这里也可以设置 开机启动

弹出浏览器 显示lucky 登录界面
使用默认的账户和密码登录 均为 666

点开左侧的STUN内网穿透

点击 添加穿透规则 并参照图中的方式填写

自定义脚本内容如下 部分参数按照实际情况修改

实际目录\UPnPWizardC.exe -remove -extport 穿透通道监听端口 -protocol 穿透类型 -legacy
实际目录\sleep1s.vbs
实际目录\UPnPWizardC.exe -add "rule name" -ip default -intport ${port} -extport 穿透通道监听端口 -protocol 穿透类型 -lease 0

使用的是UPnPWizardC.exe 后面有个C
实际目录为UPnPWizardC.exe和sleep1s.vbs的实际存放的目录
rule name 换成你喜欢的名字 但不要使用中文 “” 要保留

创建 sleep1s.vbs 脚本
使用记事本写入下列内容 表示等待1000毫秒即一秒
写好后命名为sleep1s 扩展名改为.vbs
原先使用的是timeout命令但是效果不佳故改用vbs脚本

WScript.sleep 1000

如果目录中有空格的话要用 英文引号 “” 引起来 不然无法运行
C:\abc\d e f\ (错误)
C:\abc\“d e f”\ (正确)

目录中不能有中文不然会报错
目录中不能有中文不然会报错
目录中不能有中文不然会报错

如果出现 Call Script error: exit status 1 的报错很有可能就是目录写错了


示例

为比特彗星设置 stun 端口映射

穿透类型:IPv4-TCP
穿透通道监听端口:6000
UPnP规则名称 BC-TCP
UPnP_Wizard 程序路径:C:\UPnP_Wizard\

C:\UPnP_Wizard\UPnPWizardC.exe -remove -extport 6000 -protocol TCP -legacy
C:\sleep1s.vbs
C:\UPnP_Wizard\UPnPWizardC.exe -add "BC-TCP" -ip default -intport ${port} -extport 6000 -protocol TCP -lease 0

(这里的图没改还用的是旧的timeout命令)

(UPnPWizardC的更多命令以及参数含义在其自带的帮助文件中)


填写完成后保存一下 打开穿透开关

查看是否能成功获取到外网地址和端口 同时 打开UPNPWizard.exe
刷新一下 看看映射规则是否已经添加 刷新按钮在左上角

如果无法获取到外网端口
请按照 上文链接中的教程继续优化网络环境

如果端口获取成功但 UPnP添加失败
请查看穿透规则日志(在开关后面)

首次添加时用于删除旧端口的命令会报错 这是正常的
主要看 下一行显示是否添加成功

添加成功过一次后 下一次移除端口的命令就可以正常工作了



杀毒软件误报
lucky触发自定义脚本的行为可能会被一些杀毒软件误判
建议提前将lucky加为信任或者排除



在成功获取外网端口和地址获取以及正确添加UPnP规则后
就可以设置bt软件中的监听端口为获取到的外网端口


BC在设置新端口后会自动从新检测端口 如果设置正确端口就能 获得绿灯

qb没有主动端口检测功能只有在 被动接受外部发起的连接后 状态栏才会显示 联机
可以使用在线的端口扫描工具

工具: 传输控制协议端口检查器
输入 穿透获取到的 IP 和端口 点击检查
显示 成功连接到XXX 表明已经成功穿透通 同时qb的状态栏中会显示 联机

高版本显示为地球

低版本则是插头

到此我们就成功的实现了 自动添加内外端口号不同的映射规则
之后每当stun穿透的地址或端口发生变化后 都会自动更新UPnP映射规则
当然 bt软件修改监听端口的部分还未自动化

1個讚

使用 MiniUPnP Client

MiniUPnP 客户端

官方下载
MiniUPnP Project:MiniUPnP download zone

网盘下载:MiniUPnP_Client.zip - 蓝奏云

推荐使用网盘下载


检查 UPnP是否启用

解压文件 运行其中的 UPnP查询.bat 查看输出内容
或者使用 -i -l 参数也是一样的

应该可以显示出"List of UPNP devices found on the network "
或者UPNP映射规则列表即可 规则数量可能会有所不同 说明UPNP已经启用
使用 MiniUPnP 应该不太会遇到兼容问题

如果仍然显示 “No IGD UPnP Device found on the network !”
请再次检查 光猫/路由器上的UPNP功能是否开启


编辑命令

命令

程序目录\MiniUPnP_Client\upnpc-static.exe -i -d 穿透通道监听端口 穿透类型
timeout /t 5
程序目录\MiniUPnP_Client\upnpc-static.exe -i -e "rule name" -a @ ${port} 穿透通道监听端口 穿透类型

程序目录为upnpc-static.exe的实际目录

如果目录中有空格的话要用 英文引号 “” 引起来 不然无法运行
C:\abc\d e f\ (错误)
C:\abc\“d e f”\ (正确)

rule name 换成你喜欢的名字 但不要使用中文 “” 要保留

示例

C:\MiniUPnP_Client\upnpc-static.exe -i -d 6000 TCP
timeout /t 5
C:\MiniUPnP_Client\upnpc-static.exe -i -e "BC-TCP" -a @ ${port} 6000 TCP

日志

MiniUPnP输出日志和UPnP_Wizard不太一样

删除端口时会返回 UPNP_DeletePortMapping() returned : 0
规则创建成功后会返回规则的详细信息

1個讚

支持,很好的教程!希望过程可以更详细一些

是只哪一部分的过程呢?

本教程基于

这个教程中有的内容这里可能就没有再讲了

按照你的教程 LUCKY总是报错如下{“ExtInfo”:{},“level”:“error”,“msg”:“[bc]Call Script error: exit status 1”} 不能自动添加映射

使用的是UPnPWizardC.exe还是MiniUPnP_Client?

有只有这些错误信息吗?
检查一下程序路径是否正确
可以将命令复制到命令提示符中运行一下看看有没有报错

UPnPWizardC.exe 有且只有这一个

在命令提示符中运行一下添加端口映射的命令看看有什么返回结果

「LUCKY STUN穿透」在docker中使用MiniUPnP为BT客户端自动添加内外端口不同的映射规则

在之前的教程中我们已经实现在Windows上使用upnp工具为BT客户端添加端口
LUCKY STUN穿透在Windows上使用UPnP工具为BT客户端自动添加内外端口号不同的映射规则 - 哔哩哔哩

考虑到很多lucky运行在docker容器中(Linux)
本教程中将介绍当lucky运行在docker容器中时通过MiniUPnP来添加映射规则的方法

建议先阅读之前在Windows上进行配置的教程后再阅读本教程
此方法不仅适用于docker容器也适用于lucky直接安装在Linux的情况
不过在其他Linux系统下载安装miniupnp时请自行判断其使用的包管理器类型

网络环境检测和优化

为保证stun穿透的成功 请先探测和优化网络结构
建议先阅读之前的教程 或直接阅读此教程
比特彗星-端口阻塞解决方案-2.3网络环境检测和优化 - 哔哩哔哩

其他要求
lucky所在的docker容器网络为host
关闭BT客户端上的upnp添加功能

配置方法

安装lucky

官方教程
https://www.daji.it:66/docs/install#docker镜像

为容器安装miniupnp
我们可以进入到终端环境中进行安装
但更简单的方法是使用lucky计划任务中的自定义脚本功能

创建计划任务

子规则选择自定义脚本 其他选项任意设置

不填写脚本内容 先保存 计划任务

关闭规则开关 我们只使用手动触发

修改下载源

将下载源修改为 清华大学开源软件镜像站
以防止因为网络问题造成安装失败

sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories

填写命令并保存

按下手动触发按钮并查看日志
此步的输出内容为空白

安装miniupnp

替换为以下命令后 手动触发运行

apk add miniupnpc 2>&1 &

检查日志输出 有显示OK表示安装成功

检查upnp设置

填入以下命令 手动触发命令任务 观察输出结果

upnpc -i -l 2>&1 &

如果有很多输出内容且其中包括 “Status : Connected”
说明路由器/光猫上的upnp功能已经正确打开

如果显示 "No IGD UPnP Device found on the network "
则路由器/光猫上的upnp功能尚未打开
请检查其设置以及docker容器的网络模式

设置STUN穿透规则

编辑命令 其中的参数按照实际情况填写

upnpc -i -d 穿透通道监听端口 穿透类型 2>&1 &
sleep 1
upnpc -i -e "rule name" -a @ ${port} 穿透通道监听端口 穿透类型 2>&1 &

示例

upnpc -i -d 6000 TCP 2>&1 &
sleep 1
upnpc -i -e "TR-TCP" -a @ ${port} 6000 TCP 2>&1 &

如果在自定义脚本区域已经有命令则应按照流程顺序进行排列
并使用sleep命令设置间隔


开启穿透规则并检查日志输出
应该会有 UPNP_DeletePortMapping() returned : 0 表示成功删除旧规则

而规则创建成功后会返回规则的详细信息(由于是演示所以这里的端口号是内外相同的)

示例

检视添加效果

若路由器设备支持查看UPNP映射规 则可以通过网页查看
若不支持查看规则 可通过在计划任务中再次运行下列命令查看添加效果

upnpc -i -l 2>&1 &

应该可以看到刚刚添加的规则

1個讚

「LUCKY STUN穿透」使用 cURL 自动修改 transmission 的监听端口

在之前的教程中我们已经实现了使用lucky自带的webhook功能自动的修改qbittorrent 的端口
在本教程中将讲解如何自动化的更换 transmissionansmission 的监听端口

与之前 qBittorrent 的配置方法相比 transmission 的端口自动化要复杂一些
这主要是由于其强制开启跨站保护所导致的 该功能无法关闭 除对源代码进行修改后再次编译
考虑的transmission 运行在许多不同的平台 从新编译过于麻烦

我们只能想办法通过其的跨站保护认证
这样一来就无法直接通过lucky的webhook来实现了
而需要使用到curl和自定义脚本

其实原理也很简单 就是先通过curl发起访问获取用于通过跨站检测的token
然后将其加载到下一次用于更改端口号请求的头中以通过跨站保护检测

transmission webAPI文档:链接

将分为Windows配置方法和docker配置方法两部分进行讲解
以lucky安装的位置为准

lucky和 transmission可以不在一台机器或IP上
若transmission在docker中运行则其网络必须为host

感谢 泥浆 提供的命令支持

Windows配置方法

安装curl

win10和win11 中应该已经预装了curl

可以在命令提示符中 输入下列命令查看是否安装
应该可以显示出curl的版本号如果(注意V要大写)

curl -V 

如果用的是win7或显示
“‘curl’ 不是内部或外部命令,也不是可运行的程序或批处理文件。”
就需要手动下载curl

下载curl: 链接

解压文件

进入bin文件夹 将curl.exe 复制到到system32文件夹

C:\Windows\System32


完成后重复刚才的命令 有版本号显示即表示安装正确

调整transmission设置

关闭transmission自己的UPnP以防止影响STUN穿透效果

设置自动更新脚本

打开lucky

添加计划任务
在计划任务中测试完命令之后再填写到STUN穿透规则中

子规则选择自定义脚本 其他选项任意设置
不填写脚本内容先保存计划任务

关闭规则开关 我们只使用手动触发

编辑规则并填写下列命令
其中的参数要根据实际情况填写

chcp 65001

set "ip="
set "webport="
set "username="
set "password="
set "port="

set json={""arguments"": {""peer-port"": %port%},""method"": ""session-set""}

for /f "tokens=27 delims=<>" %%a in ('curl -X POST http://"%username%":"%password%"@"%ip%":"%webport%"/transmission/rpc/  -H "%authorization%"') do (
  set token=%%a
)

curl -X POST http://"%username%":"%password%"@"%ip%":"%webport%"/transmission/rpc/ -H "%token%" -d "%json%"

参数解释

ip 表示transmission所在设备的IP
webport 表示transmission webUI的端口号
username 表示登录 transmission 使用的用户名
password 表示登录 transmission 使用的密码
port 表示要更新的端口号 测试时可以使用任意的端口号

示例

chcp 65001

set "ip=127.0.0.1"
set "webport=9091"
set "username=ie12"
set "password=12345678"
set "port=5645"

set json={""arguments"": {""peer-port"": %port%},""method"": ""session-set""}

for /f "tokens=27 delims=<>" %%a in ('curl -X POST http://"%username%":"%password%"@"%ip%":"%webport%"/transmission/rpc/  -H "%authorization%"') do (
  set token=%%a
)

curl -X POST http://"%username%":"%password%"@"%ip%":"%webport%"/transmission/rpc/ -H "%token%" -d "%json%"

填写完成后保存规则

按下手动触发按钮并查看日志
显示 success 即表示成功
不过最好还是去到transmission的设置中检查一下端口后没有变化
若成功变更了端口则表示脚本设置正确

如果有有错误代码 且不显示具体内容
建议 创建一个批处理文件 手动运行 以查看报错内容
记得在最后加上 pause

编辑STUN 穿透规则

将之前测试完成的脚本 复制到STUN的自定义脚本区域
若在自定义脚本区域已经有命令则应按照流程顺序进行排列
并使用vbs脚本设置间隔 详情可以看第一期的教程

并将port选项的值替换为穿透端口变量

set "port=${port}"

示例

打开穿透规则 查看日志 以及 transmission 端口
若显示 success 且端口成功更换 则配置正确

Docker 配置方法

其实思路和在Windows上时一样的主要的区别在安装curl的方法
以及自动更换端口脚本的语法有所不同

安装curl

为容器安装curl
我们可以进入到终端环境中进行安装
但更简单的方法是使用计划任务中的自定义脚本功能

创建计划任务

创建方法和Windows上相同

更换软件包下载源

将下载源修改为 清华大学开源软件镜像站
以防止因为网络问题造成安装失败
填写下列命令并保存

sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories

按下手动触发按钮并查看日志
此步的输出内容为空白


安装curl

替换为以下命令后 手动触发运行

apk add curl 2>&1 &

检查日志输出 有显示OK表示安装成功

验证安装效果

替换为以下命令后 手动触发运行

curl -V

检查日志
看到curl的版本号即表示成功

调整transmission设置

关闭transmission自己的upnp以防止影响STUN穿透效果

测试脚本

docker(Linux)下的命令和Windows下的有较大不同但原理是一样的

host=
webui=
port=
username=
password=

json='{"arguments": {"peer-port": '$port'},"method": "session-set"}'

token=`curl -X POST http://$username:$password@$host:$webui/transmission/rpc/ | awk -F '[<>]' '{print$(NF-4)}'` 
curl -X POST http://$username:$password@$host:$webui/transmission/rpc/  -H "$token" -d "$json"

参数解释

host 表示transmission所在设备的IP
webui 表示transmission webUI的端口号
port 表示要更新的端口号 测试时可以使用任意的端口号
username 表示登录 transmission 使用的用户名
password 表示登录 transmission 使用的密码

注意在docker中 127.0.0.1 可能不起作用
建议直接使用宿主机的IP地址或 host.docker.internal 加以替代
详情:链接

示例

host=192.168.5.107
webui=9091
port=5678
username=ie12
password=12345678

json='{"arguments": {"peer-port": '$port'},"method": "session-set"}'

token=`curl -X POST http://$username:$password@$host:$webui/transmission/rpc/ | awk -F '[<>]' '{print$(NF-4)}'` 
curl -X POST http://$username:$password@$host:$webui/transmission/rpc/  -H "$token" -d "$json"

填写完成后保存规则

按下手动触发按钮并查看日志
显示 success 即表示成功
不过最好还是去到transmission的设置中检查一下端口后没有变化
若成功变更了端口则表示脚本设置正确

编辑STUN 穿透规则

将之前测试完成的脚本 复制到STUN的自定义脚本区域
若在自定义脚本区域已经有命令则应按照流程顺序进行排列
并使用sleep设置间隔

并将port选项的值替换为穿透端口变量

port=${port}

示例

打开穿透规则 查看日志 以及 transmission 端口
若显示 success 且端口成功更换 则配置正确

至此我们完成了使用 cURL 自动修改 transmission 的监听端口

使用UptimeRobot使UPnP映射的TCP规则保持活跃

在之前的教程中我们通过UPnP映射webhook等配合stun穿透
实现了全自动的在无IPv4公网下为BT客户端开放端口

但有一些网友反映UPnP映射规则会在一段时间后自己消失
但stun穿透并没有变化

这应该是由于映射规则不活跃导致的
路由设备会认为这个规则是陈旧的需要清理

当然不同的设备表现不一样 清理的时间应该也是不一样的
一般认为在规则租约期为无限的情况下 只要有流量通过规则其应该就不会被清理

这其实对BT来说不是什么问题几乎一直会有流量和连接
但是PT(当然这也资源有关系)和其他不总是有流量的服务来说就是另外一回事了

当然在我们之前教程中所设置的映射规则租约是无限的
所以我们只需要解决流量问题

我们可以使用 UptimeRobot 这个网站来解决问题
其本身用于网站检测 即检测网站或其他服务是否运行正常
我们需要使用它的端口检测功能

注册 UptimeRobot

访问 https://uptimerobot.com/

注册账户

填写信息

只需填写前三项
分别为 昵称 邮箱和密码


通过邮件激活账户

登录账户

首次使用会弹出设置向导
我们使用向导进行设置 之后会介绍不使用向导的设置方法

创建监视器

点击右侧的箭头弹出菜单
选择 port monitoring

IP or host 这里填写一个已经解析到
BT客户端所在设备IP的(动态)域名

如果还没有设置过可以看看之前的教程
或者其他(动态)域名教程 链接

端口号填写 BT客户端正在监听的端口
填写完成后点击创建

测试通知

其作用是监视的网站或端口离线后发出警告
这里我们用不到这个功能 直接跳过

设置状态页面

其为一个公开的网页可以用来显示多个监视器的状态
这里我们用不到这个功能 直接跳过

完成设置

检视效果

不使用向导设置监视器

与使用向导设置的方法基本相同

填写监控类型 IP和端口
建议取消下面的邮件提醒
免费版扫描间隔最小为5分钟

设置更新API

通过上述的设置 现在网站会每隔5分钟探测一次我们BT客户端的端口
尽管5分钟的间隔有点长 端口扫描所产生的流量也很小
但这足够让UPnP映射规则保持活跃了

不过由于我们使用STUN进行穿透 所以端口是动态的
需要在端口变化后更新在网站监视其中所设置的端口

之所以选择UptimeRobot是因为其提供了更新API
我们可以使用其轻松的更新监视器端口

API文档:API Documentation | UptimeRobot

获取更新KEY

目前UptimeRobot 似乎正在更新界面
我们刚才所看到的都是新界面

像更新API设置这样的高级功能似乎还没有迁移过来
我们需要回到它的旧版页面

点击上方横幅中的 old app

回到旧版界面后
点击右上角的用户名 弹出 菜单 选择 My Settings

滚动页面到底部可以看到 API Settings
创建主更新key



获取监视器ID

有了更新key后我们还需要获取监视器ID
请求方法:链接
这里使用lucky计划任务中的callweb功能进行获取

创建计划任务

任务备注 、执行周期、执行时间等任意填写
子规则选择callweb 并填写下列内容

接口地址:

https://api.uptimerobot.com/v2/getMonitors

请求方法: POST

请求头:

Content-Type: application/x-www-form-urlencoded
Cache-Control: no-cache

请求主体:

api_key=你的APIKey&format=json&logs=1

禁用callweb调用成功字符串检测:

保存任务

示例

关闭规则开关 我们只使用手动触发

按下手动触发按钮并查看日志
应该可以看到 stat:ok
在monitors 和 friendly_name 之间的ID就是我们需要的监视器ID

更新端口号

在获取了监视器ID后我们就可以开始更新端口号了
依然是先在计划任务中测试 完成后再填写到STUN规则中

考虑到经过之前教程中的一系列设置
STUN穿透规则中的webhook可能已经被占用
所以这里给出 使用webhook 和 curl配置的两种方法

测试阶段端口号可任意填写

curl在不同平台上的安装方法可以看之前的教程:链接

curl配置方法

请求方法:链接

Linux平台(Docker)

curl -X POST -H "Cache-Control: no-cache" -H "Content-Type: application/x-www-form-urlencoded" -d "api_key=你的APIKey&format=json&id=监视器ID&port=新端口号" "https://api.uptimerobot.com/v2/editMonitor"

示例

Windows平台

Windows 下要额外添加 “–ssl-no-revoke” 参数
不然会出现无法检查证书是否吊销的报错
这可能是Windows下的检查方式和Linux下不太一样导致的

详见:链接

curl --ssl-no-revoke -X POST -H "Cache-Control: no-cache" -H "Content-Type: application/x-www-form-urlencoded" -d "api_key=你的APIKey&format=json&id=监视器ID&port=新端口号" "https://api.uptimerobot.com/v2/editMonitor"

按下手动触发按钮检查输出日志
成功会返回ok 和监视器ID

webhook配置方法

请求地址:

https://api.uptimerobot.com/v2/editMonitor

请求方法: POST

请求头:

Content-Type: application/x-www-form-urlencoded
Cache-Control: no-cache

请求主体:

api_key=你的APIKey&format=json&id=监视器ID&port=新端口号

禁用callweb调用成功字符串检测:

示例

按下手动触发按钮
检查输出日志
成功会返回ok 和监视器ID

编辑STUN穿透规则

使用curl

将之前测试完成的脚本 复制到STUN的自定义脚本区域
若在自定义脚本区域已经有命令则应按照流程顺序进行排列
并使用设置间隔

Linux下可以使用sleep命令实现
在Windows下需要使用vbs脚本实现类似效果
可以查看之前的教程:链接

还需将 port 的值替换为 STUN穿透 端口变量即

api_key=你的APIKey&format=json&id=监视器ID&port=${port}

示例

使用webhook

与在计划任务中测试的时候基本相同
要把 port 的值替换为 STUN穿透 端口变量即

api_key=你的APIKey&format=json&id=监视器ID&port=${port}

同时将 禁用Webhook接口调用成功字符串检测 改为 否
并填写 ok 作为判断执行成功的字符串

示例

填写完成后可以按下右上角的 手动触发测试
手动测试会使用固定的参数比如端口号固定为 6666


返回ok和监视器ID即表示更新成功

至此我们便完成了UPnP映射规则的保活设置

「LUCKY STUN穿透」使用邮件通知端口变化情况

在之前的一系列教程中我们介绍了一些stun的用法
其中也包括一些固定或更新端口的方法

但还有许多服务我们还不能实现固定端口
或自动化的修改端口需要手动重新设置

这也意味着每当穿透端口发生变化后
需要以某种方式通知我们以便及时的修改端口

尽管一般来讲 STUN穿透的端口号不会非常频繁的变化
但当其被应用在远程访问或者组网的时候
及时的通知端口变化情况就显得十分重要了

这里选择使用邮件进行通知
即当端口发生变化后发出一封邮件
以提示我们更换端口

感谢 泥浆 提供的帮助

开启邮箱的SMTP服务

想要发邮件自然需要邮箱
我们将要使用 SMTP(简单邮件传输协议)来发送邮件

这里推荐网易的邮箱 126和163皆可
主要是设置起来比较方便

其他的邮箱例如 QQ邮箱 Google邮箱 Outlook其实也可以
但其可能存在额外的安全设置 (没有经过测试)

网易邮箱开启SMTP服务

可以参考网易的帮助网页:链接

按照链接或图中内容的操作即可获得授权码
选择 IMAP/SMTP服务即可

安装curl

在开启了邮箱的SMTP服务后
我们还需要一个支持SMTP的客户端程序

这里选择 curl 因为其安装和使用起来都很方便
无论是在Windows上还是Linux中(docker)

安装方法可以查看之前的教程
「LUCKY STUN穿透」使用 cURL 自动修改 Transmission 的监听端口 - 哔哩哔哩

测试脚本

在完成上述的准备工作后
就可以开始发送邮件了

先在lucky的 计划任务中进行测试 成功后
再填写进 STUN 规则的 自定义规则

创建计划脚本
子规则选择自定义脚本 其他选项任意设置
不填写脚本内容先保存计划任务


关闭规则开关 我们只使用手动触发

Windows

lucky 在运行批处理脚本时似乎存在一些编码问题
导致中文字符无法正常显示 即使切换编码到utf8也不行

所以这里选择的方法是创建独立的批处理文件
然后在lucky的自定义脚本中调用 这样就不用担心编码问题了

而端口号 规则名称 以及 授权码将通过传参的形式发给批处理脚本
因为在发送邮件时要写临时文件 在临时文件名中加入穿透规则的名称
可防止多个规则之间互相干扰

虽然授权码是固定的 完全可以写在批处理中但这样明文存储还是有些危险
存储在lucky的配置文件中相对安全一些 其有一些加密措施

创建批处理
创建一个批处理文件 并填写下列命令
部分参数参照实际情况填写

批处理文件存放的位置可任意选择
但名称和路径中不要有中文和空格
正确示例: “C:\STUN_send_mail.bat”

其中发件人邮箱和收件人邮箱可以相同即自己发邮件给自己
流程很简单先创建要发送的邮件内容>发送>删除临时文件

如果用的是126邮箱就直接按照示例填写STMP服务器地址即可
若是163邮箱将126修改为163即可端口用不变
smtp.163.com

@echo off
chcp 65001

set "port=%1"
set "rulename=%2"
set "token=%3"
set "mail=%tmp%\%rulename%mail.txt"

echo From: 发件人邮箱 > %mail%
echo To: 收件人邮箱 >> %mail%
echo Subject: STUN穿透规则%rulename%端口变化 >> %mail%
echo. >> %mail%
echo 穿透规则%rulename%端口已变化,新端口号:%port% >> %mail%

curl --ssl-no-revoke --url "smtps://SMTP服务器地址(使用TLS)"  --user "发件人邮箱@之前的部分:%token%"  --mail-from "发件人邮箱"  --mail-rcpt "收件人邮箱"  -T %mail%

del %mail%

echo Mail has been sent

pause

示例

@echo off
chcp 65001

set "port=%1"
set "rulename=%2"
set "token=%3"
set "mail=%tmp%\%rulename%mail.txt"

echo From: ie12@126.com > %mail%
echo To: ie12@126.com >> %mail%
echo Subject: STUN穿透规则%rulename%端口变化 >> %mail%
echo. >> %mail%
echo 穿透规则%rulename%端口已变化,新端口号:%port% >> %mail%

curl --ssl-no-revoke --url "smtps://smtp.126.com:465"  --user "ie12:%token%"  --mail-from "ie12@126.com"  --mail-rcpt "ie12@126.com"  -T %mail%

del %mail%

echo Mail has been sent

pause

创建完成后我们先在命令提示符中进行测试
传参顺序》端口号-规则名称-授权码



若设置都正确即可收到邮件并看到 curl 的发送记录
如果存在错误 则可在此阶段进行排查
出现"Login denied"请检查授权码是否正确

命令提示符测试通过之后再放到 计划任务 中进行测试
应能收到邮件并有相同的日志输出


Linux(docker)

在Linux下的命令比Windows下要简单一些
编辑计划任务并按照实际情况填写下列命令

其中发件人邮箱和收件人邮箱可以相同即自己发邮件给自己
流程很简单先创建要发送的邮件内容>发送>删除临时文件

如果用的是126邮箱就直接按照示例填写STMP服务器地址即可
若是163邮箱将126修改为163即可端口用不变
smtp.163.com

echo -e 'From: 发件人邮箱\nTo: 收件人邮箱\nSubject: STUN穿透规则${ruleName}端口变化\n\n 穿透规则${ruleName}端口已变化,新端口号:${port}' > /tmp/${ruleName}mail.txt

curl --url 'smtps://SMTP服务器地址(使用TLS)' --user '发件人邮箱@之前的部分:授权码' --mail-from '发件人邮箱' --mail-rcpt '收件人邮箱' -T /tmp/${ruleName}mail.txt 2>&1

rm /tmp/${ruleName}mail.txt

示例

echo -e 'From: ie12@126.com\nTo: ie12@126.com\nSubject: STUN穿透规则${ruleName}端口变化\n\n 穿透规则${ruleName}端口已变化,新端口号:${port}' > /tmp/${ruleName}mail.txt

curl --url 'smtps://smtp.126.com:465' --user 'ie12:ABCDEFG' --mail-from 'ie12@126.com' --mail-rcpt 'ie12@126.com' -T /tmp/${ruleName}mail.txt 2>&1

rm /tmp/${ruleName}mail.txt

有些shell还支持 “过程替换” (process substitution)
可以不用创建临时文件 直接进行发送
详见:链接

curl --url 'smtps://SMTP服务器地址(使用TLS)'  --user '发件人邮箱@之前的部分:授权码'  --mail-from '发件人邮箱'  --mail-rcpt '收件人邮箱'  -T <(echo -e 'From: 发件人邮箱\nTo: 收件人邮箱\nSubject: STUN穿透规则${ruleName}端口变化\n\n 穿透规则${ruleName}端口已变化,新端口号:${port}') 2>&1

示意

curl --url 'smtps://smtp.126.com:465'  --user 'ie12:ABCDEFG'  --mail-from 'ie12@126.com'  --mail-rcpt 'ie12@126.com' -T <(echo -e 'From: ie12@126.com\nTo: ie12@126.com\nSubject: STUN穿透规则${ruleName}端口变化\n\n 穿透规则${ruleName}端口已变化,新端口号:${port}') 2>&1

完成后按下测试按钮查看日志输出
应该可以看到curl的发送记录并接收到邮件

如果存在错误 则可在此阶段进行排查
出现"Login denied"请检查授权码是否正确


编辑STUN规则

Windows

将测试好的命令复制到 STUN 规则的自定义脚本区域
端口号 规则名称 使用变量替代 其中规则名称不要包含中文

若在自定义脚本区域已经有命令则应按照流程顺序进行排列
并使用vbs脚本设置间隔 详情见 第一期的教程

邮件效果

Linux(docker)

直接将命令复制到 STUN 规则的自定义脚本中即可
若在自定义脚本区域已经有命令则应按照流程顺序进行排列

并使用sleep设置间隔

方法1

方法2

邮件效果

至此我们就完成了使用邮件通知STUN端口变化情况的设置


参考:

在Windows使用lucky更新DDNS

lucky内置的DDNS功能支持多家DDNS提供商
也允许使用自定义方式更新
更支持多种对外IP方式获取方式


本教程将分别介绍

  • Dynv6
  • NOIP
  • Cloudflare

这三家(动态)域名提供商的更新方法
不过账户创建和(动态)域名创建/购买的方法
并不是本教程讲解的重点


dynv6

dynv6创建账户和动态域名的方法
其实在之前的教程中已经讲解过

不过其是SRV记录教程的一部分
现进行单独的讲解

创建dynv6账户和动态域名不在此处讲解
可以看看之前的教程 :链接

获取API token
要使用dynv6的更新API
我们需要获取用于验证的token

点击右上角的账户名选择 keys

在HTTP Tokens 应该已经有了一个默认的Token
点开details 查看内容
注意不要泄露token 如果泄露应马上更换

将token复制下来我们马上就要用到

编辑更新规则
打开lucky>选择左侧的动态域名解析>添加任务

规则名称任意

托管服务商:dynv6

Token 填写之前获得的token

类型:选择IPv4

若要更新IPv6地址则选择IPv6
需要同时更新IPv6和IPv4地址则需要分别设置两条规则

域名列表
填写要更新的动态域名地址

获取公网方式 保持默认 即通过接口获取
保存规则

检查更新结果

等待片刻后显示公网IP未改变或更新成功即设置正确

如果出现公网IP获取设备请检查网络是否可以正常访问
这种问题可能较多的出现在IPv6上
请检查IPv6网络是否畅通

检视最终效果

IPv4地址

IPv6地址

不是IPv4地址下面的那个选项
而是在记录选项卡里中的AAAA记录

Cloudflare

(Cloudflare下文称CF)

CF的设置方法和dynv6的基本相同
不过在token的获取上要稍微多一些步骤

获取API token
访问下列地址以设置API token
链接

点击 创建令牌

选择编辑区域DNS
使用模版

在区域资源中的特定区域选择要更新的的域名(顶级域名)
其他保持默认 点击继续以显示摘要

继续点击 创建令牌

令牌已创建 复制下来我们马上就需要使用
其只会显示一次 要保存好 关闭页面

编辑规则
打开lucky>选择左侧的动态域名解析>添加任务

规则名称任意

托管服务商:Cloudflare

Token 填写之前获得的token

类型:选择IPv4

若要更新IPv6地址则选择IPv6
需要同时更新IPv6和IPv4地址则需要分别设置两条规则

域名列表
填写要更新的动态域名地址

获取公网方式 保持默认 即通过接口获取
保存规则

检查更新结果

等待片刻后显示更新成功即设置正确

NOIP

与之前的两家提供商不同
NOIP并不使用token而是直接使用账户名和密码进行验证
因此我们需要设置自定义请求

NOIP其实有自己的专用更新客户端
不过其并不算是很好用而且不支持更新IPv6

编辑规则
打开lucky>选择左侧的动态域名解析>添加任务

规则名称任意

托管服务商:自定义callback

Callback DNS服务商 :NOIP

点击 根据DNS服务商自动填充模版


参数会自动填充完毕但是我们仍然需要进行一些修改
比如NOIP的账户和密码

以及将更新地址的HTTP换成HTTPS
账户密码直接明文传输还是有些危险

类型:选择IPv4

若要更新IPv6地址则选择IPv6
需要同时更新IPv6和IPv4地址则需要分别设置两条规则

域名列表
填写要更新的动态域名地址

保存规则

示例

检查更新结果

等待片刻后显示更新成功即设置正确

在Windows下使用lucky实现TLS/SSL证书自动化

TLS和SSL

TLS 是传输层安全性协议 (Transport Layer Security) 的缩写 他的前身是 SSL 即安全套接层 (Secure Sockets Layer)其目的是保障在互联网通信时数据的完整性和安全性

SSL 由于存在安全缺陷目前已经不再使用 由升级后的安全性更高的TLS接替
但由于习惯原因很多地方仍然在使用SSL的叫法

HTTPS和TLS证书

HTTP即超文本传输协议其是明文传输的 在互联网上使用明文传输并不安全
而HTTPS超文本传输协议安全协议 算是HTTP的升级版本
它并不是独立的协议 而是在HTTP 协议的基础上使用 TLS/SSL 进行加密以提高数据在传输的安全性

TLS/SSL 证书被用于协商安全连接和验证网站或服务器的身份。
当客户端访问网站时会验证网站提供的 TLS/SSL 证书以确保连接的安全性

证书申请和续签

与过去相比证书的申请过程已经大大简化了
但仍然需要不少的手动操作
比如在域名托管处添加用于验证的TXT记录 以及等待记录更新

而且证书是有 有效期 的过期后需要进行续签
这时就又需要重复之前的操作
亦或者使用无图形界面的ACME自动化客户端

这仍然比较麻烦
但lucky可以方便的自动化的完成这些工作


本教程将介绍以下内容

  1. 为Dynv6下的动态域名申请证书
  2. 为Cloudflare的域名申请证书
  3. 映射证书以供其他程序使用
  4. 常见故障排查

Dynv6

获取API Token

此部分在之前的教程已经讲解过此次不再赘述
详见:链接

编辑规则

打开lucky选择点击左侧的 安全管理

选择SSL证书选项卡 并点击 添加证书

备注 任意填写
添加方式选择 ACME
验证方式选择 dynv6
Token 填写上一步中获取的 API token

域名列表
填写欲保护的(动态)域名

比如我这里有一个动态域名 ie12test.dynv6.net
那就可以填写 

ie12test.dynv6.net
*.ie12test.dynv6.net

第一行表示包括域名 ie12test.dynv6.net 
第二行表示包括以 .ie12test.dynv6.net 结尾的域名 

例如
abc.ie12test.dynv6.net
xyz.ie12test.dynv6.net
2233.ie12test.dynv6.net

但不包括再下一级的域名

例如
863.abc.ie12test.dynv6.net
5687.xyz.ie12test.dynv6.net

这样 ie12test.dynv6.net 
和.ie12test.dynv6.net 结尾的域名 都可以受到证书保护

当然这里可以填写更多的动态域名
只要在dynv6托管下且在上面填写的token权限范围内就行

打开DNS查询只使用TCP 和 忽略传播检查错误
保存规则

示例

检视效果

耐心等待 申请过程需要花费一些时间
若看到未申请到/申请中 的字样 变成了时间日期
同时多出了 绑定域名 颁发时间 和到期时间这三项 表示申请成功

示例


Cloudflare

获取API Token

此部分在之前的教程已经讲解过此次不再赘述
详见:链接

编辑规则

打开lucky选择点击左侧的 安全管理

选择SSL证书选项卡 并点击 添加证书

备注 任意填写
添加方式选择 ACME
验证方式选择 Cloudflare
Token 填写上一步中获取的 API token

域名列表
填写欲保护的域名

比如我这里有一个域名 ie12.net
那就可以填写 

ie12.net
*.ie12.net

第一行表示包括域名 ie12.net 
第二行表示包括以 .ie12.net 结尾的域名 

例如

abc.ie12.net
xyz.ie12.net
2233.ie12.net

但不包括再下一级的域名

例如
mc.xyz.ie12.net
3610.2233.ie12.net

这样 ie12.net 
和.ie12.net 结尾的域名 都可以受到证书保护

当然这里可以填写更多的域名
不过要注意一下token权限

打开DNS查询只使用TCP 和 忽略传播检查错误
保存规则

示例

检视效果

耐心等待 申请过程需要花费一些时间
若看到未申请到/申请中的字样 变成了时间日期
同时多出了 绑定域名 颁发时间 和到期时间这三项 表示申请成功

示例


证书映射

成功申请到的证书被加密存储在lucky内部 可被内置的web服务所使用
当然我们也可以将证书和私钥其映射到指定目录以供其他的程序使用

转到证书列表 点击修改

打开证书映射开关 并填写目录
申请到的证书和私钥将被映射到该目录中
此处演示的的是在Windows系统下的情况

检视效果

证书和私钥已输出 请小心保管这些文件


常见故障排查

证书申请过程是全自动的 一般不会出什么问题
如果申请时间较常且日志仍在刷新 请继续耐心等待
直到出现成功或失败的最终提示

若申请失败一般都是网络问题造成的
例如下图中就是连接 dynv6 的 API 超时引起的错误

可以尝试用浏览器访问一下 dynv6 看是否能打开
若lucky所在的设备无法使用浏览器则应使用其他方法验证
可使用同网络下的其他设备访问网页以排查问题

当然也可能出现下图中的情况
这是由于TXT记录查询失败引起的

请关闭任何形式的代理 加速器等可能影响DNS查询的软件后
再次尝试申请

在Windows下使用lucky配置反向代理以实现较为安全的远程访问

关于本教程

本文将主要介绍以下内容:

关于本教程
├─反向代理和正向代理的区别
├─使用简单反向代理的好处
│ ├─"端口复用"
│ ├─TLS加密
│ └─访问控制
├─域名设置
│ ├─
<br>

在Dynv6中设置CNAME
│ ├─在Cloudflare中设置CNAME
│ └─配置地址解析
├─配置基础反向代理规则
├─配置HTTPS
│ ├─开启TLS
│ └─配置HTTP重定向
├─防范恶意扫描
│ ├─来自网络扫描器的威胁
│ ├─为未匹配域名的请求设置重定向
│ └─配置Basic认证
├─常见问题
└─参考

反向代理和正向代理的区别

相比起反向代理正向代理更为人所知
我们也一般直接简称为代理
即通过用户通过代理服务器来连接想要访问的目标服务器

其实光从连接流程上来看正向代理和反向代理是差不多的
都是 用户-代理服务器-目标服务器

但正向代理 代理的是(用户的)客户端 即代替客户端与目标服务器连接
这样在目标服务器看来代理服务器就是来访问的用户
而真正的客户端没有和目标服务器"直接接触"被隐藏了起来

而反向代理代理的是 服务端 即代替真正的服务器接受用户的连接
这样在用户看来代理服务器就是要访问的目标服务器
而真正的目标服务器没有和用户"直接接触"被隐藏了起来

正向代理隐藏了客户端而反向代理隐藏了服务端


使用简单反向代理的好处

在家庭网络环境下使用反向代理主要有以下三点好处

  • “端口复用”
  • TLS加密
  • 访问控制

“端口复用”

在一般情况下是使用端口来区分服务
即用不同的端口号对应不同的服务
比如 路由器管理界面 NAS管理界面 BT软件webUI界面

不过服务一多起来就需要记忆很多端口
而且端口是纯数字并不方便记忆

使用反向代理可以实现"端口复用"
让多个服务使用同一个端口

由反向代理接受用户的请求之后再转发到对应的服务端
当然这意味着反向代理也需要一种方法来区分用户究竟想要访问什么

常见的区分后端服务的方法分别是

  • 域名区分
  • 资源路径区分

比如这里有一个域名ie12.net

根据域名来区分 即根据二级(多级)名称来区分

  • qb.ie12.net
  • op.ie12.net
  • alist.ie12.net

通过资源路径区分

  • ie12.net/qb/
  • ie12.net/op/
  • ie12.net/alist/


TLS加密

关于TLS在之前的教程中已有所讲解
详见:链接

访问控制

由于反向代理隐藏了真正的源服务器
所以用户在访问时连接的是反向代理服务器

可以在其上进行统一的访问控制
而无需在每一台服务器上都设置一遍

其实之前的“端口复用”法就能起到一定的访问控制效果
必须要匹配上域名或者资源路径才能访问到对应的服务
若匹配不上就不能访问 可以有效防范扫描攻击

当然除此之外也还能设置更多的访问控制条件


域名设置

在本教程中将使用域名区分法来区分后端服务

即通过不同的子域名来对应不同的后端服务
当然这些子域名只是名字不同它们指向的IP都是相同的

我们可以为每个子域名都设置IP地址并使用DDNS来更新
但这样太麻烦了
更好的方法是使用 CNAME记录 即别名记录

其不指向IP地址而是指向另一个域名
比如这里有域名 ie12.net 则可以设置CNAME记录

www.ie12.net   ┐
video.ie12.net ├─ ie12.net
file.ie12.net  ┘

这样这三个域名的IP地址即为ie12.net所记录的IP地址
更新IP地址时只需要更新ie12.net即可

在Dynv6中设置CNAME

有关Dynv6的部分配置方法在之前的教程中有所讲解过
详见:链接

登录Dynv6 > 点击 My Zones > 选择你的动态域名 > 添加CNAME记录

填写二级域名 host部分可以留空即使用上级主域名

检视效果

当然我们也可以将其指向其他域名
不过要在指向的域名后加上英文点号 .

检视效果

如果不加上英文点号的话 整个欲指向的域名就就会被加到前面

若需要多个子级域名则重复上述设置即可
更新IP地址时只需更新主动态域名(ie12test.dynv6.net)即可


在Cloudflare中设置CNAME

有关CF的部分配置方法在之前的教程中有所讲解过
详见:链接

登录CF > 点击侧边栏中的网站 > 选择你的域名 > 点击侧边栏中的DNS

添加CNAME记录 (Cloudflare下文简称CF)
相比Dynv6 CF上的设置更加简单

点击添加记录 > 类型选择CNAME > 名称自定义 方便记忆和区分服务即可 >
代理状态关闭即仅DNS > 目标直接填写主域名即可 > 保存

检视效果

若需要多个子级域名则重复上述设置即可
更新IP地址时只需更新主动态域名(ie12.com)即可

配置地址解析

完成上述配置后我们只需要更新主域名就可以同步更新所有子域名的IP
DDNS更新方法在之前的教程中已讲解过
详见:链接


配置基础反向代理规则

在完成了(动态)域名设置的工作后我们就可以开始配置反向代理规则了

创建WEB规则
登录lucky > 点击侧边栏的WEB服务 > 添加WEB服务规则

1.名称可自定义 这里使用"反向代理"
2.监听类型 全选
3.监听端口可自定义 这里使用默认的16666此端口为之后访问各服务的共用端口
4.确保该端口已经打开可在外网被访问到
5.此处的防火墙放行选项是为Linux系统下iptable设计的在windows、docker下无效
6.保存规则

示例

为服务添加子规则 点击添加子规则

编辑规则内容

1.子规则名称 可自定义 为方便区分一般填写网页服务的名字 这边使用alist网盘服务进行演示
2.服务类型:反向代理
3.前端地址 填写之前配置好用于代表服务的子(二级)域名这里用的是alist.ie12test.dynv6.net
4.后端地址 则是在内网访问服务时所使用的IP和端口 这里使用192.168.5.120:5244
(若lucky和被反代的服务运行在同一设备上则可以使用127.0.0.1若不是则应使用局域网内的IP)
5.打开万事大吉的开关 自动添加常见HTTP 请求头
3.保存规则

示例

检视效果

访问测试

在浏览器中输入 前端域名和端口 查看访问效果
示例:http://alist.ie12test.dynv6.net:16666/

多规则效果演示


!注意! qb需要关闭host header验证或打开定制模式中的 使用目标地址host请求头
否则会出现 Unauthorized 的报错

至此我们已经完成了最基本的反向代理设置


配置HTTPS

开启TLS

在互联网中使用HTTP明文访问并不安全 我们需加密的HTTPS
关于TLS和HTTPS的讲解请看之前的教程 完成链接中的证书申请工作后再继续接下来的步骤
详见:链接

编辑反代规则 开启TLS开关

检视效果 前端地址已经变成HTTPPS开头

访问测试


查看证书

配置HTTP重定向

在开启HTTPS后 直接输入域名访问可能会失败
因为在不指明协议的情况下默认使用HTTP协议 我们当然可以手动加上https://
不过这样比较麻烦(也有的浏览器支持自动跳转到HTTPS)

更好的方法是设置重新定向规则 自动的将HTTP重定向到HTTPS上

创建重定向规则

1.添加一个新的WEB服务规则
2.规则名称可自定义 这里使用HTTP重定向
3.监听类型全选
4.监听端口 与之前设置的反向代理规则使用相同的端口
5.保存规则

示例

接着添加子规则

1.规则名称可自定义这里使用"一般重定向"
2.服务类型选择 重定向
3.前段地址填写 所使用域名的泛域名 这里使用的是 *.ie12test.dynv6.net
4.后端地址填写 https://{hostAndPort}
5.打开 万事大吉开关
4.保存规则

前端地址中的*.ie12test.dynv6.net 表示泛域名 关于其含义在之前的证书申请的教程已经有所讲解 :链接
后端地址中的 https:// 表示使用HTTPS协议 而变量{hostAndPort} 则表示 请求的主机名/域名以及端口
其他可用变量: 链接

示例

检视效果

测试重定向效果

在浏览器中直接输入域名应该可以自动跳转到HTTPS


防范恶意扫描

来自网络扫描器的威胁

在完成了上述的设置后我们已经基本实现了安全的WEB访问
不过在互联网上运行着许多的自动化的端口扫描与刺探程序(网络扫描器)
它们全天候的扫描和记录着全球设备上开放的端口及其上面的服务

这主要发生在IPv4上 IPv4的地址数量较少 在除去各种特殊地址后就更少了
通过逐个IP和端口的扫描这些扫描器可以轻松扫描完全球的设备

当然这些扫描器并不知道 我们设置的前端域名 其应只会使用IP和端口来访问
固不能匹配上前端域名 这样一来藏在反代后方的真正服务不会被发现

只不过在默认情况下lucky在遇到没有匹配任何域名的请求时会返回一个404错误页面
尽管这个页面并不会泄露什么 即使是HTTPS也不用担心证书/域名泄露 当没有域名匹配时
lucky会使用一张自签名证书 不用担心域名泄露问题

但是通过这个404错误页面 扫描程序依然能发现该端口上有名为 lucky 的WEB服务在运行
比较理想的状态是nginx的 444响应 即不发送响应直接关闭连接
但现在还不能实现 作者以后可能会更新类似的功能

当下比较好的方法是 将这些无法匹配前端域名的非法请求重新定向到其他网站比如百度之类的

其实网络扫描器也并非百害而无一利 一些 端口搜索引擎 也会使用其来记录端口

例如:

我们可以使用这些端口搜索引擎来检查自己IP上暴露出的端口和服务 以做到提前预防

为未匹配域名的请求设置重定向

编辑反向代理主规则

切换到定制模式

滚动页面 > 点开默认规则 > 修改服务类型为 重定向 >
填写默认目标地址 https://www.baidu.com > 保存规则


检视效果

编辑HTTP重定向主规则

修改方法和反向代理规则相同

检视效果

配置Basic认证

对一些不带登录认证的网页 可以添加Basic认证 以起到额的外保护作用
开启 Basic认证 会多一个登录验证的过程

设置Basic认证之前

编辑子规则 开启Basic认证开关 设置用户名和密码

检视效果


常见问题

请参考:链接


参考