利用 Surge Snell 随时访问内网

起因

公司的大部分服务,都部署在公司的内网上,如果需要远程访问需要连接公司提供的 VPN 服务,但是由于搭建的协议是 OpenVPN,而不是 Surge 支持的 WireGuard,因此每次连接内网都需要关闭 Surge,并开启公司的 VPN

再加上偶尔需要访问家里的内网服务,决定着手对此问题进行改造,这里主要围绕 DSM 搭建 Snell 服务进行介绍,公司的通道也是同理的

目标

首先需要明确一下最终期望实现什么效果,无论我人在哪里,无论连什么网络,都可以顺畅的访问家中内网服务,同时要做到,当我人在家里时,不走 Snell,而是直连

既然所有服务都可以通过内网访问,对于安全性上,也需要拒绝一切通过 DDNS 访问的请求

DSM 配置

这里我搭建的环境使用的是 primovist/snell-docker 的镜像,其他镜像可能会有细节不一致,但是大体上都是 Snell 的实现

  1. 端口设置
本地端口 容器端口 类型
xxx 12543 tcp
  1. 存储空间
文件/文件夹 装载路径 类型
DSM 文件夹 /etc/snell/ rw
  1. 环境变量
PATH 保持不变
LANG 保持不变
PORT 123543
PSK 随机生成一串字符
OBFS tls

Surge 配置

[Proxy]
Home = snell, 你的域名, 你的端口, psk=Docker环境中的PSK, obfs=tls

[ProxyGroup]
# 这里配置的意思是,如果当前连接的 WiFi 名为 Home 或者 Home_5G,则直接连接
# 否则切换为 snell
Home Snell = ssid, default = Home, "Home" = DIRECT, "Home_5G" = DIRECT

[Rule]
# 在我的环境中,家里的网段属于 `192.168.31.x`,因此直接在 `Rule` 中这么填即可
IP-CIDR,192.168.31.0/24,Home Snell, no-resolve

路由设置

我的路由是小米的,如果和你的不同请自行查阅,最开始我为了方便,直接打开了小米的 DMZ 功能,但现在我希望可以手动控制部分服务不提供公网访问

此时需要使用 DSM 动态修改路由的 UPnp 映射表

当然路由中的配置我们并不需要手动添加具体配置,此处只需要打开即可,剩下的在 DSM 中进行配置

比如下图中的 snell 服务,填写对应的端口号保存即可,映射关系 DSM 会自动帮我们同步到路由上

参考

  1. Surge 文档 https://manual.nssurge.com/others/snell.html
  2. Surge 论坛 https://community.nssurge.com/d/5