mod_extforward¶
模块: mod_extforward
描述¶
此模块将从 Squid 或其他代理添加的 Forwarded 或 X-Forwarded-For 标头中提取客户端的“真实”IP。这对于反向代理服务器后面的服务器可能很有用。
注意:lighttpd 1.4.70 之前的 mod_extforward 期望每个连接只有一个客户端;lighttpd 1.4.70 之前的 mod_extforward 不期望在同一连接上进行多个请求时 IP 地址发生变化(例如 HTTP/2)。如果在负载均衡器中使用 lighttpd 1.4.70 之前的 mod_extforward 和 HTTP/2,则应将负载均衡器配置为安全,并且仅将连接重用于同一客户端,而不是不同的客户端。或者,将负载均衡器配置为使用 HTTP/1.1 连接到 lighttpd。
选项¶
- extforward.headers
设置要搜索的标头以查找原始地址。
默认:空,结果是搜索“X-Forwarded-For”和“Forwarded-For”
示例(用于 Zeus ZXTM 负载均衡器)
extforward.headers = ("X-Cluster-Client-Ip")
自 lighttpd 1.4.46 起,mod_extforward 支持“Forwarded” (RFC7239)。由于此标头可能通过不理解“Forwarded”的代理进行欺骗,因此默认情况下不启用此功能,必须进行配置,例如使用
extforward.headers = ("Forwarded", "X-Forwarded-For")
- extforward.forwarder
设置代理 IP 的信任级别。
默认:空
使用示例
extforward.forwarder = ("10.0.0.232" => "trust")
将把来自 10.0.0.232 的 IP 地址转换为从 X-Forwarded-For(或 extforward.headers 中指定的任何内容)HTTP 请求标头中提取的真实 IP 地址。
支持 CIDR 掩码(例如 “10.0.0.0/8” => “trust”)(自 1.4.50 起),但仅适用于受信任的 IP(不包括“不受信任的”)。重要提示:
此模块的效果对 $HTTP["remoteip"] 指令以及其他模块依赖远程 IP 的操作具有可变性。
在我们更改 remoteip 或重置它之前由模块完成的操作将匹配代理的 IP。
在这两个时刻之间完成的操作将匹配真实客户端的 IP。
模块执行操作的时机取决于它在哪个钩子中执行操作,以及在同一钩子中,它们在模块加载顺序中(配置文件中 server.modules 指令中的顺序)是在我们之前还是之后。
测试行为
mod_access: 将匹配真实客户端。
mod_accesslog: 为了在访问日志中看到“真实”IP 地址,您必须在 mod_accesslog 之后加载 mod_extforward,如下所示
server.modules = ( ...., "mod_accesslog", "mod_extforward", .... )
(lighttpd 1.4.61 或更高版本不再需要此操作)
- extforward.params(自 1.4.46 起)
处理“Forwarded”请求头时,extforward.params
设置要传播的值。“for”和“proto”始终启用(不可配置),以保持 mod_extforward 中的现有行为。另请参阅 Docs_ModProxy 以了解proxy.forwarded
。extforward.params = ( #"host" => 1, # overwrite "Host" with Forwarded value #"remote_user" => 1, # set REMOTE_USER with Forwarded value )
- extforward.hap-PROXY(自 1.4.46 起)
启用 HAProxy PROXY 协议 v1 或 v2 的处理(http://www.haproxy.org/download/1.8/doc/proxy-protocol.txt)
mod_extforward 必须在server.modules
中 mod_openssl 之后加载才能生效。另外请注意,当extforward.hap-PROXY = "enable"
时,mod_extforward 将仅处理在extforward.forwarder
中配置的受信任代理的 HAProxy PROXY 协议请求。呈现给 mod_access 和 mod_accesslog 等其他模块的客户端 IP 地址将是 HAProxy PROXY 协议提供的 IP 地址。
- extforward.hap-PROXY-ssl-client-verify(自 1.4.46 起)
启用从 HAProxy PROXY 协议设置 SSL_CLIENT_VERIFY。
示例¶
信任代理 2001:db8::232、2001:db8::233、10.0.0.232 和 10.0.0.233
extforward.forwarder = ( "2001:db8::232" => "trust", "2001:db8::233" => "trust" "10.0.0.232" => "trust", "10.0.0.233" => "trust" )
使用 Cloudflare 代理时恢复访问者原始 IP(https://www.cloudflare.com/ips-v4)
extforward.forwarder = ( "173.245.48.0/20" => "trust", "103.21.244.0/22" => "trust", "103.22.200.0/22" => "trust", "103.31.4.0/22" => "trust", "141.101.64.0/18" => "trust", "108.162.192.0/18" => "trust", "190.93.240.0/20" => "trust", "188.114.96.0/20" => "trust", "197.234.240.0/22" => "trust", "198.41.128.0/17" => "trust", "162.158.0.0/15" => "trust", "104.16.0.0/12" => "trust", "172.64.0.0/13" => "trust", "131.0.72.0/22" => "trust", ) extforward.headers = ("CF-Connecting-IP")
信任所有代理(不推荐!)
extforward.forwarder = ( "all" => "trust")
请注意,“all”优先于特定条目,因此“all except”的设置将不起作用。
使用 $HTTP["scheme"] 规则¶
如果您在反向代理(如 haproxy)后面运行 lighttpd 以提供 HTTPS 终止,您可能需要配置 lighttpd 规则,这些规则作用于 $HTTP["scheme"] == "https" 等。
自 lighttpd 1.4.40 起,mod_extforward 能够从前端代理检测方案,从而允许您在 lighttpd.conf 中使用基于方案的条件规则。
为了实现这一点,extforward.headers(默认为 X-Forwarded-For, Forwarded-For)必须与相应的 HTTP 请求头匹配,并且代理必须通过 extforward.forwarder 设置为“受信任”的。
安全¶
一般来说,来自外部源的数据不应被信任。这包括 HTTP 请求头。在某些受控环境中,可能需要对其中部分信息给予有限的信任。mod_extforward 信任由已配置为受信任 IP 的代理提供的一些信息。这些代理反过来必须配置为始终将信息附加到 mod_extforward 信任的标头中,例如 X-Forwarded-For。
多年来,为了通过代理传播 IP 和其他信息,已经提出了许多(非标准)HTTP 请求头扩展和约定,因为这些信息可能无法在后续代理中获取。根据环境的具体配置和特定的安全要求,可能需要让 lighttpd 强制删除一个或多个非标准 HTTP 请求头,例如使用 mod_setenv setenv.set-request-header
(自 1.4.46 起)并将值设置为空 ""
以将其省略。如果 lighttpd mod_proxy 将充当反向代理,或者在特定环境中不希望 CGI、FastCGI、SCGI 等看到这些请求头,这可能会很有用。
setenv.set-request-header = ( #"Forwarded" => "", # RFC7239; the only standard HTTP request header in this list #"X-Forwarded-For" => "", # most common convention (non-standard HTTP request header) #"X-Forwarded-Proto" => "", # (used by mod_extforward if extforward.headers uses X-Forwarded-For) #"X-Host" => "", # set by lighttpd with Host #"X-Forwarded-Host" => "", # most common convention to which to append Host (set in lighttpd 1.4.46) "X-Forwarded-Server" => "", # fallback used by some frameworks if X-Forwarded-Host not present "X-Forwarded-By" => "", "X-Forwarded-Ssl" => "", "X-Origin-IP" => "", "X-Original-To" => "", "X-Real-IP" => "", "Forwarded-For" => "", "Via" => "", #... (more; not an exhaustive list) )