坑边闲话:将 WireGuard 部署在 OpenWrt 等内网网关上是个好的思路,但是 Windows 的 SMB 文件和打印机服务一直不允许非本地网段的流量发起访问。本文将介绍相关的解决方案。

1. 问题原因·

Windows 10 等系统因为安全问题,防火墙策略比较严格,因为这种个人系统一般不会对外提供服务。

  • Windows Server 2022:SMB 服务请求可能被来自互联网,因此 src_ip 是任意的。
  • Windows 10:本机一般只是个人使用,不用做服务器,因此 SMB 服务只能被来自本局域网的机器访问,src_ip 必须是内网地址,其他地址都会被 DROP.

2. 解决方案·

解决方案有两种:

  • 更改 Windows 10 的防火墙策略
  • 将 WireGuard 来的流量在 OpenWrt 端做动态伪装,即做一次 SRC NAT.

接下来,我从 SMB server 角度和 OpenWrt 网关角度,提出两个可行的方案。

2.1 更改 Windows 10 的防火墙策略·

在搜索里找到高级安全 Windows Defender 防火墙,以管理员身份打开。

图 1. Windows 10 的防火墙。

打开之后条目非常多,进入入站规则页面,直接用中文输入法输入文件,页面自动跳转到以文件开头的条目,从中定位到文件和打印机共享 (SMB-In) 条目。你的电脑一般会有多条同名的条目,但是具体内容是不同的,他们的配置文件一栏有不同的定义。

接下来解释原因。由于许多 Windows 10 系统同时配置了多个网卡(包括无线网卡),甚至多个网卡都是处于活跃状态,因此 Windows 提供了一种类似 OpenWrt Security Zone 的分类,你可以让一个网卡所接入的 IP 网络被定义为以下三种类型:

  • 专用,即这个网络是可信的,你的 PC 在这个网络段里将会提供所有服务给其他用户
  • 公用,即这个网络是不可信的,可能有其他人加入了这个网络,比如不受信任的其他用户。公共 Wi-Fi没有设置访客模式的家庭内网等,一般都可以设置为公用。
  • ,即这个网络由 AD 域策略控制。这个复杂度就很高了,公司里会有人帮你配置,而个人一般用不到。除非你是管理员,否则没必要了解这方面的知识。

如果你需要走 WireGuard 流量的网卡是专用的,就选择配置文件为专用的文件和打印机共享 (SMB-In)条目。其他依此类推。

图 2. 勾选“任何 IP 地址”。

在该条目的修改页面里,打开作用域选项卡,将远程主机的 IP 地址限制取消掉。随后即可正常访问。

图 3. 每个网络类型设置一条防火墙规则,有利于日常管理。

最后的设置结果如上图所示。我建议一个 Zone 设置一条策略,而不要一个策略适合于多个 Zone.

风险:在 Windows 上开启此功能,有可能遭受来自外部的攻击。如果不想设置为任意地址,也可以添加白名单。

2.2 设置 OpenWrt wg 接口的 masquerade·

这个方案我不推荐,因为有可能造成额外的包转发性能开销。

这里只是提供思路,不提供额外步骤。

总结·

通过设置 Windows 10 的防火墙策略,是目前最好的方案,造成的安全影响较小。