必须阅读:
推荐阅读:B站「LUCKY STUN穿透」在Windows下使用VNT组网为非HTTP服务固定STUN穿透端口
之前我发过上面必须阅读的“使用Cloudflare+lucky实现优雅的公网ipv4访问网页”,利用cloudflare的页面规则实现url重定向完成lucky创建的stun端口号动态变化的问题,但是这个方法只能用在http上使用,对于tcp/udp的动态打开变化就无能为力了。有没有办法可以实现tcp和udp的数据动态端口固定呢?
在看上面的推荐阅读的文章时发现作者利用vnt的TXT解析来创建组网隧道来完成tcp端口的固定问题,但是这本质上是利用组网vpn隧道来传输的,会经过一层协议但是包装,效率会下降。这是我就在想,为什么不能直接在本地的完成TXT获取,然后直接访问该tcp/udp端口呢?
思路构建:
1、使用lucky获取公网ip和端口
2、利用lucky的webhook同步更新cloudflare上txt记录里面的TXT解析记录的值
3、在本地解析TXT记录获取公网ip+端口号
4、在本地开启指定端口数据转发至公网ip:port
一、lucky获取公网ip+端口号并放行
1、创建stun隧道
在lucky->STUN内网穿透->添加穿透规则来创建一条规则。
这里我不使用TCP的内置的转发,以提高tcp的转发效率
2、添加防火墙放行规则
在openwrt->网络->防火墙->通信规则来添加一条防火墙放行规则
3、添加端口转发规则
在openwrt->网络->防火墙->来添加一条端口转发规则
按需填写就可以了,这里我使用tcp的ssh服务
二、webhook动态更新TXT记录
这一部分和必须阅读里面Webhook配置差不多一样了
1、准备工作
需要准备的信息:
- DNS的API密钥(可复用ddns的)
- 域名区域ID
- 规则ID(后面再获取)
对于DNS的API密钥,如果还保存着的话,可以直接用(ddns的那里一个还有的,看看能否复制过来),如果忘记的话可以出现创建一个新的API密钥
区域ID的话直接在概述页复制即可
2、添加TXT解析记录
在cloudflare的dns栏添加一个记录,类型为TXT,名称为tcp,内容随意,这里暂填127.0.0.1:80
点击保存完成添加
3、获取规则ID
在lucky->计划任务->添加计划任务添加一个计划任务
执行时间任意,添加一个子任务,按照下面的格式填写
- 类型:CallWeb
- 接口地址:https://api.cloudflare.com/client/v4/zones/区域ID/dns_records
- 请求方法:GET
- 请求头:
- Authorization: Bearer DNS密钥
Accept: application/json
- Authorization: Bearer DNS密钥
- 禁用CallWeb调用成功字符串检测:是
添加完成后点击手动触发,接着在任务执行日志内找到刚才添加的TXT解析记录,推荐搜索tcp找到刚才添加的TXT解析记录
将规则ID保存在下备用
4、为stun隧道添加的webhook
回到刚才创建stun隧道,编辑,按照下列格式填写参数
- 接口地址:https://api.cloudflare.com/client/v4/zones/区域ID/dns_records/规则ID
- 请求方法:PATCH
- 请求头:
- Authorization: Bearer DNS密钥
Accept: application/json
- Authorization: Bearer DNS密钥
- 请求体:
- {
“type”: “TXT”,
“content”: “#{ipAddr}”
}
- {
- 接口调用成功包含的字符串:”success”:true
可以在保存之前向点击”Webhook手动触发测试“看看是否调用成功
这样利用TXT就完成了对IP和端口号的固定了,下面就是如何获取TXT和解析的地址的问题了
三、解析TXT记录值并转发
目前还没有发现可以直接解析TXT记录的数据并转发给TXT记录的ip:port的软件的,但是我们可以自己写一个简单的脚本来完成解析和转发的工作
这里补充一个软件可以实现TXT解析的功能:VNT,一个组网软件,但是我觉得有点杀鸡用牛刀,于是弃用
我在github上发布了一个用来解析和转发数据的小工具:txtforward,他可以完成解析并转发的工作。
直接在release页面下载就可以了,因为是用python写的,如果可以如果有python的环境可以直接运行源码,如果没有python环境也可以直接使用python打包二进制文件启动,README页面有详细介绍,这里就不过多赘述了。
如果无法打开github可以使用gitee下载点我跳转
在cmd输入txtforward-windows-amd64.exe 本地端口 txt域名即可完成数据转发工作
使用的话就直接连接本地端口就可以了
后记
通过TXT动态解析端口号搭配本地端口转发可以实现比较完美的公网ip直连方案,算是补全和cloudflare+lucky只能使用http直连的空缺吧。但是这个方案不是非常完美,因为这个TXT转发的软件也是临时写出来的,还有很多还没实现,如UDP是不支持转发的,这个只能等后续的软件更新来实现了,这里只能先挖个坑