Windows Server 2019系统 IIS 调用 X-Forwarded-For Header (XFF)记录访客真实IP的四种方法
|
admin
2026年11月12日 9:55
本文热度 170
|
网上流传的 Advanced Logging 模块早就被微软退役、下架不再提供下载,它是 IIS7 时代的老插件,IIS10(Server2019)原生已经自带【自定义日志字段 Custom Fields】,不需要额外装任何第三方扩展,这才是微软官方现在支持的正规方案,很多老教程还在写 Advanced Logging 属于过时资料。
架构不变:Nginx → IIS10(Win2019)
前置 Nginx 配置依旧保留(必须):
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://IIS内网地址;
安全重点:Nginx 这里一定要限制,不要无条件信任 XFF,防止伪造 IP。
✅ 方案 A(首选,微软原生,无 DLL、无第三方模块):IIS 原生【自定义日志字段 Custom Fields】
作用:在默认 W3C 日志里新增一列,单独记录 X-Forwarded-For,原生 c-ip 依旧是 Nginx 内网 IP,日志文件还是原来的格式,日志分析工具只要多加一列解析即可,生产稳定。
打开 IIS 管理器 → 选中你的站点 → 双击【日志(Logging)】
日志格式选择 W3C,点下面【选择字段(Select Fields)】
右下角点【添加自定义字段(Add Custom Field)】
填写:
字段名称:XForwardedFor
源类型:请求头(Request Header)
源:X-Forwarded-For
确定保存,回到日志字段列表,勾选这个新增字段
执行 iisreset 重启 IIS
新生成的日志文件头部会多出 XForwardedFor 字段,里面就是访客 IP 链(逗号分隔)
如果你想批量给所有站点全局生效,用 PowerShell 一键添加(管理员执行):
Import-Module WebAdministration
Add-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' `
-filter "system.applicationHost/sites/siteDefaults/logFile/customFields" `
-name "." -value @{logFieldName="XForwardedFor";sourceName="X-Forwarded-For";sourceType="RequestHeader"}
缺点:不能覆盖原生 c-ip 字段。如果你的统计 / 防火墙程序硬性读取 c-ip 而不能识别新增字段,走下面方案。
✅ 方案 B:URL Rewrite + 服务器变量(程序读取真实 IP,不改动日志 c-ip)
适合 ASP / ASP.NET 代码读取真实 IP,日志本身不变。
先安装微软官方 URL Rewrite Module(官网可正常下载,未下架)
站点 → URL 重写 → 添加入站空白规则
● 条件:{HTTP_X_FORWARDED_FOR} 不为空
● 操作:设置服务器变量
● 变量名:REMOTE_ADDR
● 值:{HTTP_X_FORWARDED_FOR}
建议正则只取逗号前面第一个真实 IP,避免代理链干扰
网站代码 Request.ServerVariables("REMOTE_ADDR") 拿到真实访客 IP
配套 web.config 片段,直接复制:
<rewrite>
<rules>
<rule name="SetRealIPFromXFF" stopProcessing="false">
<match url=".*" />
<conditions>
<add input="{HTTP_X_FORWARDED_FOR}" pattern="^(.+?)(,.*)?$" />
</conditions>
<serverVariables>
<set name="REMOTE_ADDR" value="{C:1}" />
</serverVariables>
<action type="None" />
</rule>
</rules>
</rewrite>
⚠️ 注意:这个只改程序变量,IIS 日志 c-ip 仍然是 Nginx 内网 IP
✅ 方案 C:ARRHelper(微软内部开发的轻量模块,用来直接替换 c-ip,替代老 F5XFF)
如果你必须让日志里原生 c-ip 直接变成真实访客 IP(老统计系统硬性依赖 c-ip),优先选 ARRHelper,比 F5XForwardedFor.dll 更稳,是 IIS 团队当年配套 ARR 写的,专门解决反向代理 XFF 覆盖 c-ip 问题Microsoft ...
原理:替换 IIS 内部的客户端 IP,日志 c-ip、REMOTE_ADDR 同时变成 XFF 里的 IP
限制:必须配置信任代理 IP 列表,防止 XFF 伪造
注意:它会把 s-port 固定改成 80/443,非标准端口站点慎用
备选兜底:F5XForwardedFor.dll(就是你网上看到的注册 DLL 方案)
你之前找不到注册按钮的两个关键点再重申:
必须点击服务器根节点 → 模块 → 右上角【配置本机模块】才有注册按钮;站点级别模块页面没有这个按钮
应用程序池【集成管道模式】下 ISAPI 模块容易 UI 异常,需要改成经典模式;且必须在 ini 里写 TrustedProxies 只信任 Nginx 内网 IP,否则 IP 伪造风险极高
4 个方案快速对比
| 方案 | 能否替换日志 c-ip | 是否第三方 | 推荐度 | 适用场景 |
|---|
| IIS 原生自定义日志字段 Custom Fields | ❌ 新增一列 | 无(微软原生) | ⭐⭐⭐⭐⭐ | 新日志分析、审计,首选 |
| URL Rewrite 修改 REMOTE_ADDR | ❌ 仅程序读取 | 微软官方 | ⭐⭐⭐⭐ | ASP/ASP.NET网站代码拿真实 IP |
| ARRHelper | ✅ 直接替换 c-ip | 微软 IIS 团队附属模块 | ⭐⭐⭐⭐ | 老系统必须 c-ip 为真实 IP |
| F5XForwardedFor.dll ISAPI | ✅ 直接替换 c-ip | 老旧第三方 DLL | ⭐⭐ | 兜底,不推荐新生产 |
推荐决策
没有强制要求 c-ip 字段不变:直接用方案 A(原生 Custom Fields),最简单、零插件、微软官方支持
网站代码(ASP)需要读取真实 IP,日志不用改:方案 B URL Rewrite
老日志统计工具只认 c-ip,不能改解析规则:ARRHelper > F5XFF
该文章在 2026/11/12 9:55:19 编辑过