解决 WireGuard 网络 Windows SMB 访问问题
坑边闲话:将 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 防火墙
,以管理员身份打开。
打开之后条目非常多,进入入站规则
页面,直接用中文输入法输入文件
,页面自动跳转到以文件
开头的条目,从中定位到文件和打印机共享 (SMB-In)
条目。你的电脑一般会有多条同名的条目,但是具体内容是不同的,他们的配置文件
一栏有不同的定义。
接下来解释原因。由于许多 Windows 10 系统同时配置了多个网卡(包括无线网卡),甚至多个网卡都是处于活跃状态,因此 Windows 提供了一种类似 OpenWrt Security Zone 的分类,你可以让一个网卡所接入的 IP 网络被定义为以下三种类型:
专用
,即这个网络是可信的,你的 PC 在这个网络段里将会提供所有服务给其他用户公用
,即这个网络是不可信的,可能有其他人加入了这个网络,比如不受信任的其他用户。公共 Wi-Fi,没有设置访客模式的家庭内网等,一般都可以设置为公用。域
,即这个网络由 AD 域策略控制。这个复杂度就很高了,公司里会有人帮你配置,而个人一般用不到。除非你是管理员,否则没必要了解这方面的知识。
如果你需要走 WireGuard 流量的网卡是专用
的,就选择配置文件为专用的文件和打印机共享 (SMB-In)
条目。其他依此类推。
在该条目的修改页面里,打开作用域
选项卡,将远程主机的 IP 地址限制取消掉。随后即可正常访问。
最后的设置结果如上图所示。我建议一个 Zone 设置一条策略,而不要一个策略适合于多个 Zone.
风险:在 Windows 上开启此功能,有可能遭受来自外部的攻击。如果不想设置为任意地址,也可以添加白名单。
2.2 设置 OpenWrt wg
接口的 masquerade·
这个方案我不推荐,因为有可能造成额外的包转发性能开销。
这里只是提供思路,不提供额外步骤。
总结·
通过设置 Windows 10 的防火墙策略,是目前最好的方案,造成的安全影响较小。