Windows中NAT与防火墙规则存在严格先后顺序:入站流量先DNAT后防火墙入站检查,出站流量先防火墙出站再SNAT;DNAT转换后的内网地址端口必须被防火墙显式允许,否则丢包。
NAT 规则和防火墙规则不是并列关系,而是先后顺序
在 windows 系统中,nat(如通过 netnat 或 rras 配置)与高级防火墙(netsh advfirewall)属于不同子系统,但数据包处理有严格时序:
- 入站流量(外网→内网):先执行 DNAT(目标地址转换),再检查防火墙入站规则;也就是说,防火墙看到的是转换后的内网 IP 和端口,不是原始外网监听地址
- 出站流量(内网→外网):先匹配防火墙出站规则,再做 SNAT(源地址转换);若出站被防火墙拒绝,根本不会走到 NAT 阶段
- 关键结论:DNAT 后的目标地址+端口必须被防火墙显式放行。例如把
203.0.113.10:80映射到192.168.1.50:80,防火墙规则就必须允许192.168.1.50的 TCP 80 入站,而不是203.0.113.10
常见“映射了却不通”的真实原因
多数故障并非 NAT 没配好,而是联动环节断开:
- 防火墙配置文件未激活:运行
Get-NetConnectionProfile查当前网络位置(Domain/Private/Public),确保对应配置文件下的规则已启用 - 规则绑定错误的协议或端口:用
netsh advfirewall firewall show rule name="xxx"检查“本地端口”字段是否为实际内网服务端口,“协议”是否匹配(TCP/UDP) - 混用多种端口转发机制:
NetNat静态映射与netsh interface portproxy(端口代理)不能共存于同一端口;冲突时优先级低者失效 - 会话未建立:执行
Get-NetNatSession,若无输出,说明流量压根没到达 NAT 层——可能是前置设备拦截、IP 地址不匹配,或网卡驱动过滤
安全策略要覆盖“转换后”的流量特征
Windows 防火墙不感知 NAT 配置,它只认数据包最终呈现的五元组。因此设计规则时需反向思考:
- 不要按“外网访问哪个公网 IP 端口”来写规则,而要按“内网哪台机器哪个端口收流量”来写
- 若服务部署在多个内网主机上,建议用“专用配置文件”隔离规则,避免公用规则误放行非预期主机
- 启用日志记录:在防火墙规则中勾选“记录安全事件”,配合
Get-WinEvent -LogName "Security"查看丢包详情,快速定位是 NAT 未触发还是防火墙拦截 - 临时验证可用
Set-NetFirewallProfile -Profile Domain,Private,Public -Enabled False,但测试后务必恢复,切勿长期关闭
域内访问也要考虑 NAT-防火墙闭环
当内网用户用公网域名访问同网段内网服务器时(如 DNS 解析为公网 IP),会出现“三角路由”:请求经防火墙,响应直连客户端,绕过防火墙导致会话不一致甚至丢包。
- 解决方案是配置域内双向 NAT:对从内网发出、目标为公网 IP 的流量,也做一次 SNAT,使服务器回包必须经防火墙返回
- 此时防火墙出站规则要允许该 SNAT 后的源地址段,并且入站规则要放行服务器返回给该地址段的响应流量
- 这类场景下,
Get-NetNatSession会出现两条关联会话(正向+反向),是配置生效的关键标志


















