LOGO 首页 OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 技术文档 其他文档  
 
网站管理员

Windows Server 2019系统 IIS 调用 X-Forwarded-For Header (XFF)记录访客真实IP的四种方法

admin
2026年11月12日 9:55 本文热度 462

网上流传的 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,日志文件还是原来的格式,日志分析工具只要多加一列解析即可,生产稳定。

  1. 打开 IIS 管理器 → 选中你的站点 → 双击【日志(Logging)】

  2. 日志格式选择 W3C,点下面【选择字段(Select Fields)】

  3. 右下角点【添加自定义字段(Add Custom Field)】

  4. 填写:

    • 字段名称:XForwardedFor

    • 源类型:请求头(Request Header)

    • 源:X-Forwarded-For

  5. 确定保存,回到日志字段列表,勾选这个新增字段

  6. 执行 iisreset 重启 IIS

  7. 新生成的日志文件头部会多出 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,日志本身不变。

  1. 先安装微软官方 URL Rewrite Module(官网可正常下载,未下架)

  2. 站点 → URL 重写 → 添加入站空白规则

    ● 条件:{HTTP_X_FORWARDED_FOR} 不为空

    ● 操作:设置服务器变量

    ● 变量名:REMOTE_ADDR

    ● 值:{HTTP_X_FORWARDED_FOR}

建议正则只取逗号前面第一个真实 IP,避免代理链干扰

  1. 网站代码 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 方案) 你之前找不到注册按钮的两个关键点再重申:

  1. 必须点击服务器根节点 → 模块 → 右上角【配置本机模块】才有注册按钮;站点级别模块页面没有这个按钮

  2. 应用程序池【集成管道模式】下 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 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2026 ClickSun All Rights Reserved  粤ICP备13012886号-1  粤公网安备44030602007207号