【观前提醒】
本教程旨在为异地无公网IPv4的环境,提供方便从不特定的纯IPv4外部网络,直接访问内网服务
阅读本教程需要一定的网络和Web服务相关知识基础
本教程基于有公网IPv4的网络环境,使用安装在OpenWrt上的Lucky
需要OpenWrt作为拨号的主路由,或者在拨号设备上设置OpenWrt为DMZ主机
因为本人能力有限,如因为网络和设备等与教程不同而遇到问题,请自行探索
关于Lucky的安装和使用请在官网https://lucky666.cn/仔细阅读说明文档和网友的经验分享
上一期讲了怎么用域名和STUN随机的公网端口访问内网服务
【使用Lucky的STUN穿透,部署近似公网IPv4的反向代理服务】https://www.bilibili.com/read/cv28567798
这期讲一下如果你恰好拥有另一处公网IPv4环境的网络,该怎么为无公网的环境固定访问端口
【第1步 添加DDNS】
上一期已经讲解过如何在Lucky添加DDNS任务
这次你需要另一个域名
假设你另一个域名是b.com,域名列表填写b.com和子域名*.b.com
这样就能把你的公网IP解析到域名了
【第2步 申请SSL证书 】
上一期已经讲解过如何在Lucky申请SSL证书
这次域名列表填写b.com和子域名*.b.com
把使用IPv4通道申请证书、DNS查询强制IPv4、DNS查询仅使用TCP通道都打开
5d2ecb9879b60e0d5abdc56e88896043180146.png@1002w_2450h.avif
【第3步 设置重定向跳转或反向代理中转】
在Lucky的Web服务一栏点击添加Web服务规则
监听端口选择tcp4,监听端口填一个未被占用的端口,这里假设端口是4
打开防火墙自动放行和TLS,点击添加Web服务子规则
假设需要设置的是上一期AList反向代理的重定向
Web服务类型选择重定向
前端域名填写alist.b.com(子域名前缀可以随你喜欢)
后端地址填写AList的反向代理地址和端口https://alist.a.com:1132
这样在外部网络用浏览器输入alist.b.com:4时就会自动跳转到alist.a.com:1132
如此一来就实现了公网端口的固定,不用再看通知输入随机的端口了
但是有些使用websocket的服务是无法通过重定向跳转使用的,就比如Home Assistant的APP
首先编辑Web服务规则,把操作模式改为定制模式,点击添加Web服务子规则
Web服务类型选择反向代理,打开忽略后端TLS证书验证、使用目标地址Host
前端域名ha.b.com,后端地址https://ha.a.com:1132
注意,二次反向代理Home Assistant需要禁用Lucky默认打开的万事大吉,否则会报错400 bad request
查阅其日志可以看到报错原因为请求头过多,所以需要关闭自添加请求头的万事大吉
这样在外部网络用浏览器输入ha.b.com:4就不会跳转,APP就能正常使用websocket
这就是重定向跳转和回源中转的区别,一个会改变浏览器显示的地址,一个不会
前者能让你直连后端的服务,流量不经过当前设备,资源消耗低,性能更高
后者虽然会让流量经过当前这台设备,但是可以支持一些不能跳转的服务
当然,也别忘了添加HTTP自动跳转HTTPS的Web服务规则
【第4步 设置Webhook同步变化的端口】
上一期已经讲过STUN获取的公网端口是随机的,也就是一旦变化就要修改上一步中后端的端口
为此需要设置Webhook以自动同步这个端口,否则手动改设置岂不是比看通知更麻烦
Lucky提供了OpenToken供第三方开发者调用api使用,在Lucky的设置一栏最底下打开,点保存修改
记下这个OpenToken
启用OpenToken后,点击Web规则的这个地方,就会得到一条api
形如[{"rule":"4gC0PGgEDKv0gCcD","subRule":"u4ZmO8CYRUAr1tH8","serviceType":"redirect","location":"https://alist.a.com:1132"}]
包含了规则的唯一标识、子规则唯一标识、子规则类型、后端地址四项信息
api会被自动复制到剪贴板,记下这个api
然后给Lucky也添加一条Web服务子规则来远程调用api
Web服务类型选择反向代理
前端例如lucky.b.com,后端填写Lucky的地址和端口,例如http://192.168.1.1:16601
b2e984fadfb05b87f88ba5cce9dfc078180146.png@1192w_1848h.avif
接下来回到上一期中设置STUN穿透的那台设备上的Lucky编辑穿透规则
因为已经不需要再查看通知得知变化后的端口了,全局Webhook可以关闭
打开这条规则自身的Webhook
接口地址填https://lucky.b.com:4/openapi/webseivce/update
https://lucky.b.com:4是刚才设置的Lucky的反向代理域名端口
请求方法选择PUT
请求头填openToken:XXXXXXXXXX
XXXXXXXXXX就是刚才记下的OpenToken
请求主体填刚才记下的Web服务子规则的api,把数字端口改成#{port}
多条api像下面这样选取{}里的内容用逗号隔开,包含在一个[]里
[{"rule":"4gC0PGgEDKv0gCcD","subRule":"u4ZmO8CYRUAr1tH8","serviceType":"redirect","location":"https://alist.a.com:#{port}"},
{"rule":"4gC0PGgEDKv0gCcD","subRule":"WRsd9mAVfYVpIp77","serviceType":"reverseproxy","location":"https://ha.a.com:#{port}"}]
接口调用成功包含的字符串填{"ret":0}
这样在STUN获取的公网端口变化时,就会被自动同步到公网设备上的Lucky
【下期预告】
没有了,完结撒花
感谢古大羊大佬提供了Lucky这样一款好用的插件

评论