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>

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>

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>

流程

  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>

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
  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>

    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>

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

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

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

Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2026 Red Hat
返回顶部