v2fly / v2ray-core

A platform for building proxies to bypass network restrictions.
https://v2fly.org
MIT License
29.48k stars 4.66k forks source link

V2Ray同時配置VLESS和Vmess + WS + TLS,通過HaProxy解密TLS分發的問題 #232

Closed LearZhou closed 3 years ago

LearZhou commented 4 years ago

除非特殊情况,请完整填写所有问题。不按模板发的 issue 将直接被关闭。 如果你遇到的问题不是 V2Ray 的 bug,比如你不清楚要如何配置,请使用Discussion进行讨论。

1) 你正在使用哪个版本的 V2Ray?(如果服务器和客户端使用了不同版本,请注明) v4.29.0

2) 你的使用场景是什么?比如使用 Chrome 通过 Socks/VMess 代理观看 YouTube 视频。 同時配置VLESS和Vmess+WebSocket+TLS的方案,但通過HaProxy解密TLS並分發

3) 你看到的不正常的现象是什么?(请描述具体现象,比如访问超时,TLS 证书错误等) HaProxy通過不同的path判斷分發至VLESS或者Vmess,由於這2個方案同時在外網的443端口監聽,利用了同一個域名,導致從path判斷轉入WebSocket時,無從分辨應該發到VLESS還是Vmess所在的那個本地端口,只能一律發到Vmess所在端口。 而這樣的配置VLESS可以正常使用,唯一的缺點是UDP(如DNS請求)會因出現錯誤而導致反應延遲,加入mux選項之後緩解。

4) 你期待看到的正确表现是怎样的? UDP請求不應該導致錯誤,VLESS和Vmess是否不應共享進入WebSocket之後的服務?

5) 请附上你的配置(提交 Issue 前请隐藏服务器端IP地址)。

服务器端配置: 無關

客户端配置: 無關

6) 请附上出错时软件输出的错误日志。在 Linux 中,日志通常在 /var/log/v2ray/error.log 文件中。

服务器端错误日志: 無

客户端错误日志: 無

7) 请附上访问日志。在 Linux 中,日志通常在 /var/log/v2ray/access.log 文件中。 無關

8) 其它相关的配置文件(如 Nginx)和相关日志。

9) 如果 V2Ray 无法启动,请附上 --test 输出。

通常的命令为 /usr/bin/v2ray/v2ray --test --config /etc/v2ray/config.json。请按实际情况修改。

10) 如果 V2Ray 服务运行不正常,请附上 journal 日志。

通常的命令为 journalctl -u v2ray

请预览一下你填的内容再提交。

kingwilliam commented 4 years ago

我都是用 haproxy+ws+tls 只用443, vmess vless 用不同path, 运作完全正常。 您可否提供 haproxy.cfg 和 v2 config.json 看看。

LearZhou commented 4 years ago

part of server side config.json:

  "inbounds": [
    {
      "port": 10000,
      "listen": "0.0.0.0",
      "protocol": "vmess",
      "settings": {
        "clients": [
          {
            "id": "...",
            "level": 0,
            "alterId": 64
          }
        ]
      },
      "streamSettings": {
        "network": "ws",
        "security": "none",
        "wsSettings": {
          "path": "/v2rayWeb"
        }
      }
    },
    {
      "port": 10001,
      "listen": "0.0.0.0",
      "protocol": "vless",
      "settings": {
        "clients": [
          {
            "id": "...",
            "flow": "",
            "level": 0
          }
        ],
        "decryption": "none"
      },
      "streamSettings": {
        "network": "ws",
        "security": "none",
        "wsSettings": {
          "path": "/v2rayVLESS"
        }
      }
     }
  ],

part of my haproxy configuration:

frontend main
        bind 127.0.0.1:443 ssl crt /etc/ssl/.../combined.pem accept-proxy

        mode http
        option forwardfor

        acl host_webserver hdr_beg(Host) -i example.com
        http-request allow if host_webserver
        http-request deny

        ## routing based on Host Path
        use_backend vmess        if { path -m beg /v2rayWeb }
        use_backend vless        if { path -m beg /v2rayVLESS }

        ## routing based on websocket protocol header
        acl hdr_connection_upgrade hdr(Connection) -i upgrade
        acl hdr_upgrade_websocket  hdr(Upgrade)    -i websocket
        use_backend vmess if hdr_connection_upgrade hdr_upgrade_websocket

        default_backend webserver_81

As you can see, the 'use_backend vmess if hdr_connection_upgrade hdr_upgrade_websocket' is the only route to vmess after switched to websocket, yet it still works well. I thought it will have to be 'use_backend vless if hdr_connection_upgrade hdr_upgrade_websocket' to make it work and didn't know how.

RPRX commented 4 years ago

VLESS 的 UDP over TCP 在某些情况下存在问题,可能会在下个版本中修复。

無從分辨應該發到VLESS還是Vmess所在的那個本地端口,只能一律發到Vmess所在端口。

这里指的是?

LearZhou commented 4 years ago

這個配置是從官方用nginx做的示例配置轉過來的,其中有一個是,當數據流轉向WebSocket時有一個轉換的判斷,這裡如何根據path來判斷應當發到Vmess還是VLESS的監聽端口?這個用HaProxy如何配置這點不是太清楚,在配置增加VLESS之前,僅用Vmess+ws+tls是沒有問題的。

kingwilliam commented 4 years ago

有两点先想了解清楚

  1. 看见您的bind 有 accept-proxy, 请问haproxy 前还有另一个proxy吗? 1.1 那个proxy也是 proxy protocol 转送过来haproxy 吗?
  2. 您的haproxy 是那个version? 2.1 因我由haproxy 1.8开始已不用 detect websocket和upgrade

可试试以下haproxy.cfg

## routing based on Host Path
use_backend vmess if { path -i -m str /v2rayWeb }     ## -i 是區分大小寫, str 是要完全匹配
use_backend vless if { path -i -m str /v2rayVLESS }   ## -i 是區分大小寫, str 是要完全匹配

## routing based on websocket protocol header
## acl hdr_connection_upgrade hdr(Connection) -i upgrade   ## 暂时停用
## acl hdr_upgrade_websocket  hdr(Upgrade)    -i websocket ## 暂时停用
## use_backend vmess if hdr_connection_upgrade hdr_upgrade_websocket ## 暂时停用

default_backend webserver_81

补充: 如个是 beg, V2abc 是等同 V2abcde 如个是 str, V2abc 是不等同 V2abcde

haproxy acl 可参考以下网址 https://www.haproxy.com/blog/introduction-to-haproxy-acls/

LearZhou commented 4 years ago

多謝@kingwilliam的提示。回答您的問題如下:

  1. 這個Proxy前面是一個監聽443端口的'listen',不tls解碼,只負責根據sni及其它一些信息分發服務,其中一個服務是v2ray;
  2. 我用的HaProxy是2.0.14版本。

根據您提的幾點,我做了幾個對比測試,發現啟用HaProxy的websocket探測,能加快v2ray的響應速度,以下是修正後的部分配置:

frontend main
        bind 127.0.0.1:443 ssl crt /etc/ssl/.../combined.pem accept-proxy

        mode http
        option forwardfor

        acl host_webserver hdr_beg(Host) -i example.com
        http-request allow if host_webserver
        http-request deny

        acl pathVmess path -m str /v2rayWeb
        acl pathVless path -m str /v2rayVLESS

        ## routing based on Host Path
        #use_backend vmess        if pathVmess
        #use_backend vless        if pathVless

        ## routing based on websocket protocol header
        acl is_websocket hdr(Connection) -i upgrade
        acl is_websocket  hdr(Upgrade)    -i websocket

        use_backend vmess if is_websocket pathVmess
        use_backend vless if is_websocket pathVless

        #default_backend webserver_81
        use_backend webserver_81 unless pathVmess || pathVless

這種方式是在探測到websocket之後再根據path轉發到v2ray服務,好處應該有:

  1. 即使遠端用了正確的path來探測,但若不轉入websocket根本不進入v2ray的處理;
  2. 這種方式響應速度是最快的。

另外,@rprx:

發現使用vmess+ws+tls時,若客戶端配置沒有mux,UDP請求仍可能有延遲;不知能否確認vmess也有類似問題,但沒有vless嚴重?

LearZhou commented 4 years ago

@rprx:

剛才我在vmess+ws+tls的配置下,做了對比測試,發現沒有加入mux的客戶端配置,確實可能會導致打開網頁等待時間很長;而加入mux緩解的配置,打開速度非常快。

kingwilliam commented 4 years ago

现在已可正常分发?

LearZhou commented 4 years ago

可以了。

github-actions[bot] commented 3 years ago

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