前言

对于内网穿透我研究了很久,网上流行的内网穿透方案对于没有 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
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 地址。读者可自行编写该接口,将该服务部署到公网服务器。

img_13.png

在 Lucky 中配置 webhook

把 v2ray 的服务使用 stun 穿透出去
img_14.png

配置 webhook 设置节点的 ip 和端口号

img_16.png

查询出来的结果应该是这样的

img_15.png

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 权限。

结尾

这样只需要配置定时刷新订阅即可很方便又安全的访问内网服务了,并且能跑满带宽上行。

img_17.png