<-
Apache > HTTP Server > 文件 > 第 2.4 版 > 模組

Apache 模組 mod_remoteip

可用的語言:  en  |  fr 

說明透過請求標頭使用代理伺服器或負載平衡器提供的使用者代理 IP 位址清單,取代連線的原始客戶端 IP 位址。
狀態基本
模組識別碼remoteip_module
原始檔mod_remoteip.c

摘要

此模組用於將發起請求的使用者代理視為 httpd 識別的原始使用者代理,用於授權和記錄的目的,即使該使用者代理在負載平衡器、前端伺服器或代理伺服器之後也不會例外。

此模組會使用 RemoteIPHeader 指令設定的請求標頭中報告的使用者代理 IP 位址,取代連線的客戶端 IP 位址。

此外,此模組使用 RemoteIPProxyProtocol 指令時,會實作 HAProxy 的伺服器端 PROXY 協定

此取代的使用者代理 IP 位址取代後,就會用於 mod_authz_host Require ip 功能,由 mod_status 報告,並由 mod_log_config %acore %a 格式字串記錄。連線的基本客戶端 IP 位址可在 %{c}a 格式字串中取得。

由於遠端使用者代理輕易就可以偽造其他使用者代理,因此非常重要,只啟用受此伺服器信任的中間主機 (代理伺服器等) 的此行為。
Support Apache!

主題

指令

Bugfix 清單

另請參閱

top

遠端 IP 處理

Apache 預設使用連線的 client_ip 值來識別使用者代理,遠端連線的 remote_host 和 remote_logname 也會從此值衍生出來。這些欄位會在其他可載入模組進行驗證、授權、登錄和其他用途時扮演重要的角色。

mod_remoteip 會以請求期間代理伺服器或負載平衡器提供的宣告式使用者代理 IP,來覆寫連線的用戶端 IP。負載平衡器可能會與伺服器建立長期保持連線,而且即使負載平衡器的底層用戶端 IP 地址沒有變動,每個請求仍然會擁有正確的使用者代理 IP。

如果標頭值中列出現多個逗號分隔的使用者代理 IP 地址,它們會以由右到左的順序來處理。當給定的使用者代理 IP 地址不被信任來顯示前一個 IP 地址時,處理程序將會暫停。標頭欄位會更新為這份未確認的 IP 地址清單,或者,如果所有 IP 地址都受到信任,此標頭將會從請求中移除。

在覆寫用戶端 IP 時,模組會將中繼主機清單儲存在 remoteip-proxy-ip-list 註記中,mod_log_config 可以使用 %{remoteip-proxy-ip-list}n 格式代幣來記錄這個清單。如果管理員需要將此清單儲存為額外的標頭,也可以使用 RemoteIPProxiesHeader 指令將相同的清單記錄為標頭。

IPv4-over-IPv6 對應的地址

與一般的 httpd 相同,任何 IPv4-over-IPv6 對應的地址都會以其 IPv4 表示法記錄下來。

內部 (私人) 地址

只有在註冊 RemoteIPInternalProxy 內部 (內部網路) 代理伺服器時,mod_remoteip 才會評估所有 10/8、172.16/12、192.168/16、169.254/16 和 127/8 區塊(以及 2000::/3 公開區塊以外的 IPv6 地址)的內部地址。
top

RemoteIPHeader 指令

說明宣告用於剖析使用者代理 IP 地址的標頭欄位
語法RemoteIPHeader header-field
預設值none
內容伺服器設定檔、虛擬主機
狀態基本
模組mod_remoteip

RemoteIPHeader 指令觸發 mod_remoteip 將指定的 header-field 標頭值視為 useragent IP 位址,或中間 useragent IP 位址清單,但須視進一步設定 RemoteIPInternalProxyRemoteIPTrustedProxy 指令而定。除非使用這些其他指令,否則 mod_remoteip 會信賴提供 RemoteIPHeader IP 值的所有主機。

內部 (負載平衡器) 範例

RemoteIPHeader X-Client-IP

Proxy 範例

RemoteIPHeader X-Forwarded-For
top

RemoteIPInternalProxy 指令

說明宣告可信賴提供 RemoteIPHeader 值的客戶端內部網路 IP 位址
語法RemoteIPInternalProxy proxy-ip|proxy-ip/subnet|hostname ...
內容伺服器設定檔、虛擬主機
狀態基本
模組mod_remoteip

RemoteIPInternalProxy 指令會新增一個或多個位址 (或位址區塊),將該位址 (或位址區塊) 視為提供 useragent IP 的有效 RemoteIPHeader 值。與 RemoteIPTrustedProxy 指令不同,從這些 proxy 傳遞時,會信賴此標頭中提供的任何 IP 位址,包括私人內部網路位址。

內部 (負載平衡器) 範例

RemoteIPHeader X-Client-IP
RemoteIPInternalProxy 10.0.2.0/24
RemoteIPInternalProxy gateway.localdomain
top

RemoteIPInternalProxyList 指令

說明宣告可信賴提供 RemoteIPHeader 值的客戶端內部網路 IP 位址
語法RemoteIPInternalProxyList filename
內容伺服器設定檔、虛擬主機
狀態基本
模組mod_remoteip

RemoteIPInternalProxyList 指令會指定在開機時剖析的檔案,並建立視為提供 useragent IP 的有效 RemoteIPHeader 值而可信賴的位址 (或位址區塊) 清單。

#』雜湊字元表示註解行,否則每次空白或分行區隔的輸入項的處理方式與 RemoteIPInternalProxy 指令相同。

內部 (負載平衡器) 範例

RemoteIPHeader X-Client-IP
RemoteIPInternalProxyList conf/trusted-proxies.lst

conf/trusted-proxies.lst 內容

# Our internally trusted proxies;
10.0.2.0/24         #Everyone in the testing group
gateway.localdomain #The front end balancer
top

RemoteIPProxiesHeader 指令

說明宣告將記錄所有中間 IP 位址的標頭欄位
語法RemoteIPProxiesHeader HeaderFieldName
內容伺服器設定檔、虛擬主機
狀態基本
模組mod_remoteip

RemoteIPProxiesHeader 指令會指定標頭,mod_remoteip 會在其中收集所有可信賴用於解析請求的 useragent IP 的中間客戶端 IP 位址的清單。請注意,中間 RemoteIPTrustedProxy 位址會記錄在此標頭中,而所有中間 RemoteIPInternalProxy 位址則會捨棄。

範例

RemoteIPHeader X-Forwarded-For
RemoteIPProxiesHeader X-Forwarded-By
top

RemoteIPProxyProtocol 指令

說明啟用或停用 PROXY 協定處理
語法RemoteIPProxyProtocol On|Off
內容伺服器設定檔、虛擬主機
狀態基本
模組mod_remoteip
相容性RemoteIPProxyProtocol 僅在 httpd 2.4.31 和更新版本中可用

RemoteIPProxyProtocol 指令启用或停用 PROXY 协议连接标头的读取和处理。如果使用 On 标记启用,在上游客户端每次打开连接时必须发送标头,否则连接会被中断,除非在 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>
top

RemoteIPProxyProtocolExceptions 指令

說明为某些主机或网络停用 PROXY 标头的处理
語法RemoteIPProxyProtocolExceptions host|range [host|range] [host|range]
內容伺服器設定檔、虛擬主機
狀態基本
模組mod_remoteip
相容性RemoteIPProxyProtocolExceptions 仅在 httpd 2.4.31 及更高版本中可用

RemoteIPProxyProtocol 指令启用或停用 PROXY 协议连接标头的读取和处理。有时需要客户端提供 PROXY 标头,但允许其他客户端在没有标头的情况下连接。此指令允许服务器管理员配置可以这样做的单个主机或 CIDR 主机范围。这通常对直接发送到上游负载均衡器后方的服务器的虚拟主机的监控和管理流量很有用。

top

RemoteIPTrustedProxy 指令

說明宣告可信賴提供 RemoteIPHeader 值的客戶端內部網路 IP 位址
語法RemoteIPTrustedProxy proxy-ip|proxy-ip/subnet|hostname ...
內容伺服器設定檔、虛擬主機
狀態基本
模組mod_remoteip

RemoteIPTrustedProxy 指令添加一个或多个地址(或地址块),以使其可信,将呈现 useragent IP 的有效 RemoteIPHeader 值。与 RemoteIPInternalProxy 指令不同,此类代理报告的任何内部网或私有 IP 地址,包括 10/8、172.16/12、192.168/16、169.254/16 和 127/8 块(或 IPv6 公共 2000::/3 块之外),都不会被视为 useragent IP 可信,并保留在 RemoteIPHeader 标头的值中。

可信(负载均衡器)示例

RemoteIPHeader X-Forwarded-For
RemoteIPTrustedProxy 10.0.2.16/28
RemoteIPTrustedProxy proxy.example.com
top

RemoteIPTrustedProxyList 指令

說明宣告可信賴提供 RemoteIPHeader 值的客戶端內部網路 IP 位址
語法RemoteIPTrustedProxyList filename
內容伺服器設定檔、虛擬主機
狀態基本
模組mod_remoteip

RemoteIPTrustedProxyList 指令指定在启动时解析的文件,并生成一个地址(或地址块)列表,以便将其视为呈现 useragent IP 的有效 RemoteIPHeader 值。

#」的雜湊字元指定了意見列,否則,每個以空白或換行分隔的項目都會被處理與 RemoteIPTrustedProxy 指令相同。

可信(负载均衡器)示例

RemoteIPHeader X-Forwarded-For
RemoteIPTrustedProxyList conf/trusted-proxies.lst

conf/trusted-proxies.lst 內容

# 已辨識的外來代理;
192.0.2.16/28 # 代理的 wap 手機群組
proxy.isp.example.com # 某個廣為人知的 ISP

可用的語言:  en  |  fr 

top

註解

請注意
這裡不是問答區段。置於此處的意見應針對改善文件或伺服器的建議,如果我們的管理員已實作,或被視為無效/離題,可能會予以移除。關於如何管理 Apache HTTP Server 的問題應導向我們在 Libera.chat 上的 IRC 頻道 #httpd,或傳送至我們的 郵寄清單