[干货]使用Sakura Frp和Lucky实现公网ipv4端口访问

参考文章:bilibili-【使用Lucky的STUN穿透,部署近似公网IPv4的反向代理服务】

bilibili-【使用Lucky在公网IPv4环境自建重定向和中转服务,固定STUN的反代端口】

bilibili-「LUCKY STUN穿透」使用Cloudflare的页面规则固定和隐藏网页端口

一、什么是stun?

百度上面的回答是这样的:

是不是讲了一大堆也没看懂?我的理解是:

举个栗子🌰:

下面是我们家庭网络拓扑结构图,通常来说只有运营商才有公网ip(NAT0),然后通过PPPoE拨号上网,我们家庭的全部内网设备都是全锥形网络(Full Cone/NAT1)。然后通过STUN协商,互相告诉自己内部端口和外部端口的对应关系,如台式机开放的6666端口通过NAT转换到WAN区域7777端口;在运营商这边又进行一次NAT转换成8888端口,即:内网6666端口->软路由7777端口->公网8888端口,反过来也可是同理的。这样的话只要知道公网ipv4和8888端口就可以访问到内网的服务了。

但是这样又有一个问题,公网ipv4地址我们是可以知道的,但是开放的端口我们又怎么获取呢?诶,这就得STUN技术排上用处了。通过这个技术我们可以一层一层反推出外部公网访问的端口的多少,从而达到公网ipv4端口的目的。

二、前提条件

  • 需要路由器具备NAT1网络,否者无法进行STUN穿透
  • 需要拨号路由器为openwrt或者拨号的路由器设置DMZ转发至内网的openwrt设备
  • 需要拥有一个备案域名
  • 会使用反向代理和重定向功能
  • 会使用ddns动态域名解析
  • 会使用Frp内网穿透功能

国内备案域名的是比较麻烦的,我自己是用了大约20天的时间,因为使用的Frp的http/s解析的话需要有备案的域名。备案需要备案码,可以上万能淘宝可以看看,会有收获的。

三、实操部分——Lucky

这里使用的openwrt是iStoreos,所以lucky可以在iStore里面下载,或者在官网下载安装包,Sakura Frp的话有教程,安装对应版本的安装包

打开lucky->动态域名->添加ddns任务,选择你的dns服务商,填写对应的api和密钥,公网IP类型为ipv4,获取公网IP方式选择通过接口获取,域名列表填写你的泛域名(这里使用*.a.com),点击添加即可完成泛域名解析

打开安全管理->添加证书,添加方式选择ACME,证书颁发机构选择Let’s Encrypt,填上你的API接口和密钥,点击添加后过一会儿即可完成泛域名SSL证书申请。

点击Web服务->添加Web服务规则,名称填写HTTP重定向HTTPS,监听端口选择16666,监听类型选择全选,点击小下面的添加Web服务子规则,名称随意,Web服务类型选择为重定向,前端地址填写http://alist.a.top,后端地址填写:https://alist.a.com,点击修改即可完成http转https转换。其他同理。

再添加一个web规则,名字填反向代理,监听类型选tcp4,监听端口填16667,打开TLS,如何添加一个Web子规则,Web服务类型选择反向代理,前端地址填alist.a.com,后端地址填写alist的服务地址(这里为http://192.168.100.1:5244),点击修改即可完成反向代理。其他的也是同理。

bilibili-「LUCKY STUN穿透」使用Cloudflare的页面规则固定和隐藏网页端口

到这里就完成了Web服务的部分

四、实操部分——Sakura Frp

因为STUN获取的ip和端口号都是动态的,我们不知道它什么时候回再变,因此我们需要固定ip和端口号。

ip的话我们用ddns固定下来了,就是端口号的话需要我们借助Frp先获取到STUN穿透后的端口再重定向到公网ip+STUN穿透端口去访问,网络拓扑图如下:

下面解释一下各个步骤是上怎么样的

①先给用户访alist.a.com的网站,会先去DNS服务器查询解析结果

②DNS服务器返回查询结果为CNAME记录的frp.com,并访问frp.com

③用户访问带着alist.a.com去访问frp.com,因为我们做了frp内网穿透,所以在frp.com上面会有域名alist.a.com对应的Frp隧道

④alist.a.com跟着Frp隧道来到内网

⑤Frp客户端将隧道的内容转发到16666端口

⑥16666端口因为开着重定向,所以会将结果重定向到https://alists.a.com:#{port},这里的#{port}指的是STUN穿透后的公网端口

⑦用户收到重定向请求

⑧重新请求DNS服务器查询alists.a.com对应的地址

⑨DNS服务器返回公网ip地址120.120.120.120

⑩用户带着https://alists.a.com:#{port}去访问120.120.120.120

⑪运营商收到连接请求并NAT转发到内部端口的60001

⑫软路由再将外部60001端口NAT转发到内部端口16667

⑬反向代理收到来自https://alists.a.com:16667的http请求

⑭16667端口因为开着反向代理,所以将其发至192.168.100.1:5244

最终获得https连接

①先去Sakura Frp的控制面板的隧道列表创建一条隧道,节点选择可以建站并且离你近的节点,选择https建站隧道,端口号改为16666,并且绑定域名alist.a.com,创建http重定向,https为自动

②在openwrt上面的Sakura Frp填上访问密钥和密码就可以完成Frp客户端的配置了

③回到Sakura Frp的控制面板,在服务->远程管理选项启动openwrt的Frp隧道

推荐每次启动前先点一下那个刷新按钮来保证配置文件的正确

刷新完成后双击节点即可启用隧道。

打开你的域名DNS解析控制面板,添加一条新纪录,记录方式如下:

  • 主机记录:alist4
  • 记录类型:CNAME
  • 记录值:在隧道列表鼠标指到那个节点上会有显示

这样就完成了Frp的DNS解析

五、固定STUN穿透端口

点击STUN内网穿透->添加穿透规则,名字填alist,穿透类型选择IPv4-TCP,穿透通道监听端口不冲突的端口,这里设为60001,如果你是作为网关的话可以不用打开NAT-PMP,目标地址填写你的服务地址(这里为192.168.100.1),目标端口同理(5244),点击添加即可完成,等待一就会显示穿透URL

178.236.37.54:25004就是你那STUN穿透后的URL了(这里显示是错误的,请在百度输入ip来查询是否对应),你可以通过这个url在公网来访问你的alist服务。

不出意外的话你会发现还是无法访问(可能区别于连接拒绝),这是因为我们设置了反向代理,里面没有对应ip的子规则,所以它不会有任何回显。但是问题不大,我们接着继续。

Lucky提供了OpenToken的API接口和WebHook,可以搭配这两个功能,来实现当STUN穿透端口改变的时候修改16666端口的重定向记录,这样就实现的端口号的固定

在lucky的设置->开发者设置->开启OpenToken,并且复制下密钥保存到文本

回到Web服务页面,点击alist的重定向按钮会得到一个api

[{“rule”:”Nn1SLsPD3VAYe1HD”,”subRule”:”kb6Jqoe5nLVP88T5″,”serviceType”:”redirect”,”location”:”https://alists.a.top”}]

里面包含四样信息:唯一标识、子规则唯一标识、子规则类型、后端地址,保存这个API到文本

打开STUN内网穿透,点击alist的编辑按钮,开启Webhook,接口地址填写依次填写:

  • 接口地址:http://127.0.0.1:16661/openapi/webseivce/update
  • 请求头:openToken:你的OpenToken
  • 请求方法:PUT
  • 请求体:alist规则的api,并把后面的URL改为https://alists.a.com#{port}
  • 接口调用成功包含的字符串:{“ret”:0}

如果有多api的话多用逗号隔开,包含在一个[]里

填写完成后先点击一下Webhook手动触发测试,看看是否返回{“ret”:0},如果返回正确的话回到Web服务,你会看到域名和端口号都发生了改变

这样,访问alist.a.com就会知道跳转到https://alists.a.com:25004并且显示出alist的Web页面了

lucky官网发现有直接调用stun端口的全局变量,可以直接在后端地址填写https://alists.a.top:{STUN_alist_PORT},来直接修改stun穿透端口

后记

并且只能获取到公网的一个端口号,每一个公网端口号都要进行Frp穿透、重定向、反向代理和WebHook,操作比较繁琐。

还有一个吐槽的点就是既然都有Frp了,为什么还要这么麻烦去折腾这些呢?因为一方面是Frp带宽比较小,一般免费的Frp速率都不会大于10mbps,况且家里的带宽上传有30Mbps,使用Frp无法跑满带宽,另一方面就是Frp会经过Frp服务器的中转,会导致连接时延的增加。

通过本教程使用Frp有一个优点就是只有用户连接服务器时只有第一次重定向的时候会消耗Frp的流量,并且对带宽的要求非常的小,几乎可以忽略不计,这有利于即时使用的Frp隧道限速非常严重,也不怕连接速度会有差别。所以等到跟公网地址成功建立连接之后速度和延时都能最优化。


📌 本文由 FishBoss_Tca 原创,转载请注明作者和原文链接。
原文链接:https://www.ytca.top/guidance/openwrt/144/

评论

  1. xuexin
    3 月前
    2025-5-13 23:19:09

    60001端口转发到16667端口是在哪里设置的?以及webhook那的接口地址的16661端口🈶是啥?还是16661就是16667?

    • 博主
      xuexin
      3 月前
      2025-5-14 22:39:17

      建议看看我发过的文章,这个方案目前已经被废弃了,目前更好的替代方案,就是使用cloudflare实现

发送评论 编辑评论


|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇