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


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

8.3.1. 识别客户端 IP 地址

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

  • 事件日志 - 使用错误的源 IP 地址记录失败的登录尝试
  • SSL 必需 - 如果需要 SSL 设置为 external (默认值),则所有外部请求都需要 SSL
  • 身份验证流 - 使用 IP 地址的自定义身份验证流,如 show OTP 仅适用于外部请求
  • 动态客户端注册

当您在 Red Hat Single Sign-On 身份验证服务器前面有一个反向代理或 loadbalancer 时,这可能会造成问题。常见的设置是,您有一个 frontend 代理位于公共网络上,该代理负载平衡并将请求转发到专用网络中的后端 Red Hat Single Sign-On 服务器实例。在这种情况下,您必须执行一些额外的配置,以便实际的客户端 IP 地址被 Red Hat Single Sign-On 服务器实例转发到和处理。具体来说:

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

配置代理以生成 X-Forwarded-ForX-Forwarded-Proto HTTP 标头,并保留原始主机 HTTP 标头超出了本指南的范围。采取额外的措施来确保代理设置了 X-Forwared-For 标头。如果您的代理没有正确配置,则 恶意 客户端可以自行设置此标头,并欺骗 Red Hat Single Sign-On 认为客户端正在从不同的 IP 地址连接。如果您正在执行 IP 地址的黑色或白名单,这非常重要。

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

X-Forwarded-For HTTP 配置

<subsystem xmlns="urn:jboss:domain:undertow:6.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:6.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

8.3.2. 使用 Reverse 代理启用 HTTPS/SSL

假设您的反向代理没有为 SSL 使用端口 8443,您还需要配置将哪些端口 HTTPS 流量重定向到其中。

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

redirect-socket 属性添加到 http-listener 元素。该值应该是 proxy-https,它指向您还需要定义的套接字绑定。

然后,在 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

8.3.3. 验证配置

您可以通过反向代理打开路径 /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 的多个端点。确保端点以反向代理或负载均衡器的地址(scheme、domain 和 port)开头。通过这样做,您可以确保 Red Hat Single Sign-On 使用正确的端点。

您还应验证 Red Hat Single Sign-On 是否看到请求的正确源 IP 地址。检查您可以尝试使用无效的用户名和/或密码登录管理控制台。这应该会在服务器日志中显示警告信息,如下所示:

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

检查 ipAddress 的值是您尝试使用登录的机器的 IP 地址,而不是反向代理或负载均衡器的 IP 地址。

8.3.4. 使用 Built-In Load Balancer

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

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

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

8.3.4.1. 使用 Load Balancer 注册新主机

我们首先在 domain.xml 中使用负载均衡器配置注册新主机 slave。打开此文件,再前往 load-balancer 配置文件中的 undertow 配置。在 reverse-proxy XML 块中添加名为 remote- host 3 的新主机定义。

domain.xml reverse-proxy config

<subsystem xmlns="urn:jboss:domain:undertow:6.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 用于在负载平衡时启用粘性会话。

接下来,向下滚动到 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

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

8.3.4.3. 主机 Slave Bind Addresses

接下来,您必须更改 公共管理 和域控制器绑定地址(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.addres.management 的值。jboss.domain.master.address 的值必须是域控制器的 IP 地址,这是 master 主机的管理地址。

8.3.5. 配置其他 Load Balancer

有关如何使用其他基于软件的 负载平衡器的信息,请参阅 JBoss EAP 配置指南中的 负载平衡 部分。

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat