On this page
Apache 模块 mod_remoteip
Description: | 用代理或负载平衡器通过请求 Headers 提供的用户代理 IP 地址列表替换用于连接的原始 Client 端 IP 地址。 |
---|---|
Status: | Base |
Module Identifier: | remoteip_module |
Source File: | mod_remoteip.c |
Summary
此模块用于将发起请求的用户代理视为 httpd 标识的发起用户代理,以进行授权和记录,即使该用户代理位于负载均衡器,前端服务器或代理服务器之后。
该模块使用在使用RemoteIPHeader指令配置的请求 Headers 中报告的用户代理 IP 地址覆盖连接的 Client 端 IP 地址。
此外,使用RemoteIPProxyProtocol指令时,此模块可实现 HAProxy PROXY Protocol的服务器端。
按照指示进行替换后,此覆盖的用户代理 IP 地址将用于mod_authz_host Require ip功能,由mod_status报告,并由mod_log_config %a
和core %a
格式字符串记录。 %{c}a
格式字符串中提供了连接的基础 Client 端 IP。
Warning
仅从该服务器信任的中间主机(代理等)启用此行为非常重要,因为远程用户代理模拟另一个用户代理很简单。
远程 IP 处理
默认情况下,Apache 用连接的 client_ip 值标识 useragent,并且连接 remote_host 和 remote_logname 从该值派生。这些字段在身份验证,授权和日志记录以及其他可加载模块的其他用途中发挥作用。
在请求期间,mod_remoteip 会使用由代理或负载平衡器提供的广告用户代理 IP 覆盖连接的 Client 端 IP。负载均衡器可能会与服务器构建长期的 Keepalive 连接,并且即使负载均衡器的基础 Client 端 IP 地址保持不变,每个请求也将具有正确的用户代理 IP。
Headers 值中列出多个逗号分隔的用户代理 IP 地址时,将按从右到左的 Sequences 处理它们。当不信任给定的用户代理 IP 地址来显示先前的 IP 地址时,处理将暂停。Headers 字段将更新为该剩余的未确认 IP 地址列表,或者如果所有 IP 地址都受信任,则此 Headers 将从请求中完全删除。
在覆盖 Client 端 IP 时,模块将中间主机列表存储在 remoteip-proxy-ip-list Comments 中,该 Commentsmod_log_config可以使用%{remoteip-proxy-ip-list}n
格式令牌进行记录。如果 Management 员需要将此存储为其他标题,则也可以使用指令RemoteIPProxiesHeader将相同的值记录为标题。
IPv4-over-IPv6 Mapped Addresses
一般而言,与 httpd 一样,任何 IPv4-over-IPv6 Map 地址都以其 IPv4 表示形式记录。
Internal (Private) Addresses
所有内部地址 10/8、172.16/12、192.168/16、169.254/16 和 127/8 块(以及公共 2000 ::/3 块之外的 IPv6 地址)仅在RemoteIPInternalProxy内部(内部网)代理被 mod_remoteip 评估。已注册。
RemoteIPHeader Directive
Description: | 声明应该为用户代理 IP 地址解析的 Headers 字段 |
---|---|
Syntax: | RemoteIPHeader header-field |
Context: | 服务器配置,虚拟主机 |
Status: | Base |
Module: | mod_remoteip |
RemoteIPHeader指令触发mod_remoteip将指定的 Headers 字段 Headers 的值当作 useragent IP 地址或中间 useragent IP 地址列表,视RemoteIPInternalProxy和RemoteIPTrustedProxy指令的进一步配置而定。除非使用这些其他指令,否则mod_remoteip将信任所有提供RemoteIPHeader IP 值的主机。
内部(负载均衡器)示例
RemoteIPHeader X-Client-IP
Proxy Example
RemoteIPHeader X-Forwarded-For
RemoteIPInternalProxy Directive
Description: | 声明受信任的 Client 端 Intranet IP 地址以显示 RemoteIPHeader 值 |
---|---|
Syntax: | RemoteIPInternalProxy proxy-ip|proxy-ip/subnet|hostname ... |
Context: | 服务器配置,虚拟主机 |
Status: | Base |
Module: | mod_remoteip |
RemoteIPInternalProxy伪指令添加一个或多个地址(或地址块)以表示用户代理 IP 的有效 RemoteIPHeader 值来信任。与RemoteIPTrustedProxy指令不同,从这些代理服务器传递时,此 Headers 中提供的任何 IP 地址(包括专用 Intranet 地址)都是受信任的。
内部(负载均衡器)示例
RemoteIPHeader X-Client-IP
RemoteIPInternalProxy 10.0.2.0/24
RemoteIPInternalProxy gateway.localdomain
RemoteIPInternalProxyList Directive
Description: | 声明受信任的 Client 端 Intranet IP 地址以显示 RemoteIPHeader 值 |
---|---|
Syntax: | RemoteIPInternalProxyList filename |
Context: | 服务器配置,虚拟主机 |
Status: | Base |
Module: | mod_remoteip |
RemoteIPInternalProxyList指令指定在启动时解析的文件,并构建一个地址(或地址块)列表,以在呈现用户代理 IP 的有效 RemoteIPHeader 值时信任该列表。
“ #
”哈希字符表示 Comments 行,否则,每个空格或换行符分隔的条目都与RemoteIPInternalProxy指令相同地处理。
内部(负载均衡器)示例
RemoteIPHeader X-Client-IP
RemoteIPInternalProxyList conf/trusted-proxies.lst
conf/trusted-proxies.lst contents
# Our internally trusted proxies;
10.0.2.0/24 #Everyone in the testing group
gateway.localdomain #The front end balancer
RemoteIPProxiesHeader Directive
Description: | 声明标题字段,该字段将记录所有中间 IP 地址 |
---|---|
Syntax: | RemoteIPProxiesHeader HeaderFieldName |
Context: | 服务器配置,虚拟主机 |
Status: | Base |
Module: | mod_remoteip |
RemoteIPProxiesHeader指令指定一个 Headers,mod_remoteip将在该 Headers 中收集所有可信任的中间 Client 端 IP 地址的列表,以解析请求的用户代理 IP。请注意,中间RemoteIPTrustedProxy地址记录在此 Headers 中,而任何中间RemoteIPInternalProxy地址都将被丢弃。
Example
RemoteIPHeader X-Forwarded-For
RemoteIPProxiesHeader X-Forwarded-By
RemoteIPProxyProtocol Directive
Description: | 启用或禁用代理协议处理 |
---|---|
Syntax: | RemoteIPProxyProtocol On|Off |
Context: | 服务器配置,虚拟主机 |
Status: | Base |
Module: | mod_remoteip |
Compatibility: | RemoteIPProxyProtocol 仅在 httpd 2.4.31 及更高版本中可用 |
RemoteIPProxyProtocol
伪指令启用或禁用对 PROXY 协议连接头的读取和处理。如果启用了On
标志,则上游 Client 端必须在每次打开连接时都发送 Headers,否则该连接将被中止,除非它在RemoteIPProxyProtocolExceptions指令提供的禁用主机列表中。
尽管可以在任何虚拟主机中指定此指令,但重要的是要了解,因为 PROXY 协议基于连接并且与协议无关,所以启用和禁用实际上是基于 IP 地址和端口的。这意味着,如果同一主机和端口具有多个基于名称的虚拟主机,并且为其中任何一个启用了虚拟主机,则将对所有这些主机(具有该主机和端口)启用虚拟主机。这也意味着,如果您尝试在其中一个启用 PROXY 协议而在另一个禁用该协议,则将无效。在这种情况下,最后一个获胜,并会记录一条通知,指出哪个设置已被覆盖。
Listen 80
<VirtualHost *:80>
ServerName www.example.com
RemoteIPProxyProtocol On
#Requests to this virtual host must have a PROXY protocol
# header provided. If it is missing, the connection will
# be aborted
</VirtualHost>
Listen 8080
<VirtualHost *:8080>
ServerName www.example.com
RemoteIPProxyProtocol On
RemoteIPProxyProtocolExceptions 127.0.0.1 10.0.0.0/8
#Requests to this virtual host must have a PROXY protocol
# header provided. If it is missing, the connection will
# be aborted except when coming from localhost or the
# 10.x.x.x RFC1918 range
</VirtualHost>
RemoteIPProxyProtocolExceptions Directive
Description: | 禁用某些主机或网络的 PROXY Headers 处理 |
---|---|
Syntax: | RemoteIPProxyProtocolExceptions host|range [host|range] [host|range] |
Context: | 服务器配置,虚拟主机 |
Status: | Base |
Module: | mod_remoteip |
Compatibility: | RemoteIPProxyProtocolExceptions 仅在 httpd 2.4.31 及更高版本中可用 |
RemoteIPProxyProtocol
指令启用或禁用 PROXY 协议连接头的读取和处理。有时需要要求 Client 端提供 PROXY Headers,但允许其他 Client 端在没有它的情况下进行连接。该指令允许服务器 Management 员配置单个主机或 CIDR 范围内的主机。通常,这对于监视和 Management 直接到上游负载均衡器后面的服务器的虚拟主机的通信非常有用。
RemoteIPTrustedProxy Directive
Description: | 声明受信任的 Client 端 Intranet IP 地址以显示 RemoteIPHeader 值 |
---|---|
Syntax: | RemoteIPTrustedProxy proxy-ip|proxy-ip/subnet|hostname ... |
Context: | 服务器配置,虚拟主机 |
Status: | Base |
Module: | mod_remoteip |
RemoteIPTrustedProxy伪指令添加一个或多个地址(或地址块)以表示用户代理 IP 的有效 RemoteIPHeader 值来信任。与RemoteIPInternalProxy指令不同,此类代理报告的任何 Intranet 或私有 IP 地址,包括 10/8、172.16/12、192.168/16、169.254/16 和 127/8 块(或在 IPv6 公用 2000 ::/3 之外)不被信任为用户代理 IP,而是保留在RemoteIPHeaderHeaders 的值中。
可信(负载均衡器)示例
RemoteIPHeader X-Forwarded-For
RemoteIPTrustedProxy 10.0.2.16/28
RemoteIPTrustedProxy proxy.example.com
RemoteIPTrustedProxyList Directive
Description: | 声明受信任的 Client 端 Intranet IP 地址以显示 RemoteIPHeader 值 |
---|---|
Syntax: | RemoteIPTrustedProxyList filename |
Context: | 服务器配置,虚拟主机 |
Status: | Base |
Module: | mod_remoteip |
RemoteIPTrustedProxyList指令指定在启动时解析的文件,并构建一个地址(或地址块)列表,以在呈现用户代理 IP 的有效 RemoteIPHeader 值时信任该列表。
“ #
”哈希字符表示 Comments 行,否则,每个空格或换行符分隔的条目都与RemoteIPTrustedProxy指令相同地处理。
可信(负载均衡器)示例
RemoteIPHeader X-Forwarded-For
RemoteIPTrustedProxyList conf/trusted-proxies.lst
conf/trusted-proxies.lst contents
# Identified external proxies; 192.0.2.16/28 #wap phone group of proxies proxy.isp.example.com #some well known ISP