前言
对于内网穿透我研究了很久,网上流行的内网穿透方案对于没有 ipv4 地址的我来说都有其缺点。 总结一下,ipv6 穿透需要客户端也支持,兼容性不够高。 Lucky 的 stun 穿透端口号又一直在变,很多服务也并不支持 hook 改端口,更重要的是不够安全,不能配置 tls,信息可能会被第三方监听。 Cloudflare 的 tun 隧道似乎挺完美了,奈何 GFW 对其存在干扰,稳定性不够。 frp 之类的反代方案又取决于服务器的带宽,如果要用 tls 还要备案,很麻烦。
所以我考虑了安全性使用便捷性想出了这样的方案。 对于我来说,Clash 是必备的工具,所以我打算利用 Clash 的 Tunnel 来转发内网的流量。 也就是说我需要加入一个节点来代理内网里面的流量。对于 stun 穿透端口号一直变的问题, 可以利用 Lucky 的 Webhook 将 ip 和端口号调用接口配置。接下来要做的就是在 Clash 配置定时刷新订阅,或者用 API 调用订阅刷新即可。
准备
步骤
在内网服务器搭建 v2ray 服务器
主要是用于代理内网的网络,使用 v2ray 是因为配置出入站规则比较灵活,有更高的安全性。 在这里我使用 docker 部署。
1 2 3 4 5 6 7 8 9 10 11 12
| services: v2ray: image: v2fly/v2fly-core container_name: v2ray environment: - TZ=Asia/Shanghai volumes: - ./config:/etc/v2ray ports: - "10086:10086" command: ["run", "-c", "/etc/v2ray/config.json"] restart: unless-stopped
|
在当前目录新建一个 config/config.json
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| { "inbounds": [ { "port": 10086, "protocol": "vmess", "settings": { "clients": [ { "id": "28492f21-c626-4309-9d23-c8884194c3ba", "alterId": 0 } ] } } ], "outbounds": [ { "protocol": "freedom" }, { "protocol": "blackhole", "tag": "blocked" } ], "routing": { "rules": [ { "type": "field", "outboundTag": "freedom", "ip": ["192.168.1.88"], "port": "8096" }, { "type": "field", "outboundTag": "freedom", "ip": ["192.168.1.1"], "port": "9090" }, { "type": "field", "outboundTag": "blocked", "ip": ["0.0.0.0/0", "::/0"] } ] } }
|
配置规则只允许指定的 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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| tunnels: - network: [tcp, udp] address: 127.0.0.1:13000 target: 192.168.1.88:8096 proxy: Home
- network: [tcp, udp] address: 127.0.0.1:13001 target: 192.168.1.180:445 proxy: Home
- network: [tcp, udp] address: 127.0.0.1:13002 target: 192.168.1.1:9090 proxy: Home
- network: [tcp, udp] address: 127.0.0.1:13003 target: 192.168.1.88:4533 proxy: Home
- network: [tcp, udp] address: 127.0.0.1:13004 target: 192.168.1.88:8971 proxy: Home
|
address 是你本地访问的地址,target 是内网服务的地址。address 的端口号建议配置在 10000 以上,因为 Android 上的 clash 服务开启 10000 以上的端口不需要 root 权限。
结尾
这样只需要配置定时刷新订阅即可很方便又安全的访问内网服务了,并且能跑满带宽上行。
