项目

通用

个人资料

操作

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.modulesmod_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)
                                )

gstrauss2 年多前 更新 · 36 次修订