真诚友善团结专业,共建你我引以为荣之社区。《常见问题解答》
阅读时间 4 分钟
60 / 60
3月 7 日

感谢 qaz741wsd856 作者的分享,非常优秀的教程
打通大内网第一期 无公网部署 https 和反向代理 (基于 Lucky 的 STUN 穿透) - 简书

因为现在运营商已经不再发放公网 ipv4 地址,所以只能使用公网 ipv6 地址作为服务站点。但是 ipv6 并不是所有网络环境都具备的,为了使服务更加普适,我尝试利用 STUN 内网穿透实现此需求。

内容完全参考原教程,我只是将部署过程中的过程调整了一些,省略了一些:

首先确认满足以下条件:

  • NAT 类型为 NAT1,即 fullcone;
  • 光猫桥接或开启 dmz;
  • 路由器能刷机或者开启 upnp/dmz

我在办理宽带时已经做好光猫桥接,并在红米 AX6000 路由器上安装了 Lucky 插件。基于此前提,有以下的实现步骤:

开启 STUN 内网穿透

进入 Lucky 插件后台,点击 STUN内网穿透选项

更新 STUN 服务列表

添加穿透规则

点击穿透规则列表 - 添加穿透规则具体设置如下:


运气好的话,就能看到 STUN穿透公网地址显示出穿透成功的公网 ipv4 地址:端口号,访问测试一下。如果没问题,那么就接着下面的步骤;如果没地址,那就算了。

设置 cloudflare 的重定向规则

因为使用 STUN 穿透时,不光 ip 地址会变,端口也会变,使用起来十分不便利。
这时可以利用 cloudflare 的重定向规则,访问域名时自动跳转到穿透后的 IP: 端口,不损失速度。
如何实现地址更新呢?其实就是利用 webhook,将变更的 IP 地址填入 cloudflare 的请求体,PATCH 请求重定向规则的 API,实现自动绑定地址到域名的效果。

解析域名

访问 cloudflare,在你的网址的 DNS 中添加一个 A 类型的记录,ipv4 地址从下面站点优选一个填入,代理状态勾选:

配置重定向规则

点击左侧菜单的规则 - 重定向规则,在单一重定向页面下点击创建规则,规则名称随意设置。

当传入请求匹配时... 处选择自定义筛选表达式,字段选择主机名,运算符选择等于需填入自行设置的用于跳转的域名;示例为 test.yourdomain.comtest 为自定义的二级域名前缀,yourdomain.com 换成你的顶级域名。

URL 重定向处选择类型为动态并勾选保留查询字符串,状态码选择 302307 均可;表达式填入当前 STUN 穿透成功的地址即可,然后点击部署。
image

抓包获取请求内容

部署规则成功后,重新点击编辑,这时按 F12 打开开发者工具,点击右侧开发者工具的网络或者 network 选项卡,然后再点击保存按钮。

接下来可以在开发者工具中看到一串数字 + 字母的项,点击它,在标头选项卡下复制并保存下它的请求网址;然后切换到载荷选项卡,右键第一行复制并保存它的值。



请求网址:

https://dash.cloudflare.com/api/v4/zones/区域id/rulesets/规则集id/rules/规则id

请求载荷:

{ "id": "c7087a0fb757480xxxxxxxxxxxxxxxx", "version": "1", "action": "redirect", "expression": "(http.host eq \"test.yourdomain.com\")", "description": "redirect", "last_updated": "2024-05-28T08:14:45.555123Z", "ref": "c7087a0fb757480xxxxxxxxxxxxxxxx", "enabled": true, "action_parameters": { "from_value": { "status_code": 307, "target_url": { "expression": "concat(\"http://183.6.66.666:6666\", http.request.uri.path)" }, "preserve_query_string": true } } }

自动更新重定向规则

创建 cloudflare 令牌

我们需要一个 cloudflare 编辑重定向的令牌:

  • 点击 Cloudflare 控制台右上角 - 我的个人资料,在左侧菜单点击 API令牌,页面中点击创建令牌

  • 在令牌创建页面选择创建自定义令牌

  • 权限和区域资源如图设置,区域资源第三列选择你要用于跳转的域名

然后点击继续 - 创建令牌

  • 保存第二行双引号里的内容 Authorization: Bearer ******-****,作为接下来要使用 Webhook 的请求头
curl -X GET "https://api.cloudflare.com/client/v4/user/tokens/verify" \ -H "Authorization: Bearer ******-****" \ -H "Content-Type:application/json"

编辑 webhook

  • 接口地址:
https://api.cloudflare.com/client/v4/zones/区域id/rulesets/规则集id/rules/规则id

将请求网址的前半部分 https://dash.cloudflare.com/api/ 替换为 https://api.cloudflare.com/client/ 即可

  • 请求方法:PATCH
  • 请求头:
Authorization:Bearer API 令牌
  • 请求主体:
    把之前保存的请求载荷删去 last_updatedversion 后,将 expression 中的 ip:端口替换为#{ipAddr}
    你的 idref 应该与规则id 一致,description 就是之前设置的规则名称。
    参考样式:
{ "id": "c7087a0fb757480xxxxxxxxxxxxxxxx", "action": "redirect", "expression": "(http.host eq \"test.yourdomain.com\")", "description": "redirect", "ref": "c7087a0fb757480xxxxxxxxxxxxxxxx", "enabled": true, "action_parameters": { "from_value": { "status_code": 307, "target_url": { "expression": "concat(\"http://#{ipAddr}\", http.request.uri.path)" }, "preserve_query_string": true } } }

填完后点击 Webhook 手动触发测试,查看返回内容中是否包含接口调用成功字符串:"success": true

配置全局 Stun Webhook

因为更新 webhook 已经被占用,可以使用全局 webhook 来通知更新情况,我这里使用反代后的 tg bot 接口:
请求主体:

{ "chat_id": "", "text": { "Device": "Lucky STUN", "ipv6": { "time": "#{time}", "addr": "#{ipAddr}", "rule name": "#{ruleName}" } } }

然后就完事了,访问域名看看是不是正常跳转了。

阅读时间 4 分钟

因为有重定向表达式会触发 waf,劳烦各位去原教程处查阅:
image

要用 cf tunel,因为 stun 还是不稳定,用 CF 穿透 lucky 面板备用调试

其次我也是这个方案,然后再搭建一个 homepage,实时获取重定向跳转界面的端口,通过反向代理固定域名,现在访问 homepage,域名不变,端口自动添加,你需要记忆的就不是端口,而是域名前缀,我感觉这样还安全一点(我不会说是我没有公网 ip),毕竟端口不固定

我不太明白这个原理,是说在第一次重定向的基础上,在建立一个域名来二次重定向吗?实现固定域名加端口自动?

应该是我没表达清楚:joy:
我有两个域名,A 和 B
平时内网服务访问都是用 A + 随机端口,但是不想记端口
所以像你这样用 CF 重定向跳转,实现访问 B 域名跳转到 A 域名加端口
而内网也搭建了一个反代服务器,所以现在只需要记忆:
B 域名和每个服务的拼音或者汉字就好了,我现在的步骤也就是

访问 B 域名,跳转到我搭建 kuma 服务,更改 A 域名前缀,访问 xx 服务简写.a.com: 随机端口

而且我是定时重启 stun 穿透更换端口的,所以我说感觉毕竟安全,因为端口不固定,我都记不住哈哈
上面看着麻烦,其实就那么两步,不需动脑

你这么弄是因为完全没有公网 ip 是吧?所有的服务都是用 stun 穿透

请教一下大佬这里 stun 穿透是不是基于 UDP UDP 协议是不是经常被运营商限速? 同时大佬可否出个视频教程 这样方便学习 感谢大佬

Stun 穿透是可以选择 TCP 或者 UDP 的.
限速没有这种说法,家宽上行就是 50mbps
具体的使用我都是在 lucky 插件里完成的,安装成功后,会在里面找到官网优选的网络教程,安装教程走就行

感谢大佬回复,如何确定 NAT 类型为 NAT1,fullcone,有没有检测工具软件?
如果不是 有办法调整为 NAT1 吗?

我的做法是穿透一个页面做导航页,每次变动更换 ip 和端口自动写入到导航页,基本上一周变一次吧

检测的话,直接上网搜一下就有
改应该是改不了的,但是基本上家宽都是 nat1,最起码只要路由器能开启 UPnP,正常出现端口就没问题
我认为是这些

看看 stun 穿透日志,如果 lucky 不是装在路由器上,那是有其他配置的,看看官方优选教程

lucky 是装在 openwrt 上的,stun 上只有穿透成功的日志,没有访问的日志,无论用 ikuai 和 openwrt 的 UpnP 都访问不上,在 UpnP 上是有转发记录的。同时用 pystun3 -H stun.miwifi.com,返回是 NAT Type: Full Cone 的。看文档和文档也没看问题来

感谢大佬,已经按照教程并借用 CF 实现自动跳转,希望利用 CF 实现域名 + 端口的形式 登录内容远程桌面,应该如何实现呢?大佬可否给个教程?
目前实现的是利用 CF 的域名 自动跳转为 IP + 端口的形式

我记得 RDP 是需要开好几个端口的,只是 web 转发应该不行吧
我反正用 moonlight 远程是直接端口映射,点对点的

开一个 3389 就可以了 Moonlight 也是同理 就是他这个端口是动态的 每次要查一下最新的 IP 和端口是多少? 有点小麻烦 用 CF 套域名的形式后 可以通过访问域名返回最新的 IP + 端口

我看 moonlight 的文档不是一个端口,所以才选择端口映射的,看来是我误会了,还是说是你的 UPnP 发挥了作用

2 个月后

openclash 如果用 fakeip 模式,会有影响的,要在黑名单那,把 stun 的端口的域名全部过滤掉

15 天后
8 天后
2 个月后

按照教程设置一个 只能穿透一个接口 楼主能出个多端口的教程吗

端口没有限制呀,这个按理说开一个还是开多个都是一样的步骤的吧

16 天后

nat1 情况下,打开 dmz 不就是公网环境了吗,不太懂,我家里就是这么个情况

2 个月后
10 天后

大佬请问返回:NetworkCallApiFailure :
{“success”:false,“errors”:[{“code”:10000,“message”:“PATCH method not allowed for the api_token authentication scheme”}]}
这个是什么原因

2 个月后