9.3. 设置负载均衡器或代理


本节讨论在集群的 Red Hat Single Sign-On 部署前面放置反向代理或负载均衡器前需要配置的多个内容。它还涵盖配置群集 域示例 的内置负载均衡器。

下图演示了负载平衡器的使用。在本例中,负载均衡器充当三个红帽单点登录服务器集群之间的反向代理。

Load Balancer 图表示例

load balancer

9.3.1. 识别客户端 IP 地址

Red Hat Single Sign-On 中的一些功能取决于连接身份验证服务器的 HTTP 客户端的远程地址是客户端计算机的实际 IP 地址。示例包括:

  • 事件日志 - 失败的登录尝试会记录错误的源 IP 地址
  • 需要 SSL - 如果需要 SSL (默认),它应该为所有外部请求使用 SSL
  • 身份验证流 - 使用 IP 地址进行自定义身份验证流,例如,只显示 OTP 用于外部请求
  • 动态客户端注册

如果您在 Red Hat Single Sign-On 身份验证服务器前有反向代理或负载均衡器,这可能会出现问题。常见的设置是,您有一个前端代理位于公共网络上,它会对请求进行负载平衡并将请求转发给位于专用网络中的 Red Hat Single Sign-On 服务器实例。在这种情况下,您需要执行一些额外的配置,以便实际的客户端 IP 地址被转发到红帽单点登录服务器实例并处理。具体来说:

  • 配置反向代理或负载均衡器,以正确设置 X-Forwarded-ForX-Forwarded-Proto HTTP 标头。
  • 配置反向代理或负载均衡器,以保留原始 'Host' HTTP 标头。
  • 配置身份验证服务器以从 X-Forwarded-For 标头读取客户端的 IP 地址。

配置代理来生成 X-Forwarded-ForX-Forwarded-Proto HTTP 标头并保留原始主机 HTTP 标头已超出本指南的范围。采取额外的预防措施,以确保代理设置了 X-Forwarded-For 标头。如果您的代理没有正确配置,则 恶意 客户端可以自己设置此标头,并提示红帽单点登录考虑客户端正在从不同 IP 地址进行连接,而不是实际情况。如果您正在执行任何黑色或白色 IP 地址列表,这非常重要。

除了代理本身外,您还需要在 Red Hat Single Sign-On of things 配置一些。如果您的代理通过 HTTP 协议转发请求,您需要配置 Red Hat Single Sign-On,以便从 X-Forwarded-For 标头(而不是从网络数据包)拉取客户端的 IP 地址。为此,请打开配置文件配置文件(standalone.xmlstandalone-ha.xmldomain.xml,具体取决于您的 操作模式),并查找 urn:jboss:domain:undertow:12.0 XML 块。

x-Forwarded-For HTTP 配置

<subsystem xmlns="urn:jboss:domain:undertow:12.0">
   <buffer-cache name="default"/>
   <server name="default-server">
      <ajp-listener name="ajp" socket-binding="ajp"/>
      <http-listener name="default" socket-binding="http" redirect-socket="https"
          proxy-address-forwarding="true"/>
      ...
   </server>
   ...
</subsystem>
Copy to Clipboard Toggle word wrap

proxy-address-forwarding 属性添加到 http-listener 元素。将值设为 true

如果您的代理正在使用 AJP 协议而不是 HTTP 来转发请求(例如,Apache HTTPD + mod-cluster),那么您必须配置不同的方法。您需要添加一个过滤器从 AJP 数据包拉取此信息,而不是修改 http-listener

x-Forwarded-For AJP 配置

<subsystem xmlns="urn:jboss:domain:undertow:12.0">
     <buffer-cache name="default"/>
     <server name="default-server">
         <ajp-listener name="ajp" socket-binding="ajp"/>
         <http-listener name="default" socket-binding="http" redirect-socket="https"/>
         <host name="default-host" alias="localhost">
             ...
             <filter-ref name="proxy-peer"/>
         </host>
     </server>
        ...
     <filters>
         ...
         <filter name="proxy-peer"
                 class-name="io.undertow.server.handlers.ProxyPeerAddressHandler"
                 module="io.undertow.core" />
     </filters>
 </subsystem>
Copy to Clipboard Toggle word wrap

9.3.2. 使用反向代理启用 HTTPS/SSL

假设您的反向代理不会将端口 8443 用于 SSL,那么您还需要将端口配置为重定向 HTTPS 流量的端口。

<subsystem xmlns="urn:jboss:domain:undertow:12.0">
    ...
    <http-listener name="default" socket-binding="http"
        proxy-address-forwarding="true" redirect-socket="proxy-https"/>
    ...
</subsystem>
Copy to Clipboard Toggle word wrap

流程

  1. redirect-socket 属性添加到 http-listener 元素。该值应该是 proxy-https,它指向您也需要定义的套接字绑定。
  2. socket-binding - group 元素中添加新的 socket-binding 元素:

    <socket-binding-group name="standard-sockets" default-interface="public"
        port-offset="${jboss.socket.binding.port-offset:0}">
        ...
        <socket-binding name="proxy-https" port="443"/>
        ...
    </socket-binding-group>
    Copy to Clipboard Toggle word wrap

9.3.3. 验证配置

您可以验证反向代理或负载均衡器配置

流程

  1. 通过反向代理打开路径 /auth/realms/master/.well-known/openid-configuration

    例如,如果反向代理地址为 https://acme.com/,则打开 URL https://acme.com/auth/realms/master/.well-known/openid-configuration。这将显示一个 JSON 文档,列出 Red Hat Single Sign-On 的多个端点。

  2. 确保端点以您的反向代理或负载均衡器的地址(提取、域和端口)开头。通过执行此操作,您要确保 Red Hat Single Sign-On 使用正确的端点。
  3. 验证 Red Hat Single Sign-On 是否看到请求的正确源 IP 地址。

    要进行检查,您可以尝试使用无效的用户名和/或密码登录 Admin Console。这应该会在服务器日志中显示类似如下的警告:

    08:14:21,287 WARN  XNIO-1 task-45 [org.keycloak.events] type=LOGIN_ERROR, realmId=master, clientId=security-admin-console, userId=8f20d7ba-4974-4811-a695-242c8fbd1bf8, ipAddress=X.X.X.X, error=invalid_user_credentials, auth_method=openid-connect, auth_type=code, redirect_uri=http://localhost:8080/auth/admin/master/console/?redirect_fragment=%2Frealms%2Fmaster%2Fevents-settings, code_id=a3d48b67-a439-4546-b992-e93311d6493e, username=admin
    Copy to Clipboard Toggle word wrap
  4. 检查 ipAddress 的值是您尝试登录的机器的 IP 地址,而不是反向代理或负载均衡器的 IP 地址。

9.3.4. 使用内置负载均衡器

本节介绍配置群集 域示例 中讨论的内置负载均衡器。

集群域示例 仅设计为在一台计算机上运行。要在另一个主机上启动从设备,您需要执行以下操作:

  1. 编辑 domain.xml 文件以指向您的新主机从设备
  2. 复制服务器分发。您不需要 domain.xmlhost.xmlhost-master.xml 文件。您不需要 独立/ 目录。
  3. 编辑 host-slave.xml 文件,以更改所用的绑定地址或在命令行中覆盖它们

流程

  1. 打开 domain.xml,以便您可以使用负载均衡器配置注册新主机从设备。
  2. 转到 load-balancer 配置集中的 undertow 配置。在 reverse-proxy XML 块中添加名为 remote- host 3 的新主机定义。

    domain.xml reverse-proxy config

    <subsystem xmlns="urn:jboss:domain:undertow:12.0">
      ...
      <handlers>
          <reverse-proxy name="lb-handler">
             <host name="host1" outbound-socket-binding="remote-host1" scheme="ajp" path="/" instance-id="myroute1"/>
             <host name="host2" outbound-socket-binding="remote-host2" scheme="ajp" path="/" instance-id="myroute2"/>
             <host name="remote-host3" outbound-socket-binding="remote-host3" scheme="ajp" path="/" instance-id="myroute3"/>
          </reverse-proxy>
      </handlers>
      ...
    </subsystem>
    Copy to Clipboard Toggle word wrap

    output-socket-binding 是指向稍后在 domain.xml 文件中配置的 socket-binding 的逻辑名称。instance-id 属性还必须对新主机是唯一的,因为这个值供 Cookie 用于在负载平衡时启用粘性会话。

  3. 向下到 load-balancer-sockets socket-binding-group,再为 remote-host3 添加 outbound-socket-binding

    这个新绑定需要指向新主机的主机和端口。

    domain.xml outbound-socket-binding

    <socket-binding-group name="load-balancer-sockets" default-interface="public">
        ...
        <outbound-socket-binding name="remote-host1">
            <remote-destination host="localhost" port="8159"/>
        </outbound-socket-binding>
        <outbound-socket-binding name="remote-host2">
            <remote-destination host="localhost" port="8259"/>
        </outbound-socket-binding>
        <outbound-socket-binding name="remote-host3">
            <remote-destination host="192.168.0.5" port="8259"/>
        </outbound-socket-binding>
    </socket-binding-group>
    Copy to Clipboard Toggle word wrap

9.3.4.1. Master 绑定地址

接下来,您需要做的是更改 master 主机的公共 和管理 绑定地址。按照 Bind Addresses 章节中所述编辑 domain.xml 文件,或者在命令行中指定这些绑定地址,如下所示:

$ domain.sh --host-config=host-master.xml -Djboss.bind.address=192.168.0.2 -Djboss.bind.address.management=192.168.0.2
Copy to Clipboard Toggle word wrap

9.3.4.2. 主机从属绑定地址

接下来,您必须更改 公共管理、域控制器绑定地址(jboss.domain.master-address)。编辑 host-slave.xml 文件或在命令行中指定它们,如下所示:

$ domain.sh --host-config=host-slave.xml
     -Djboss.bind.address=192.168.0.5
      -Djboss.bind.address.management=192.168.0.5
       -Djboss.domain.master.address=192.168.0.2
Copy to Clipboard Toggle word wrap

与主机从设备 IP 地址相关的 jboss.bind.addressjboss.bind.address.management 的值。jboss.domain.master.address 的值需要是域控制器的 IP 地址,这是 master 主机的管理地址。

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat