v2ray / discussion

For general discussion over Project V development and usage.
298 stars 34 forks source link

求教caddy2的h2代理配置,調試了好久都不行 #759

Closed wenjinlibug closed 3 years ago

wenjinlibug commented 4 years ago

caddy2的配置:

https://<hosts> {
    file_server browse {
        root <path_root>
    }
    tls <pem> <key> {
        protocols tls1.2 tls1.3
        ciphers TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
        curves x25519
        alpn "h2","http/1.1"
    }
    @v2ray_ws {
        path <path_ws>
        header Connection Upgrade
        header Upgrade websocket
    }
    reverse_proxy @v2ray_ws localhost:<port_ws>

    reverse_proxy <path_h2> {
        to localhost:<port_h2>
        header_up Host {host}
        header_up X-Real-IP {remote}
        header_up X-Forwarded-For {remote}
        header_up X-Forwarded-Port {server_port}
        header_up X-Forwarded-Proto "https"
        transport http {
            tls
            tls_insecure_skip_verify
        }
    }
}

可以看到其實caddy2的配置裏有ws+tls的配置,只是新開了一個端口用來調試h2 使用ws+tls時是完全沒問題的,因此不用懷疑證書的配置。 web方面也完全沒問題。 下面是v2ray 4.25.0的服務端配置:


`"inbound": {
        {
        "tag": "httpPort",
        "listen": "0.0.0.0",
        "port": <port_ws>,
        "protocol": "vmess",
        "sniffing": {
            "enabled": true
        },
        "streamSettings": {
            "network": "ws",
            "wsSettings": {
                "path": <part_ws>
            },
            "security": "none"
        },
        "settings": {
            "clients": [
                {
                    "id": <uuid>,
                    "email": <email>,
                    "level": 0,
                    "alterid": 32
                }
            ],
            "disableInsecureEncryption": false
        }
    }
},
"inboundDetour": [
    {
        "tag": "httpPort",
        "listen": "0.0.0.0",
        "port": <port_h2>,
        "protocol": "vmess",
        "sniffing": {
            "enabled": true
        },
        "streamSettings": {
            "network": "h2",
            "httpSettings": {
                "host": [<host>],
                "path": <part_h2>
            },
            "security": "tls",
            "tlsSettings": {
                "serverName": <host>,
                "allowInsecure": true,
                "alpn": ["h2","http/1.1"],
                "disableSystemRoot": false,
                "certificates": [
                    {
                        "usage": "verify",
                        "certificateFile": <CA-ecc.pem>
                    },
                    {   
                        "usage": "encipherment",
                        "certificateFile": <pem>,
                        "keyFile": <key>
                    }
                ]
            }
        },
        "settings": {
            "clients": [
                {
                    "id": <uuid>,
                    "email": <email>,
                    "level": 0,
                    "alterid": 32
                }
            ],
            "disableInsecureEncryption": false
        }
    }
],`

```客戶端配置上ws+tls和h2沒差多少懶得放。
這個配置在ws上完美運行,一旦切到h2就不通
v2ray會報錯
' failed to read request header > stream error: stream ID <number>; CANCEL'
Kounenri commented 4 years ago

www.website.com { tls user@email.com gzip root /var/www/ log /var/log/caddy/access.log proxy /xxxxx localhost:123 { websocket header_upstream -Origin } proxy /yyyy https://localhost:1234 { insecure_skip_verify transparent }

换Caddy1看看呢,或者Caddy2用上面的参数试试

DolorHunter commented 4 years ago

https://github.com/v2ray/discussion/issues/749

o0HalfLife0o commented 4 years ago

https://github.com/caddyserver/caddy/issues/2889#issuecomment-643872805 试试,可以吗

wenjinlibug commented 4 years ago

@o0HalfLife0o 試過不行,會提示head错误,如果用tls重新加密仍然會提示錯誤。 剛剛更新了2.1,看了下更新文檔有提到增加h2c支持,找個時間再試試看。 transport http { versions h2c } 同样提示' failed to read request header > stream error: stream ID ; CANCEL'

soulmercy commented 4 years ago

@o0HalfLife0o 試過不行,會提示head错误,如果用tls重新加密仍然會提示錯誤。 剛剛更新了2.1,看了下更新文檔有提到增加h2c支持,找個時間再試試看。 transport http { versions h2c } 同样提示' failed to read request header > stream error: stream ID ; CANCEL'

遇到同样问题,也没有测通。caddy2.1.1

masknu commented 4 years ago

This is due a bug in Caddy v2, I submitted a PR to address the issue, hope it would be merged soon. caddyserver/caddy#3556

hang333 commented 4 years ago

这里有人试过自己 git clone devel version caddy 来 build 吗? 我 build 了还是一样报错

masknu commented 4 years ago

这里有人试过自己 git clone devel version caddy 来 build 吗? 我 build 了还是一样报错

提供一下你的caddy配置文件 以及 v2ray 服务端和客户端配置文件看看(隐去隐私信息)。

hang333 commented 4 years ago

这里有人试过自己 git clone devel version caddy 来 build 吗? 我 build 了还是一样报错

提供一下你的caddy配置文件 以及 v2ray 服务端和客户端配置文件看看(隐去隐私信息)。

你好, 这是我的客户端与服务端的配置, 还请过目 https://gist.github.com/hang333/5021e39f8f6f3fe5b94a1cf571c8c245

masknu commented 4 years ago

大致看了一下, https://gist.github.com/hang333/5021e39f8f6f3fe5b94a1cf571c8c245#file-caddyfile-L32 这一节可以这样定义:

reverse_proxy /h2path http://localhost:h2port {
  transport http {
    versions h2c 2
  }
}

https://gist.github.com/hang333/5021e39f8f6f3fe5b94a1cf571c8c245#file-server_v2ray-json-L41 这一行改成: "security": "none",

并且去掉"tlsSettings" 那一节。

Caddy 中的 /h2path 需要 和 v2ray server端的"httpSettings": { "path": "/h2path"} 一致。

试试看。

hang333 commented 4 years ago

大致看了一下, https://gist.github.com/hang333/5021e39f8f6f3fe5b94a1cf571c8c245#file-caddyfile-L32 这一节可以这样定义:

reverse_proxy /h2path http://localhost:h2port {
  transport http {
    versions h2c 2
  }
}

https://gist.github.com/hang333/5021e39f8f6f3fe5b94a1cf571c8c245#file-server_v2ray-json-L41 这一行改成: "security": "none",

并且去掉"tlsSettings" 那一节。

Caddy 中的 /h2path 需要 和 v2ray server端的"httpSettings": { "path": "/h2path"} 一致。

试试看。

我试了一下, 还是发生错误了。 我的新配置文件在这里。 https://gist.github.com/hang333/047ecf4c8d7d2868f1ce142d713a3520 还请你看一下。

masknu commented 4 years ago

看上去新的配置文件没问题,重新启动一下v2ray server 和 Caddy,然后输出一下两者的日志看看。

hang333 commented 4 years ago

看上去新的配置文件没问题,重新启动一下v2ray server 和 Caddy,然后输出一下两者的日志看看。

我看了一下我 caddy 的日志, 发现 v2ray 请求的时候 host 是 www.example.com , 把 client 的 httpSettings 加多一个 host 数组里放服务器的域名就行了 https://gist.github.com/hang333/047ecf4c8d7d2868f1ce142d713a3520#file-v2ray_client-json-L82 改成

        "httpSettings": {
          "host": [
            "domain"
          ],
          "path": "/h2path"
        }

谢谢你的协助!

masknu commented 4 years ago

好的,不客气。你的配置文件可以一直放在那给其他人一个参考了。

ha-ku commented 4 years ago

我尝试了自己build v2.2.0-rc.1 版本的caddy,现在收到http2请求的时候caddy能正常通过h2c反代给后端,但是收到(比如由CDN回源的)http1.1请求的时候依然会出问题。 这是正常的吗?

caddy的log:

{"level":"error","ts":1598361724.3903546,"logger":"http.log.access.log0","msg":"handled request","request":{"remote_addr":"xxx.xxx.xxx.xxx","proto":"HTTP/1.1","method":"PUT","host":"xxx.xxx.xxx","uri":"/xxx","headers":{"X-Forwarded-For":["xxx.xxx.xxx.xxx"],"Accept-Encoding":["identity"],"User-Agent":["CDN-User-Agent"],"Connection":["Keep-Alive"]},"tls":{"resumed":true,"version":771,"cipher_suite":49200,"proto":"","proto_mutual":true,"server_name":"xxx.xxx.xxx"}},"common_log":"xxx.xxx.xxx.xxx - - [25/Aug/2020:13:22:04 +0000] \"PUT /xxx HTTP/1.1\" 502 0","duration":59.996314451,"size":0,"status":502,"resp_headers":{"Server":["Caddy"]}}

v2ray的error.log: 2020/08/25 13:23:52 [Info] [2861881780] v2ray.com/core/app/proxyman/inbound: connection ends > v2ray.com/core/proxy/vmess/inbound: invalid request from 127.0.0.1:45456 > v2ray.com/core/proxy/vmess/encoding: failed to read request header > unexpected EOF 2020/08/25 13:23:52 [Info] [2861881780] v2ray.com/core/app/proxyman/inbound: failed to close connection > multierr: unexpected EOF |

caddy的配置:

https://xxx.xxx.xxx {
        tls /path/to/cert/fullchain.pem /path/to/key/privkey.pem
        reverse_proxy /xxx localhost:xxxxx {
                header_up Host {http.request.host}
                header_up X-Real-IP {http.request.remote.host}
                header_up X-Forwarded-For {http.request.remote.host}
                header_up X-Forwarded-Port {http.request.port}
                header_up X-Forwarded-Proto {http.request.scheme}
                transport http {
                        versions h2c
                }
        }
        其他的web server 配置
}

v2ray的配置:

                {
                        "port": xxxxx,
                        "listen":"0.0.0.0",
                        "protocol": "vmess",
                        "settings": {
                                "clients": [
                                        {
                                                "id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
                                                "level": 2,
                                                "alterId": 64,
                                        }
                                ]
                        },
                        "streamSettings": {
                                "network": "http",
                                "security": "none",
                                "httpSettings": {
                                        "host": [
                                                "xxx.xxx.xxx"
                                        ],
                                        "path": "/xxx"
                                },
                                "tlsSettings": {
                                        "certificates": [{
                                                "certificateFile": "/path/to/cert/fullchain.pem",
                                                "keyFile": "/path/to/key/privkey.pem"
                                        }],
                                        "alpn": ["h2"],
                                        "disableSystemRoot": true
                                }
                        }
                }
masknu commented 4 years ago

嗯,这个特性只有在 <-http2->Caddy<-http2->时会启用。

ha-ku commented 4 years ago

嗯,这个特性只有在 <-http2->Caddy<-http2->时会启用。

所以现在是用H2就只能不过CDN直连吗? 还是说有什么CDN支持http2回源的?我找了好久发现基本都是1.1回源

masknu commented 4 years ago

可能要按CDN提供商的控制面板配置一下http2 CDN。

ha-ku commented 4 years ago

可能要按CDN提供商的控制面板配置一下http2 CDN。

我目前为止试了Cloudfront、cloudflare和gcorelab,三家回源都固定只能是http1.x,就没什么办法

github-actions[bot] commented 3 years ago

This issue is stale because it has been open 90 days with no activity. Remove stale label or comment or this will be closed in 5 days

DdVwl6Fj3a commented 3 years ago

嗯,这个特性只有在 <-http2->Caddy<-http2->时会启用。

所以现在是用H2就只能不过CDN直连吗? 还是说有什么CDN支持http2回源的?我找了好久发现基本都是1.1回源

请问你caddy2 + vmess + h2 配置搞定了吗?我遇到同样的问题想咨询下

DdVwl6Fj3a commented 3 years ago

嗯,这个特性只有在 <-http2->Caddy<-http2->时会启用。

https://gist.github.com/DdVwl6Fj3a/b74ea62d7f0f43a9b1b3c458b708ccef 大佬能帮忙看下我这个问题吗?我v2ray,caddy2的设置跟上面的老哥学习的,但是配置了以后v2ray还是不通,我配置的静态网站是能够访问的,cdn支持双向h2

ha-ku commented 3 years ago

嗯,这个特性只有在 <-http2->Caddy<-http2->时会启用。

所以现在是用H2就只能不过CDN直连吗? 还是说有什么CDN支持http2回源的?我找了好久发现基本都是1.1回源

请问你caddy2 + vmess + h2 配置搞定了吗?我遇到同样的问题想咨询下

我之前配置到过直连能访问的程度,但因为当时CDN没法支持http2回源就撤除了。caddy有一个allow h2c(http2 cleartext)的选项好像只在json配置里可用,反代给v2需要启用那个。你可以先绕过cdn直连测试一下能不能通。

DdVwl6Fj3a commented 3 years ago

嗯,这个特性只有在 <-http2->Caddy<-http2->时会启用。

所以现在是用H2就只能不过CDN直连吗? 还是说有什么CDN支持http2回源的?我找了好久发现基本都是1.1回源

请问你caddy2 + vmess + h2 配置搞定了吗?我遇到同样的问题想咨询下

我之前配置到过直连能访问的程度,但因为当时CDN没法支持http2回源就撤除了。caddy有一个allow h2c(http2 cleartext)的选项好像只在json配置里可用,反代给v2需要启用那个。你可以先绕过cdn直连测试一下能不能通。

直连是通的,就是加了cdn之后不通

ha-ku commented 3 years ago

嗯,这个特性只有在 <-http2->Caddy<-http2->时会启用。

所以现在是用H2就只能不过CDN直连吗? 还是说有什么CDN支持http2回源的?我找了好久发现基本都是1.1回源

请问你caddy2 + vmess + h2 配置搞定了吗?我遇到同样的问题想咨询下

我之前配置到过直连能访问的程度,但因为当时CDN没法支持http2回源就撤除了。caddy有一个allow h2c(http2 cleartext)的选项好像只在json配置里可用,反代给v2需要启用那个。你可以先绕过cdn直连测试一下能不能通。

直连是通的,就是加了cdn之后不通

那就完全是CDN设置的问题了……这个也没办法泛泛地讲。虽然你说CDN是支持h2回源的,但我还是建议你先排查一下这个,比如看看caddy的log里request的alpn。我之前调查的时候,能找到的CDN都是节点到客户端支持h2,但回源最多只能http/1.1。

DdVwl6Fj3a commented 3 years ago

嗯,这个特性只有在 <-http2->Caddy<-http2->时会启用。

所以现在是用H2就只能不过CDN直连吗? 还是说有什么CDN支持http2回源的?我找了好久发现基本都是1.1回源

请问你caddy2 + vmess + h2 配置搞定了吗?我遇到同样的问题想咨询下

我之前配置到过直连能访问的程度,但因为当时CDN没法支持http2回源就撤除了。caddy有一个allow h2c(http2 cleartext)的选项好像只在json配置里可用,反代给v2需要启用那个。你可以先绕过cdn直连测试一下能不能通。

直连是通的,就是加了cdn之后不通

那就完全是CDN设置的问题了……这个也没办法泛泛地讲。虽然你说CDN是支持h2回源的,但我还是建议你先排查一下这个,比如看看caddy的log里request的alpn。我之前调查的时候,能找到的CDN都是节点到客户端支持h2,但回源最多只能http/1.1。

我这个cdn,cdn请求Origin的时候是优先h2,也支持http/1.1,但是和我caddy服务器协商出来的是http/1.1,我caddy服务器设置了alpn,只支持h2,不知道为啥能协商出来http/1.1的

ha-ku commented 3 years ago

嗯,这个特性只有在 <-http2->Caddy<-http2->时会启用。

所以现在是用H2就只能不过CDN直连吗? 还是说有什么CDN支持http2回源的?我找了好久发现基本都是1.1回源

请问你caddy2 + vmess + h2 配置搞定了吗?我遇到同样的问题想咨询下

我之前配置到过直连能访问的程度,但因为当时CDN没法支持http2回源就撤除了。caddy有一个allow h2c(http2 cleartext)的选项好像只在json配置里可用,反代给v2需要启用那个。你可以先绕过cdn直连测试一下能不能通。

直连是通的,就是加了cdn之后不通

那就完全是CDN设置的问题了……这个也没办法泛泛地讲。虽然你说CDN是支持h2回源的,但我还是建议你先排查一下这个,比如看看caddy的log里request的alpn。我之前调查的时候,能找到的CDN都是节点到客户端支持h2,但回源最多只能http/1.1。

我这个cdn,cdn请求Origin的时候是优先h2,也支持http/1.1,但是和我caddy服务器协商出来的是http/1.1,我caddy服务器设置了alpn,只支持h2,不知道为啥能协商出来http/1.1的

你可以试试本地发个只支持1.1的请求给caddy试试?感觉CDN那边多少还是有点问题,具体的你可能得问问CDN的客服

DdVwl6Fj3a commented 3 years ago

嗯,这个特性只有在 <-http2->Caddy<-http2->时会启用。

所以现在是用H2就只能不过CDN直连吗? 还是说有什么CDN支持http2回源的?我找了好久发现基本都是1.1回源

请问你caddy2 + vmess + h2 配置搞定了吗?我遇到同样的问题想咨询下

我之前配置到过直连能访问的程度,但因为当时CDN没法支持http2回源就撤除了。caddy有一个allow h2c(http2 cleartext)的选项好像只在json配置里可用,反代给v2需要启用那个。你可以先绕过cdn直连测试一下能不能通。

直连是通的,就是加了cdn之后不通

那就完全是CDN设置的问题了……这个也没办法泛泛地讲。虽然你说CDN是支持h2回源的,但我还是建议你先排查一下这个,比如看看caddy的log里request的alpn。我之前调查的时候,能找到的CDN都是节点到客户端支持h2,但回源最多只能http/1.1。

我这个cdn,cdn请求Origin的时候是优先h2,也支持http/1.1,但是和我caddy服务器协商出来的是http/1.1,我caddy服务器设置了alpn,只支持h2,不知道为啥能协商出来http/1.1的

你可以试试本地发个只支持1.1的请求给caddy试试?感觉CDN那边多少还是有点问题,具体的你可能得问问CDN的客服

有没有可能是caddy服务器配置的问题,我是不是可以在caddy服务器中指定只支持h2协议?

ha-ku commented 3 years ago

嗯,这个特性只有在 <-http2->Caddy<-http2->时会启用。

所以现在是用H2就只能不过CDN直连吗? 还是说有什么CDN支持http2回源的?我找了好久发现基本都是1.1回源

请问你caddy2 + vmess + h2 配置搞定了吗?我遇到同样的问题想咨询下

我之前配置到过直连能访问的程度,但因为当时CDN没法支持http2回源就撤除了。caddy有一个allow h2c(http2 cleartext)的选项好像只在json配置里可用,反代给v2需要启用那个。你可以先绕过cdn直连测试一下能不能通。

直连是通的,就是加了cdn之后不通

那就完全是CDN设置的问题了……这个也没办法泛泛地讲。虽然你说CDN是支持h2回源的,但我还是建议你先排查一下这个,比如看看caddy的log里request的alpn。我之前调查的时候,能找到的CDN都是节点到客户端支持h2,但回源最多只能http/1.1。

我这个cdn,cdn请求Origin的时候是优先h2,也支持http/1.1,但是和我caddy服务器协商出来的是http/1.1,我caddy服务器设置了alpn,只支持h2,不知道为啥能协商出来http/1.1的

你可以试试本地发个只支持1.1的请求给caddy试试?感觉CDN那边多少还是有点问题,具体的你可能得问问CDN的客服

有没有可能是caddy服务器配置的问题,我是不是可以在caddy服务器中指定只支持h2协议?

所以我说,你在本地用curl之类的给服务端caddy发一个请求,看看apln的协商过程,才知道是不是caddy配置的问题。

DdVwl6Fj3a commented 3 years ago

嗯,这个特性只有在 <-http2->Caddy<-http2->时会启用。

所以现在是用H2就只能不过CDN直连吗? 还是说有什么CDN支持http2回源的?我找了好久发现基本都是1.1回源

请问你caddy2 + vmess + h2 配置搞定了吗?我遇到同样的问题想咨询下

我之前配置到过直连能访问的程度,但因为当时CDN没法支持http2回源就撤除了。caddy有一个allow h2c(http2 cleartext)的选项好像只在json配置里可用,反代给v2需要启用那个。你可以先绕过cdn直连测试一下能不能通。

直连是通的,就是加了cdn之后不通

那就完全是CDN设置的问题了……这个也没办法泛泛地讲。虽然你说CDN是支持h2回源的,但我还是建议你先排查一下这个,比如看看caddy的log里request的alpn。我之前调查的时候,能找到的CDN都是节点到客户端支持h2,但回源最多只能http/1.1。

我这个cdn,cdn请求Origin的时候是优先h2,也支持http/1.1,但是和我caddy服务器协商出来的是http/1.1,我caddy服务器设置了alpn,只支持h2,不知道为啥能协商出来http/1.1的

你可以试试本地发个只支持1.1的请求给caddy试试?感觉CDN那边多少还是有点问题,具体的你可能得问问CDN的客服

有没有可能是caddy服务器配置的问题,我是不是可以在caddy服务器中指定只支持h2协议?

所以我说,你在本地用curl之类的给服务端caddy发一个请求,看看apln的协商过程,才知道是不是caddy配置的问题。

我不使用cdn的时候,直连caddy服务器是没问题的。PS:curl看协商过程该咋写命令?

ha-ku commented 3 years ago

所以我说,你在本地用curl之类的给服务端caddy发一个请求,看看apln的协商过程,才知道是不是caddy配置的问题。

我不使用cdn的时候,直连caddy服务器是没问题的。PS:curl看协商过程该咋写命令?

你不使用CDN的时候,和caddy通信的是你配置好指定只使用h2的v2ray client。负责回源的CDN节点和v2ray client的请求行为应该并不一致,caddy能和后者通信不一定就能和前者通信。我估计curl的行为可能更接近前者一些。 我记得curl加-v的flag能看到详细的过程,这很容易搜到的。

DdVwl6Fj3a commented 3 years ago

所以我说,你在本地用curl之类的给服务端caddy发一个请求,看看apln的协商过程,才知道是不是caddy配置的问题。

我不使用cdn的时候,直连caddy服务器是没问题的。PS:curl看协商过程该咋写命令?

你不使用CDN的时候,和caddy通信的是你配置好指定只使用h2的v2ray client。负责回源的CDN节点和v2ray client的请求行为应该并不一致,caddy能和后者通信不一定就能和前者通信。我估计curl的行为可能更接近前者一些。 我记得curl加-v的flag能看到详细的过程,这很容易搜到的。

curl看到的是我客户端和cdn前端之间的请求,cdn和v2ray之间的请求我看不到的,确实cdn请求caddy服务器的时候行为不一致,使用的是http/1.1,我联系了cdn提供商一起看这个问题,他们这个cdn是支持h2的,现在就是不知道为啥握手变成了http/1.1