windows中nat与防火墙规则按固定顺序处理:入站流量先dnat后防火墙入站检查,出站流量先防火墙出站再snat;dnat转换后的内网地址端口必须被防火墙显式允许,否则丢包。
windows 主机防火墙和 nat 配置不是并列生效的,而是有严格先后顺序。冲突不常因“规则没加”,而多因“加在了错误的阶段”。搞清这个顺序,排查就快了一半。
入站流量:先 DNAT,再防火墙检查
外网请求打到主机公网 IP:端口后,系统先做目标地址转换(DNAT),把流量转给内网真实服务(比如 192.168.1.100:80),之后才用防火墙判断“192.168.1.100 的 80 端口是否允许入站”。很多人误以为只要放行公网 IP 的端口就行,结果 DNAT 后目标变了,防火墙根本没匹配上。
- 查当前 DNAT 映射:PowerShell 运行 Get-NetNatStaticMapping
- 查防火墙是否允许转换后的地址端口:用 netsh advfirewall firewall show rule name=all | findstr "192.168.1.100.*80"
- 若没匹配到,需新建入站规则——目标 IP 填内网地址,不是公网地址
出站流量:先防火墙,再 SNAT
内网服务主动访问外网时,顺序相反:先由防火墙决定“该程序/端口能否出站”,通过后再做源地址转换(SNAT),把内网 IP 换成主机公网 IP。这意味着,即使 NAT 配置完全正确,出站规则被禁也会导致连接失败。
- 确认出站规则启用:在“高级安全 Windows 防火墙”中检查“出站规则”里对应程序或端口的状态
- 临时测试可运行:Set-NetFirewallProfile -Profile Domain,Private,Public -Enabled False(测试完务必恢复)
- 特别注意 WSL2、Docker Desktop、Hyper-V 虚拟机等场景,它们依赖主机出站放行才能联网
常见干扰项:别让其他机制抢了 NAT 的活
Windows 支持多种网络转发机制,混用极易冲突。例如:
- netsh interface portproxy(端口代理)和 NetNat 同时配置同一端口,后者可能被绕过
- 启用 ICS(Internet 连接共享)后,它会自动创建一套独立 NAT 和 DHCP,与手动配的 NetNat 不兼容
- VMware 的 vmnet8 或 Hyper-V 的 vSwitch NAT 若与 Windows 自带 NetNat 共存,流量路径不可控
- 建议统一使用 NetNat + 高级防火墙,停用 ICS、portproxy、第三方 NAT 工具
快速验证四步法(全系统命令)
不用装工具,靠自带命令就能定位卡点:
- 看 NAT 是否存在且启用:Get-NetNat | fl Name,State + Get-NetNatStaticMapping
- 看防火墙是否放行转换后目标:netsh advfirewall firewall show rule name=all | findstr ":80"(注意“本地IP”字段)
- 看 DNAT 是否触发:Get-NetNatSession —— 若为空,说明流量根本没走到 NAT 层(可能是前置设备拦截或 IP 不匹配)
- 抓包辅助判断:netsh trace start scenario=InternetClient capture=yes,复现问题后 stop 并分析











