Documentation

10. 代理支持

代理服务器充当从其他服务器请求资源的客户端请求的中间人。客户端连接到代理服务器,请求不同的服务器提供某些服务或可用资源,代理服务器会评估请求,以简化和控制其复杂性。

注解

支持使用 SSL 卸载或使用处理 Tower SSL 的代理。需要配置代理/负载均衡器来传递远程主机信息。

将 SSL 卸载到负载均衡器或代理时,将 nginx_disable_https=true 设置为传递给设置 (setup) playbook 的额外变量。如需有关将额外变量应用到设置 (setup) playbook 的信息,请参阅 Setup Playbook

Tower 中的会话会在创建时关联一个 IP 地址。Tower 策略要求任何会话的使用都与原始关联的 IP 地址匹配。

要提供代理服务器支持,Tower 通过 Tower 设置 (/etc/tower/conf.d/remote_host_headers.py) 中的 REMOTE_HOST_HEADERS 列表变量处理代理请求(如 Tower、HAProxy、Squid 和 tinyproxy)。默认情况下,REMOTE_HOST_HEADERS 设置为 ['REMOTE_ADDR', 'REMOTE_HOST']

要启用代理服务器支持,按如下所示设置 REMOTE_HOST_HEADERSREMOTE_HOST_HEADERS = ['HTTP_X_FORWARDED_FOR', 'REMOTE_ADDR', 'REMOTE_HOST']

注解

新安装的 Ansible Tower 将不包含 remote_host_headers.py 文件。但是,您仍可在 Configure Tower 用户界面的系统设置中设置这些值。

_images/configure-tower-system.png

Tower 通过搜索 REMOTE_HOST_HEADERS 中的标头列表来确定远程主机的 IP 地址,直至找到第一个 IP 地址。

注解

使用以下逻辑构建标头名称:

除了 CONTENT_LENGTHCONTENT_TYPE,请求中的任何 HTTP 标头都转换成 META 键,方法是将所有字符转换为大写字母,用下划线替换任何连字符,并在名称中添加 HTTP_ 前缀。例如,标头调用的 X-Barkley 将映射到 META 键 HTTP_X_Barkley

有关 HTTP 请求和响应对象的详情请参考: https://docs.djangoproject.com/en/1.8/ref/request-response/#django.http.HttpRequest.META

注解

如果在负载均衡器中使用 SSL 终止,并将流量转发到 tower 节点上的不同端口 (443 -> 80),请相应地在 /etc/tower/conf.d/custom.py 在文件中设置以下值:

USE_X_FORWARDED_PORT = True
USE_X_FORWARDED_HOST = True

10.1. 配置已知的代理

当使用 REMOTE_HOST_HEADERS = ['HTTP_X_FORWARDED_FOR', 'REMOTE_ADDR', 'REMOTE_HOST'] 配置 Tower 时,它假定 X-Forwarded-For 的值源自 Tower 前面的代理/负载均衡器。在不使用代理/负载均衡器时或代理没有验证标头仍可以访问 Tower 的情况下,X-Forwarded-For 很容易受欺骗来假冒原始 IP 地址。使用 REMOTE_HOST_HEADERS 设置中的 HTTP_X_FORWARDED_FOR 可能会形成潜在的安全漏洞,导致授予用户本不应具有的某些资源的访问权限。

要避免这种情况,您可以配置允许的“已知代理”的列表,即通过设置 API 进行 PROXY_IP_WHITELIST 设置。不在列表上的负载均衡器和主机将导致拒绝请求。

只有列表中的代理正确清除了标头输入并正确设置了等于客户端真实来源 IP 的 X-Forwarded-For 值时,PROXY_IP_WHITELIST 才有效;此设置的缺陷在于 Tower 能够依赖 PROXY_IP_WHITELIST 中的 IP/主机名来为 X-Forwarded-For 字段提供非伪值。

HTTP_X_FORWARDED_FOR **不应**配置为 REMOTE_HOST_HEADERS 中的项目,除非满足以下条件:

  • 您使用的是代理环境 w/ ssl 终止

  • 代理提供 X-Forwarded-For 标头的清理/验证以防止客户端伪造

  • /etc/tower/conf.d/remote_host_headers.py 定义 PROXY_IP_WHITELIST 只包含可信代理/负载均衡器的原始 IP。

注解

如果不需要让所有流量通过代理,那么您可以指定要在 no_proxy 字段中排除的 IP 方案。列表可以是 IP 范围或独立 IP,用逗号分开。本例以 JSON 格式显示指定 IP 范围:

"https_proxy": "example.proxy.com:8080",
"http_proxy": "example.proxy.com:8080",
"no_proxy": "10.0.0.0/8"

另外,带有 no_proxy 配置和 CIDR标记的 SCM 更新可能不适用于特定的 SCM。对 http_proxyno_proxy 的支持依赖于应用程序中的实施(|hg|git|hg|svn)。例如,git 不支持 no_proxy CIDR 标记,因为 git 被其 C 库限制: https://curl.haxx.se/libcurl/c/CURLOPT_NOPROXY.html.。

10.2. 反向代理

如果您在反向代理后面,您可能想要为 HTTP_X_FORWARDED_FOR 设置标头字段设置。X-Forwarded-For (XFF) HTTP 标头字段标识通过 HTTP 代理服务器或负载均衡器连接到 web 服务器的客户端的原始 IP 地址。

REMOTE_HOST_HEADERS = ['HTTP_X_FORWARDED_FOR', 'REMOTE_ADDR', 'REMOTE_HOST']