3318 字
17 分钟
0 次阅读

实现异地与两个局域网互访

2026-11-08

前言#

目前有两边的内网需要用到,一边是学校A的校园网,另一边是学校B局域网,通过网关接入学校B的校园网。除了两边的设备需要互相访问,手机和电脑在外面时也要能连回去,如果每次都要切 VPN 或者单独给软件设置代理,还是比较麻烦。

所以这次把这些需求都放进了 sing-box,平时直接访问原来的内网地址,具体走哪条线路交给规则处理。另外也顺手加上了学校A的校园网免终端网页认证、iOS 回环和部分设备的单独分流。

本文主要记录组网思路,配置按 sing-box 1.15.0-alpha.13 整理。

网络环境#

先说明一下这里几个位置的关系:

  • 学校A:放了一台运行 sing-box 的网关,可以访问学校A的校内资源,也有可用的上网出口。
  • 学校B局域网:放了自己的设备,通过 OpenWrt 网关接入学校B的校园网。
  • 云服务器:两边都可以主动连接,用来中转两边的流量。
  • 手机、电脑:在外面通过 sing-box 接入,按目标访问学校A或学校B局域网。

学校B还提供了供校外访问校园资源的 VPN,后面提到的“学校B VPN”就是这个入口。连上以后可以进入学校B的校园网,但学校B的校园网和学校B局域网是两层网络,访问学校B局域网里的设备,还需要经过学校B局域网网关转发。

目前保留了两种接入方式:

  • 云中转:两边的网关都连接云服务器,由云端中转互访流量。
  • 学校B VPN:学校A的网关和异地客户端都通过校园 VPN 连接学校B局域网网关,由这个网关转发到两边。

下面先说学校A的终端怎样接入网关,再分别介绍这两种方式,最后看手机和电脑在外面时怎么分流。

学校A终端通过 UDP/53 接入#

学校A的校园网有个特点,我这里的设备还没完成网页认证时,仍然可以访问网关的 UDP/53。因此直接把网关的 WireGuard endpoint wg-ep 监听端口设为 53,让终端先连进来。

未进行网页认证的终端
→ UDP/53 WireGuard
→ 学校A的网关
→ 公网:按原来的上网规则分流
→ 学校A的校内资源:本地访问
→ 学校B局域网:走跨校组网线路

连上以后,终端流量通过 WireGuard 发给网关,再借用网关已有的出口转发,就不用在每台终端上单独过网页认证了。

这里虽然用了 53 端口,但里面跑的是 WireGuard,DNS 还是由 sing-box 另外处理。这个方法依赖我这里认证前 UDP/53 仍然可达,以及网关本身有可用出口,其他学校不一定适用。

通过云服务器中转#

这里没有用 Tailscale,因为学校B的校园防火墙会探测流量特征,并屏蔽服务器 IP,所以采用 WireGuard + VLESS Reality TCP 的方式组网。

两边之间使用 WireGuard 组网,WireGuard 的 UDP 数据再通过 VLESS Reality TCP 发往云服务器。两边的网关都主动连云端,云端收到以后交给本机对应的 WireGuard 端口。

学校A的网关
⇄ WireGuard,经 VLESS Reality TCP 承载
云服务器
⇄ WireGuard,经 VLESS Reality TCP 承载
学校B局域网网关

WireGuard 负责 peer 和允许网段,VLESS 负责把这部分 UDP 数据送到云端。云服务器再根据目标地址,把连接交给学校A或学校B局域网。

我这里保留了两条云中转线路,放在“内网中转”选择组里,使用手动 selector 切换。换线路只改这里的选择,后面的网段和域名规则不用跟着改。

学校A访问学校B局域网#

比如在学校A打开学校B局域网里的服务页面,或者 SSH 连接里面的服务器。学校A的网关匹配到学校B局域网网段后,把连接交给“学校B局域网访问”选择组,这里先选择云中转线路:

我的设备
→ 学校A的网关
→ 学校B局域网访问选择组,选择云中转
→ WireGuard 经 VLESS 到云服务器
→ 学校B局域网网关
→ 学校B局域网设备

学校B局域网网关收到以后,从 LAN 访问目标设备。

这样直接访问设备原来的内网地址即可,不用再给每个 Web 服务和 SSH 单独开一个公网端口。新增设备时,确认网段和访问权限即可。

学校B局域网访问学校A#

使用云中转时,反方向的流量也一样,学校B局域网路由器通过 TUN 接管 LAN 设备的流量,匹配到学校A的目标后送进内网中转:

学校B局域网设备
→ 学校B局域网路由器 TUN
→ 学校A网段规则
→ WireGuard 经 VLESS 到云服务器
→ 学校A的网关
→ 校内目标

这里有两个地方要注意:

  • 学校A的网段规则放在普通私网直连之前,否则匹配到私网地址就直接出去了。
  • 学校A的校内域名交给校内 DNS,查询也走能到学校A的线路,不能继续丢给公网 DNS。

这样学校B局域网里的设备就可以共用这条线路,浏览器和其他软件不用分别设置代理。

云端也需要配好两边的目标路由。专门承载组网数据的 VLESS 身份只允许访问对应的 WireGuard UDP 端口,终端接入则按自己的身份限制目标范围。另外还要确认 peer 允许网段和回程,避免请求过去了,应答却从别的出口走。

通过学校B VPN 组网#

另一条线路借用学校B提供的校园 VPN。学校A侧的 sing-box 也通过这个 VPN 连接学校B局域网网关,异地客户端可以接入同一个网关,再经它访问两边。

我这里使用 sing-box 的 OpenConnect endpoint 连接学校B VPN,再访问学校B局域网网关的校园侧入口。

建立连接之前,先给 VPN 服务器自己的域名单独设置本地 DNS 解析和直连规则,放在校园域名规则前面。否则连接 VPN 服务器的请求又被送进还没连上的 VPN,会卡在第一步。先用原来的网络连上 VPN,再让校内资源走隧道。

访问学校B局域网#

VPN 连通以后,还要通过学校B局域网网关的入口访问里面的设备。以异地手机、电脑接入为例,这一段同样使用 WireGuard,UDP 数据通过 Shadowsocks UoT 承载,Shadowsocks 连接再走学校B VPN:

手机或电脑
→ WireGuard
→ Shadowsocks UoT
→ 学校B VPN
→ 学校B局域网网关的校园侧接入口
→ 学校B局域网网关上的 WireGuard
→ 学校B局域网设备

VPN 负责让客户端到达学校B局域网网关的校园侧入口,学校B局域网网关再把收到的 WireGuard 数据交给本机处理,最后访问 LAN 设备。这一段不需要经过公网云中转。

所以只连上学校B VPN 还不够,学校B局域网网关上的接入口、WireGuard peer 和 LAN 转发也要一起配好。

再通过学校B局域网访问学校A#

学校A侧已经通过学校B VPN 连到了学校B局域网网关,所以网关可以复用这条已经建立的组网隧道,把流量反向送回学校A。异地设备进入学校B局域网后,访问学校A就走这条路径:

异地设备
→ 学校B VPN
→ 学校B局域网接入口和 WireGuard
→ 学校B局域网网关的学校A路由
→ 复用学校A经学校B VPN 建立的组网隧道
→ 学校A的网关
→ 学校A的内网资源

学校B局域网网关收到连接以后,目标在本地 LAN 就直接访问,目标是学校A就交给学校A已经连进来的组网隧道。学校B局域网里的设备访问学校A,也可以复用这条隧道。入口权限、peer 允许网段和回程都要配好。

这样,经学校B VPN 访问学校B局域网和学校A,都不需要云服务器中转。

手机、电脑在外面访问#

有了上面两条接入线路,手机用流量,或者电脑连其他 Wi-Fi 时,也可以按目标分别访问两边。终端上的 sing-box 通过 TUN 接管流量,再交给对应的访问线路。

走云中转时,终端可以直接通过 VLESS 连接云服务器,由云端把连接转给对应站点的 WireGuard,不需要把两边网关的整套 WireGuard 传输配置再复制一份。走学校B VPN 时,则沿上一节的线路接入学校B局域网网关,目标是学校A就复用学校A已经建立的组网隧道。

访问目标使用的线路
学校A的内网地址、校内域名走云中转,或经学校B VPN 接入后复用学校A的组网隧道
学校B局域网设备学校B局域网访问选择组,走云中转或学校B VPN
学校B校园资源学校B VPN,配合校园 DNS
普通网站原来的日常分流

只要 sing-box 开着、选中的线路能用,应用里照常访问原地址即可,不用为了访问两个地方来回切配置。终端上的内网规则同样要放在私网直连之前,内部域名也需要配好对应的 DNS。

几个顺手加上的配置#

iOS 回环#

SideStore 这类工具会用到特殊的 TCP 回环。我在 iOS 的 TUN 中保留了下面这个配置,学校B局域网网关的 TUN 里也加上同样的内容,并配合 auto_redirect 接管 LAN 流量:

"loopback_address": ["10.7.0.1"]

设备向 10.7.0.1 发起 TCP 连接时,会转回发起设备自己的地址。这样 iPhone 连着学校B局域网时,就可以由网关提供这个回环,不同设备访问也分别回到自己。工具本身的配对和服务仍然需要在 iOS 上处理。

具体说明可以看 sing-box 的 loopback_address 文档。

Claude 专用设备单独分流#

学校B局域网里有专门用 Claude 的机器,我直接按 source_mac_address 匹配,把网关接管到的业务流量优先送进 Claude 选择组。这条规则放在普通直连、开发服务和全局模式等规则前面,避免只匹配几个域名,漏掉后台请求、登录或者遥测连接。

有线和无线网卡的 MAC 都登记进去,这样 DHCP 换 IP 时不用改规则。更换网卡或者使用随机 MAC 时,记得一起更新。

DNS 也要跟着处理,先把设备的普通 DNS 查询交给 sing-box,外网域名使用独立 DoH,并通过同一个 Claude 组发出。.lan、本地反向解析和单标签主机名仍然交给学校B局域网 DNS。

这样业务和外网 DNS 使用同一组出口。这里的整机分流只覆盖网关实际接管到的流量,学校B局域网设备之间直接通信等绕过网关的连接不在里面。

通过 Nginx 反向代理实现内网穿透#

如果想把学校B局域网里的 Web 服务放到公网,可以在公网服务器上运行 Nginx,并让这台服务器访问内网网段的流量由 sing-box 接管。然后在 Nginx 中将 proxy_pass 直接指向设备的内网 IP 和服务端口:

location / {
proxy_pass http://192.168.50.10:8080;
}

把示例地址换成实际的学校B局域网 IP 和服务端口即可。Nginx 发起连接后,sing-box 会按目标 IP 将流量路由到对应的内网网关,再访问目标服务。这样就能复用已有组网实现内网穿透,外面直接访问 Nginx 的公网域名即可。

日常分流和配置维护#

普通上网还是沿用原来的分流,开发资源、AI、游戏和 Apple 等按需要保留选择组。内网目标先匹配走自己的线路,平时切换上网节点就不用跟着调整组网配置。

节点由 Sub-Store 维护,设备配置里保留路由、DNS 和 endpoint,再通过覆写装配节点成员和组网传输角色。换中转节点时改订阅和对应组的成员即可,不用去每份路由里重新填节点名字。

sing-box还是太优雅了

实现异地与两个局域网互访
https://nvcc-v.com/2026/11/08/sing-box-campus-networking/
作者
Shattered217
发布于
2026-11-08
许可协议
CC BY-NC-SA 4.0

KEEP EXPLORING

相关文章

评论