参考文章:bilibili-【使用Lucky的STUN穿透,部署近似公网IPv4的反向代理服务】
在浏览本文章之前,建议你已认识DDNS、重定向、反向代理技术
前言:在国内ipv4严重短缺的情况下,要想获得公网ipv4是特别困难的,特别是移动的大内网环境,只有运营商的机房中才会分配有公网ipv4。那在这种情况下我们又有什么办法获得公网ipv4呢? 这就用到了一个STUN穿透技术。
一、什么是stun?
百度上面的回答是这样的:
是不是讲了一大堆也没看懂?我的理解是:
STUN简单来说就是通过互相协商各自路由器内部和外部端口的映射关系(NAT),一层一层反推出公网ip开放的端口。
举个栗子🌰:
下面是我们家庭网络拓扑结构图,通常来说只有运营商才有公网ip(NAT0),然后通过PPPoE拨号上网,我们家庭的全部内网设备都是全锥形网络(Full Cone/NAT1)。然后通过STUN协商,互相告诉自己内部端口和外部端口的对应关系,如台式机开放的6666端口通过NAT转换到WAN区域7777端口;在运营商这边又进行一次NAT转换成8888端口,即:内网6666端口->软路由7777端口->公网8888端口,反过来也可是同理的。这样的话只要知道公网ipv4和8888端口就可以访问到内网的服务了。
但是这样又有一个问题,公网ipv4地址我们是可以知道的,但是开放的端口我们又怎么获取呢?诶,这就得STUN技术排上用处了。通过这个技术我们可以一层一层反推出外部公网访问的端口的多少,从而达到公网ipv4端口的目的。
二、前提条件
1、先说下STUN穿透的条件:
- 需要路由器具备NAT1网络,否者无法进行STUN穿透
- 需要拨号路由器为openwrt或者拨号的路由器设置DMZ转发至内网的openwrt设备
2、再说一下实现近似完美的ddns反向代理前提:
- 需要拥有一个备案域名
- 会使用反向代理和重定向功能
- 会使用ddns动态域名解析
- 会使用Frp内网穿透功能
国内备案域名的是比较麻烦的,我自己是用了大约20天的时间,因为使用的Frp的http/s解析的话需要有备案的域名。备案需要备案码,可以上万能淘宝可以看看,会有收获的。
三、实操部分——Lucky
1、安装lucky和Sakura Frp
这里使用的openwrt是iStoreos,所以lucky可以在iStore里面下载,或者在官网下载安装包,Sakura Frp的话有教程,安装对应版本的安装包
2、配置ddns
打开lucky->动态域名->添加ddns任务,选择你的dns服务商,填写对应的api和密钥,公网IP类型为ipv4,获取公网IP方式选择通过接口获取,域名列表填写你的泛域名(这里使用*.a.com),点击添加即可完成泛域名解析
3、配置SSL证书
打开安全管理->添加证书,添加方式选择ACME,证书颁发机构选择Let’s Encrypt,填上你的API接口和密钥,点击添加后过一会儿即可完成泛域名SSL证书申请。
4、添加重定向规则
点击Web服务->添加Web服务规则,名称填写HTTP重定向HTTPS,监听端口选择16666,监听类型选择全选,点击小下面的添加Web服务子规则,名称随意,Web服务类型选择为重定向,前端地址填写http://alist.a.top,后端地址填写:https://alist.a.com,点击修改即可完成http转https转换。其他同理。
5、添加反向代理
再添加一个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连接
1、配置Sakura Frp
①先去Sakura Frp的控制面板的隧道列表创建一条隧道,节点选择可以建站并且离你近的节点,选择https建站隧道,端口号改为16666,并且绑定域名alist.a.com,创建http重定向,https为自动
注意:前提条件说的需要拥有一个备案域名就是走http隧道时候需要验证备案时使用的
②在openwrt上面的Sakura Frp填上访问密钥和密码就可以完成Frp客户端的配置了
③回到Sakura Frp的控制面板,在服务->远程管理选项启动openwrt的Frp隧道
推荐每次启动前先点一下那个刷新按钮来保证配置文件的正确
刷新完成后双击节点即可启用隧道。
2、配置DNS解析记录
打开你的域名DNS解析控制面板,添加一条新纪录,记录方式如下:
- 主机记录:alist4
- 记录类型:CNAME
- 记录值:在隧道列表鼠标指到那个节点上会有显示
这样就完成了Frp的DNS解析
五、固定STUN穿透端口
1、添加STUN穿透
点击STUN内网穿透->添加穿透规则,名字填alist,穿透类型选择IPv4-TCP,穿透通道监听端口不冲突的端口,这里设为60001,如果你是作为网关的话可以不用打开NAT-PMP,目标地址填写你的服务地址(这里为192.168.100.1),目标端口同理(5244),点击添加即可完成,等待一就会显示穿透URL
178.236.37.54:25004就是你那STUN穿透后的URL了(这里显示是错误的,请在百度输入ip来查询是否对应),你可以通过这个url在公网来访问你的alist服务。
注意:这里可能会出现连接拒绝的问题,这时候请查看是否开放了对应的防火墙端口(60001),那个防火墙自动放行不起作用的时候请在openwrt的网络->防火墙->通信规则->添加一条规则
不出意外的话你会发现还是无法访问(可能区别于连接拒绝),这是因为我们设置了反向代理,里面没有对应ip的子规则,所以它不会有任何回显。但是问题不大,我们接着继续。
Lucky提供了OpenToken的API接口和WebHook,可以搭配这两个功能,来实现当STUN穿透端口改变的时候修改16666端口的重定向记录,这样就实现的端口号的固定
2、设置OpenToken
在lucky的设置->开发者设置->开启OpenToken,并且复制下密钥保存到文本
3、获取重定向的API
回到Web服务页面,点击alist的重定向按钮会得到一个api
[{“rule”:”Nn1SLsPD3VAYe1HD”,”subRule”:”kb6Jqoe5nLVP88T5″,”serviceType”:”redirect”,”location”:”https://alists.a.top”}]
里面包含四样信息:唯一标识、子规则唯一标识、子规则类型、后端地址,保存这个API到文本
4、设置STUN穿透的WebHook
打开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}
注意请求体的URL是alists,你也可以换成其他名字也可以,但不能是alist,因为alist被分配至Sakura Frp服务器那边去了,其他名字都被泛域名解析到公网ipv4上
如果有多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穿透端口
后记
到这里我们的教程就结束了,可以说是基本上获得比较接近公网ipv4的效果了,但是这其实也还有一个局限性——只能用于HTTP协议。因为它依赖于Http协议本身的特性进行URL重定向,无法做到TCP和UDP的流量转发,所以只能适用于Web应用。
并且只能获取到公网的一个端口号,每一个公网端口号都要进行Frp穿透、重定向、反向代理和WebHook,操作比较繁琐。
还有一个吐槽的点就是既然都有Frp了,为什么还要这么麻烦去折腾这些呢?因为一方面是Frp带宽比较小,一般免费的Frp速率都不会大于10mbps,况且家里的带宽上传有30Mbps,使用Frp无法跑满带宽,另一方面就是Frp会经过Frp服务器的中转,会导致连接时延的增加。
通过本教程使用Frp有一个优点就是只有用户连接服务器时只有第一次重定向的时候会消耗Frp的流量,并且对带宽的要求非常的小,几乎可以忽略不计,这有利于即时使用的Frp隧道限速非常严重,也不怕连接速度会有差别。所以等到跟公网地址成功建立连接之后速度和延时都能最优化。
📌 本文由 FishBoss_Tca 原创,转载请注明作者和原文链接。
原文链接:https://www.ytca.top/guidance/openwrt/144/
60001端口转发到16667端口是在哪里设置的?以及webhook那的接口地址的16661端口🈶是啥?还是16661就是16667?
建议看看我发过的文章,这个方案目前已经被废弃了,目前更好的替代方案,就是使用cloudflare实现