利用 clash tunnel 实现内网穿透
前言
对于内网穿透我研究了很久,网上流行的内网穿透方案对于没有 ipv4 地址的我来说都有其缺点。 总结一下,ipv6 穿透需要客户端也支持,兼容性不够高。 Lucky 的 stun 穿透端口号又一直在变,很多服务也并不支持 hook 改端口,更重要的是不够安全,不能配置 tls,信息可能会被第三方监听。 Cloudflare 的 tun 隧道似乎挺完美了,奈何 GFW 对其存在干扰,稳定性不够。 frp 之类的反代方案又取决于服务器的带宽,如果要用 tls 还要备案,很麻烦。
所以我考虑了安全性使用便捷性想出了这样的方案。 对于我来说,Clash 是必备的工具,所以我打算利用 Clash 的 Tunnel 来转发内网的流量。 也就是说我需要加入一个节点来代理内网里面的流量。对于 stun 穿透端口号一直变的问题, 可以利用 Lucky 的 Webhook 将 ip 和端口号调用接口配置。接下来要做的就是在 Clash 配置定时刷新订阅,或者用 API 调用订阅刷新即可。
准备
- 公网服务器,用作 clash 订阅
- 内网服务器
步骤
在内网服务器搭建 v2ray 服务器
主要是用于代理内网的网络,使用 v2ray 是因为配置出入站规则比较灵活,有更高的安全性。 在这里我使用 docker 部署。
1 | services: |
在当前目录新建一个 config/config.json
1 | { |
配置规则只允许指定的 ip 端口号的流量出站,其他流量一律 blocked,然后 docker-compose up -d
启动服务
部署 clash 订阅服务
该服务主要用于更新和查看 clash 内网节点的地址,在这里我自己写了一个 Java 服务用于设置和查看 clash 地址。读者可自行编写该接口,将该服务部署到公网服务器。
在 Lucky 中配置 webhook
把 v2ray 的服务使用 stun 穿透出去
配置 webhook 设置节点的 ip 和端口号
查询出来的结果应该是这样的
clash 配置
在这里我使用了 subconverter 订阅转换,可以方便配置策略组和自定义规则
配置策略组
1 | custom_proxy_group=Home`select`家里云`[]DIRECT |
配置 tunnel
配置示例:https://github.com/finalpi/ACL4SSR/blob/master/config_template.yaml
1 | # 内网穿透 |
address 是你本地访问的地址,target 是内网服务的地址。address 的端口号建议配置在 10000 以上,因为 Android 上的 clash 服务开启 10000 以上的端口不需要 root 权限。
结尾
这样只需要配置定时刷新订阅即可很方便又安全的访问内网服务了,并且能跑满带宽上行。