首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通配符和PROXY无效代理协议头之间的对话

通配符和PROXY无效代理协议头之间的对话
EN

Stack Overflow用户
提问于 2019-09-10 12:31:55
回答 1查看 1K关注 0票数 0

我有一台linux机器,2台Wildfly服务器正在监听2台diffé租赁https端口。我有一个域和两个子域: aa.mydomain.fr et bb.mydomain.fr,我使用have重定向到两个通配符服务器(在处理两个不同的https端口和一个linux服务器IP时,我没有找到其他的解决方案来重定向2个子域)。

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

代码语言:javascript
复制
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的通配符服务器conf:

代码语言:javascript
复制
<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不起作用,https返回502错误代码坏网关,而我的通配符服务器日志中有以下错误消息:

代码语言:javascript
复制
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

错误的详细信息:

代码语言:javascript
复制
    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. 如果删除Haproxy conf中的"option“,将得到相同的错误代码。
  3. 如果我在前端https-in部分中添加“accept”,在后端demo_https_site中添加“send”,我将在haproxy.log中得到以下消息:“接收到的东西看起来不像代理协议头”。
  4. 当我用FF监控工具监视头请求时,我看不到X转发的细节.

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

我不知道这个问题是来自于我的野蝇公寓还是我的代理公寓,有人能给我提个主意或者解决吗?

诚挚的问候。

EN

回答 1

Stack Overflow用户

发布于 2019-09-12 21:16:50

我认为可以通过使用发送代理发送-代理-v2选项将代理协议添加到https代理中来解决这个问题。例如:

代码语言:javascript
复制
backend demo_https_site
    server s3 linux_server_ip:8yyy maxconn 32 send-proxy

另一种方法是从通配符中删除代理协议,例如:

代码语言:javascript
复制
<https-listener name="https" socket-binding="https" security-realm="ApplicationRealm" enable-http2="true"/>

但是,这意味着客户端的源ip必须从-转发-为头派生。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57870885

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档