gpt4 book ai didi

java - Wildfly 和 haproxy 之间的对话 - 无效的 PROXY 协议(protocol) header

转载 作者:行者123 更新时间:2023-12-02 00:49:38 25 4
gpt4 key购买 nike

我有一台 Linux 机器,有 2 个 Wildfly 服务器监听 2 个不同的 https 端口。我有一个域和 2 个子域:aa.mydomain.fr 和 bb.mydomain.fr,我使用 Haproxy 重定向到我的 2 个 wildlfy 服务器(我没有找到其他解决方案来重定向 2 个子域来处理 2 个子域)不同的 https 端口和一个 linux 服务器 IP)

我的 HapProxy 服务器配置(仅适用于 aa.mydomain.fr):

global
log 127.0.0.1:514 local0 info
daemon
maxconn 4096
tune.ssl.default-dh-param 1024
ssl-default-bind-options ssl-min-ver TLSv1.2
defaults
mode http
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
log global
option httplog
option forwardfor
frontend http-in
bind linux_server_ip:80
acl is_demo_site hdr_end(host) aa.mydomain.fr
use_backend demo_site if is_demo_site
frontend https-in
bind linux_server_ip:443 ssl crt /etc/haproxy/cert/mycert.pem
acl is_demo_https_site hdr_end(host) aa.mydomain.fr
use_backend demo_https_site if is_demo_https_site
backend demo_site
server s1 linux_server_ip:8xxx maxconn 32
backend demo_https_site
server s3 linux_server_ip:8yyy maxconn 32
http-request set-header X-Forwarded-Proto https

我的子域 aa.mydomain.fr 的 Wildfly 服务器配置:

<subsystem xmlns="urn:jboss:domain:undertow:8.0" default-server="default-server" default-virtual-host="default-host" default-servlet-container="default" default-security-domain="other">
<buffer-cache name="default"/>
<server name="default-server">
<http-listener name="default" socket-binding="http" redirect-socket="https" proxy-address-forwarding="true" enable-http2="true"/>
<https-listener name="https" socket-binding="https" security-realm="ApplicationRealm" enable-http2="true" proxy-protocol="true"/>
<host name="default-host" alias="localhost">
<location name="/" handler="welcome-content"/>
<access-log pattern="%a %t %H %p %U %s %S %T" directory="${jboss.home.dir}/standalone/log" prefix="access_"/>
<http-invoker security-realm="ApplicationRealm"/>
</host>
</server>
<servlet-container name="default">
<jsp-config/>
<websockets/>
</servlet-container>
<handlers>
<file name="welcome-content" path="${jboss.home.dir}/welcome-content"/>
</handlers>
</subsystem>

<socket-binding-group name="standard-sockets" default-interface="public" port-offset="${jboss.socket.binding.port-offset:0}">
...
<socket-binding name="http" port="${jboss.http.port:8xxx}"/>
<socket-binding name="https" port="${jboss.https.port:8yyy}"/>
...
</socket-binding-group>

http 重定向工作正常,但 https 重定向不行,它会返回 502 错误代码 bad Gateway,并且我的 Wildfly 服务器日志中有此错误消息:

2019-09-10 10:47:11,746 TRACE [org.xnio.nio] (default I/O-2) Running task org.xnio.nio.QueuedNioTcpServer$1@7b85bf52
2019-09-10 10:47:11,746 TRACE [org.xnio.nio] (default I/O-2) Running task org.xnio.nio.NioHandle$1@dd77838
2019-09-10 10:47:11,746 DEBUG [io.undertow.request.io] (default I/O-2) UT005013: An IOException occurred: java.io.IOException: UT000179: Invalid PROXY protocol header
at io.undertow.core@2.0.15.Final//io.undertow.server.protocol.proxy.ProxyProtocolReadListener.handleEvent(ProxyProtocolReadListener.java:90)
at io.undertow.core@2.0.15.Final//io.undertow.server.protocol.proxy.ProxyProtocolReadListener.handleEvent(ProxyProtocolReadListener.java:34)
at org.jboss.xnio@3.6.5.Final//org.xnio.ChannelListeners.invokeChannelListener(ChannelListeners.java:92)
at org.jboss.xnio@3.6.5.Final//org.xnio.conduits.ReadReadyHandler$ChannelListenerHandler.readReady(ReadReadyHandler.java:66)
at org.jboss.xnio.nio@3.6.5.Final//org.xnio.nio.NioSocketConduit.handleReady(NioSocketConduit.java:89)
at org.jboss.xnio.nio@3.6.5.Final//org.xnio.nio.NioHandle$1.run(NioHandle.java:50)
at org.jboss.xnio.nio@3.6.5.Final//org.xnio.nio.WorkerThread.safeRun(WorkerThread.java:612)
at org.jboss.xnio.nio@3.6.5.Final//org.xnio.nio.WorkerThread.run(WorkerThread.java:479)
2019-09-10 10:47:11,747 TRACE [org.xnio.nio] (default I/O-2) Cancelling key channel=java.nio.channels.SocketChannel[connected local=/linux_server_ip:8xxx remote=/linux_server_ip:49866], selector=sun.nio.ch.EPollSelectorImpl@4a7d8873, interestOps=1, readyOps=0 of java.nio.channels.SocketChannel[connected local=/linux_server_ip:8xxx remote=/linux_server_ip:49866] (same thread)
2019-09-10 10:47:11,747 TRACE [org.xnio.nio] (default I/O-2) Added task org.xnio.nio.QueuedNioTcpServer$2@1939a2a9

错误详细信息:

    private static final byte[] NAME = "PROXY ".getBytes(StandardCharsets.US_ASCII);

public void handleEvent(StreamSourceChannel streamSourceChannel) {
PooledByteBuffer buffer = bufferPool.allocate();
boolean freeBuffer = true;
try {
for (; ; ) {
int res = streamSourceChannel.read(buffer.getBuffer());
if (res == -1) {
IoUtils.safeClose(streamConnection);
return;
} else if (res == 0) {
return;
} else {
buffer.getBuffer().flip();
while (buffer.getBuffer().hasRemaining()) {
char c = (char) buffer.getBuffer().get();
if (byteCount < NAME.length) {
//first we verify that we have the correct protocol
if (c != NAME[byteCount]) {
throw **UndertowMessages.MESSAGES.invalidProxyHeader()**;
}





注释:

  1. 我使用“让我们加密”SSL 证书。

  2. 如果我删除 Haproxyconf 中的“optionforwardfor”,我会得到相同的错误代码。

  3. 如果我在前端 https-in 部分添加“accept-proxy”并在后端 demo_https_site 中添加“send-proxy”,我会在 haproxy.log 中收到以下消息:“收到的内容看起来不像代理协议(protocol)头”。

  4. 当我使用 FF 监控工具监控 header 请求时,我看不到 X-Forwarded 详细信息...

软件详细信息:Haproxy v1.8.8/Wildfly v15.0.1

我不知道问题是来 self 的 Wildfly 配置还是我的 haproxy 配置,有人可以提出建议或修复吗?

致以诚挚的问候。

最佳答案

我认为您可以解决此问题的一种方法是使用 send-proxy 将代理协议(protocol)添加到您的 https 代理中。或send-proxy-v2选项。例如:

backend demo_https_site
server s3 linux_server_ip:8yyy maxconn 32 send-proxy

另一种方法是从 Wildfly 中删除代理协议(protocol),例如:

<https-listener name="https" socket-binding="https" security-realm="ApplicationRealm" enable-http2="true"/>

但是,这意味着客户端的源 IP 必须源自 X-Forwarded-For header 。

关于java - Wildfly 和 haproxy 之间的对话 - 无效的 PROXY 协议(protocol) header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57870885/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com