Windows服务器部署Always On VPN时,核心矛盾在于VPN隧道建立后,防火墙规则如何精准放行特定流量而不暴露整个服务器。最直接的解决思路是:利用Windows防火墙的"域、专用、公用"三种配置文件,结合Always On VPN的设备隧道(Device Tunnel)与用户隧道(User Tunnel)模式,分别设置入站和出站规则,确保只有经过认证的VPN流量才能穿透防火墙,其余端口全部默认拒绝。下面从架构原理到实操配置,逐步拆解这个问题。

Always On VPN的两种隧道模式决定防火墙策略的根基

Windows Server 2016及以后版本内置了Always On VPN功能,它分为两种隧道类型。设备隧道(Device Tunnel)在计算机启动阶段就建立连接,适用于无人值守的服务器场景;用户隧道(User Tunnel)则在用户登录后才触发,适合需要按需连接的环境。防火墙规则的制定必须先明确你用的是哪种模式,因为两者的流量入口和认证时机完全不同。设备隧道的流量在系统层面就已经进入,防火墙需要在"域配置文件"下提前放行;用户隧道的流量则跟随用户会话,需要在"公用"或"专用"配置文件中动态匹配。

防火墙三种配置文件的作用与选择

Windows防火墙有三个独立的规则集:域(Domain)、专用(Private)、公用(Public)。服务器加入域后,默认走域配置文件;如果是工作组环境,则走专用或公用。Always On VPN场景下,强烈建议将网络适配器的配置文件锁定为"域",原因很简单——域配置文件的默认策略相对宽松且可控,方便你针对VPN隧道单独开洞。操作路径是:打开"网络和共享中心",点击当前连接的网络,将"网络位置类型"改为"域网络"。这一步很多人忽略,导致规则配了但不生效。

入站规则:只开放VPN必需的端口和协议

服务器暴露在网络中,入站规则是第一道防线。Always On VPN通常使用IKEv2协议,默认端口是UDP 500和UDP 4500。如果你用的是SSTP协议,则需要开放TCP 443。具体操作是打开"高级安全Windows Defender防火墙",在"入站规则"中新建规则。以IKEv2为例,你需要创建两条规则:

规则1:
名称:Allow IKEv2 UDP 500
协议:UDP
本地端口:500
远程IP:任何(或限定VPN客户端网段)
操作:允许连接
配置文件:域

规则2:
名称:Allow IKEv2 UDP 4500
协议:UDP
本地端口:4500
远程IP:任何(或限定VPN客户端网段)
操作:允许连接
配置文件:域

这里有个关键细节:如果你的服务器前面还有硬件防火墙或云安全组,那Windows防火墙的入站规则只是第二层,第一层要在上游设备同样放行这些端口。很多管理员只配了Windows防火墙却忘了云平台的安全组,结果VPN根本连不上。

出站规则:限制服务器主动外联的范围

出站规则同样重要。Always On VPN建立后,服务器可能需要访问内网资源、DNS服务器、域控制器等。默认情况下Windows防火墙允许所有出站流量,但安全最佳实践是收紧。你应该明确指定服务器只能通过VPN隧道访问哪些内网IP段。例如,如果内网网段是10.0.0.0/8,则创建出站规则限定目标IP为该网段,协议根据业务需求选择TCP或UDP。这样即使服务器被入侵,攻击者也无法随意外联到互联网。

规则3:
名称:Allow VPN Tunnel Outbound to Internal
协议:任何
远程IP:10.0.0.0/8
操作:允许连接
配置文件:域

规则4(兜底拒绝):
名称:Block All Other Outbound
协议:任何
远程IP:任何
操作:阻止连接
配置文件:域

注意规则4要放在所有允许规则的下面,因为防火墙规则是从上到下匹配的,先匹配到的优先执行。如果你把拒绝规则放在前面,所有流量都会被阻断。

设备隧道场景下的特殊防火墙考量

设备隧道在计算机启动时就建立VPN连接,这意味着在用户登录之前,服务器已经通过VPN隧道在线了。这种模式下,防火墙规则必须在"域配置文件"中完全就绪,不能依赖用户登录后的动态策略。另外,设备隧道会创建一个虚拟网络适配器(通常命名为"VPN (设备隧道)"),你需要确保这个适配器的防火墙设置没有被单独覆盖。检查方法是在防火墙高级设置中查看每个适配器的应用规则,确认VPN虚拟适配器没有被设为"阻止所有连接"。

用户隧道场景下的动态规则匹配

用户隧道在用户登录后才建立,此时流量会带有用户身份信息。Windows防火墙支持基于用户或组的规则,你可以创建只允许特定域用户组通过VPN访问服务器的规则。这在多用户共享服务器的场景下非常实用。例如,你可以设置一条规则:只允许"VPN-Users"安全组的成员通过TCP 3389(远程桌面)访问服务器,其他人即使VPN连上了也无法RDP进来。

规则5:
名称:Allow RDP for VPN Users Only
协议:TCP
本地端口:3389
远程IP:任何
用户:DOMAIN\VPN-Users
操作:允许连接
配置文件:域

IPsec与Always On VPN的协同配置

Always On VPN底层依赖IPsec进行加密和认证。在防火墙层面,你还需要确保IPsec相关的流量不被误拦截。具体来说,ESP协议(协议号50)和AH协议(协议号51)需要在防火墙中放行。如果你只开放了UDP 500和4500但没有放行ESP,VPN隧道虽然能协商成功但数据包无法传输。在高级防火墙中,可以创建协议类型为"自定义"的规则,指定协议号为50(ESP),这样就能覆盖IPsec数据通道。

DNS与NAT穿透的防火墙处理

VPN连接建立后,客户端通常需要解析内网DNS。如果服务器同时承担DNS角色,需要在防火墙中放行UDP 53和TCP 53端口,但限定源IP为VPN客户端地址池。另外,如果服务器位于NAT后面(比如云服务器),还需要配置NAT穿透(NAT-T),这会让IPsec流量封装在UDP 4500中传输,前面提到的UDP 4500规则就是为此服务的。确保你的防火墙没有对UDP 4500做深度包检测或限速,否则VPN性能会严重下降。

日志审计与规则验证

规则配完不是终点,必须验证和监控。Windows防火墙支持日志记录,路径在"高级安全防火墙"的"属性"中设置,建议将丢弃的数据包也记录下来。通过分析日志,你可以看到哪些流量被拦截、哪些被放行,从而持续优化规则。同时,定期使用PowerShell导出当前规则进行备份:

Export-NetFirewallRule -PolicyStore ActiveStore -Path "C:\FirewallRules\backup.xml"

这条命令会把当前生效的所有防火墙规则导出为XML文件,方便迁移或灾难恢复时快速还原。

常见踩坑点与排查思路

实际部署中最常见的问题有三个:第一,多网卡环境下防火墙规则绑定了错误的适配器,导致VPN流量走了公网接口而非隧道接口。解决办法是在每条规则的"作用域"中明确指定"远程IP地址"或"接口类型"。第二,组策略覆盖了本地防火墙设置,域控下发的GPO可能会重置你手动配的规则。需要在组策略管理中检查"Windows防火墙"相关策略是否冲突。第三,Windows更新后防火墙规则被重置或新增默认规则干扰了你的策略,建议每次大版本更新后重新审计一遍规则集。

总结:最小权限原则贯穿始终

Windows服务器上Always On VPN与防火墙规则的配合,本质上就是在"可连接"和"够安全"之间找平衡。核心原则是最小权限——只开必须的端口、只放必须的IP段、只允许必须的用户。设备隧道和用户隧道各有适用场景,防火墙三种配置文件要根据网络环境选对。IPsec协议通道不能遗漏,日志审计要常态化。把这些做到位,你的服务器就能在保持远程可管理性的同时,把攻击面压到最低。