windows nat网关下客户端真实ip丢失,关键在于提前构建日志标识链路:1. http流量透传并信任x-forwarded-for头;2. 开启rras nat连接日志做时间关联;3. 用etw或netflow采集内网侧五元组;4. 联动sysmon与ad日志绑定ip与用户身份。

Windows NAT网关下客户端真实IP丢失,不是“恢复”问题,而是日志链路未提前构建。关键在流量出口前就埋好标识,否则IIS、防火墙、应用日志里看到的全是NAT出口IP。
HTTP流量必须透传X-Forwarded-For头
这是最直接有效的方案,但需两端配合:
- IIS或反向代理(如ARR)必须启用并信任X-Forwarded-For头:在ARR规则中勾选“Preserve client IP address”,并在服务器变量中允许该头通过
- 后端应用(如ASP.NET、Node.js)需明确从X-Forwarded-For读取源IP,不能只认REMOTE_ADDR
- 注意:若中间有多个代理,X-Forwarded-For可能被追加多段IP,应取最左非内网地址(如192.168.x.x、10.x.x.x、172.16–31.x.x需过滤)
开启RRAS NAT连接日志并做时间关联
Windows原生RRAS NAT本身不记录映射关系,但可开启连接日志获取五元组+时间戳:
- 在“路由和远程访问”控制台 → 右键服务器 → 属性 → 常规 → 勾选“启用网络地址转换日志记录”
- 日志默认存于%SystemRoot%\Tracing\rrasnat.log,含内网IP、端口、外网目标、开始/结束时间
- 当IIS日志出现某请求时,用时间戳±2秒范围查rrasnat.log,即可匹配出原始内网IP
用ETW或NetFlow采集网络层原始五元组
绕过应用层依赖,从系统底层捕获真实通信关系:
- 启用Windows ETW NetEvents Provider:PowerShell中运行logman start netevents -p "Microsoft-Windows-TCPIP" 0x10000 -o netevents.etl -ets
- 抓取流量后用NetMon或Windows Performance Analyzer分析,筛选出SYN包,直接看到原始源IP与目的IP
- 若部署了第三方NetFlow探针(如ntopng),确保采集点在NAT内网侧接口,避免IP已被替换
联动Sysmon与AD日志绑定IP与用户身份
即使拿不到原始IP,也可通过登录行为反推:
- Sysmon事件ID 3(网络连接)记录进程、源IP、目标IP、时间;事件ID 10(进程创建)带用户SID
- 结合域控安全日志(事件ID 4624)中登录IP与用户名,用时间窗口(如±30秒)将Sysmon中的IP与AD登录用户关联
- 适用于终端用户固定登录、非共享账户场景,能支撑审计溯源而非实时识别











