Tuic v5 / Hysteria 2 / Nginx SNI+Xray [ Vless Vision & Reality & Trojan tls & Vless ws & Vless gRPC & Trojan ws & Trojan gRPC]

本文详细介绍如何在云服务器上安装 Docker 版 Nginx、Xay、Tuic、Hysteria,实现网盘与 Vless、Trojan、WS、gRPC 共用443 端口和非443端口的 Tuic、Hysteria 2 协议。以下配置命令是在 root 账户下完成,非 root 账户执行时需要在每条命令前加上 sudo。
443端口:Vless Vision TLS/Reality、Trojan、gRPC
2000端口:Reality
3000端口:Tuic v5
4000端口:Hysteria 2

ECS 准备

云服务器 OS 推荐 Ubuntu 或 Debian 的最新版,内存 >= 512M 。

升级安装必要软件以及设置时区

apt-get update && apt-get upgrade
apt-get install wget -y
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
hwclock -w

如果云服务器控制面板里有单独的防火墙面板,直接放行 80/443 端口。否则需要在系统里安装防火墙并配置。

apt-get install ufw -y
ufw enable

# 检查UFW是否运行
ufw status

# 设置默认规则
ufw default allow outgoing
ufw default deny incoming

# 允许以下端口通过防火墙 SSH 端口默认22 建议更换为其它端口
ufw allow 22/tcp
ufw allow 80/tcp
ufw allow 443/tcp
ufw allow 2000/tcp
ufw allow 3000/udp
ufw allow 4000/udp

# 列出当前UFW规则
ufw status verbose


申请和安装域名证书

假如域名为 domain.com,我们申请 Wildcard 泛域名证书。域名的 nameserver 推荐使用 Cloudflare,解析速度极快。

安装 acme.sh

wget -qO- get.acme.sh | bash 
source ~/.bashrc

设置 Cloudflare 的 CF_Token(为了安全不要用Global API 详细教程网上找)

export CF_Token="xxxxxx"
export CF_Email="xxxxxx"

acme.sh 默认使用 ZeroSSL 申请证书,可更换默认服务商为 Let’s Encrypt。

acme.sh --set-default-ca --server letsencrypt

acme.sh 实现了 acme 协议支持的所有验证协议,一般有两种方式验证,http 和 dns 验证。由于 Wildcard 证书验证只支持 dns 验证,不支持 http 验证,所以要使用 dns api 模式。推荐申请 ECC 证书。

acme.sh --issue --dns dns_cf -d domain.com -d '*.domain.com' -k ec-256

安装证书

acme.sh --installcert -d domain.com --fullchain-file /etc/ssl/fullchain.cer --key-file /etc/ssl/domain.com.key --ecc


安装网盘服务

我推荐 Cloudreve 网盘。

mkdir /usr/local/bin/cloudreve && cd /usr/local/bin/cloudreve
wget https://github.com/cloudreve/Cloudreve/releases/download/3.8.3/cloudreve_3.8.3_linux_amd64.tar.gz
tar -zxvf cloudreve_3.8.3_linux_amd64.tar.gz
chmod +x ./cloudreve
./cloudreve

Cloudreve 在首次启动时,会创建初始管理员账号,请注意保管管理员密码,此密码只会在首次启动时出现。如果您忘记初始管理员密码,需要删除同级目录下的 cloudreve.db,重新启动主程序以初始化新的管理员账户。Cloudreve 默认会监听5212端口。你可以在浏览器中访问 http://服务器IP:5212 进入 Cloudreve。
接下来按 Ctrl+C 退出 Cloudreve,设置守护进程。

nano /usr/lib/systemd/system/cloudreve.service

# 输入以下代码
[Unit]
Description=Cloudreve
Documentation=https://docs.cloudreve.org
After=network.target
After=mysqld.service
Wants=network.target

[Service]
WorkingDirectory=/usr/local/bin/cloudreve
ExecStart=/usr/local/bin/cloudreve/cloudreve
Restart=on-abnormal
RestartSec=5s
KillMode=mixed

StandardOutput=null
StandardError=syslog

[Install]
WantedBy=multi-user.target

设置开机启动

systemctl start cloudreve
systemctl enable cloudreve

设置 Cloudreve 配置文件并重启

nano /usr/local/bin/cloudreve/conf.ini

# 编辑以下代码
[System]
Mode = master
Debug = false
Listen = :5212

[UnixSocket]
Listen = /run/cloudreve.sock

# 重启 CLoudreve 服务
systemctl restart cloudreve


安装 Xray 和 Nginx

Xray 和 Nginx 都用 Docker版 方便维护和升级

# 安装 Docker
wget -qO- get.docker.com | bash

# 设置 Docker 开机启动
systemctl start docker
systemctl enable docker

# 拉取镜像 其中 watchtower 会自动监测并更新镜像
docker pull teddysun/xray
docker pull nginx
docker pull containrrr/watchtower
mkdir /var/log/xray
touch /var/log/xray/error.log && touch /var/log/xray/access.log
mkdir /var/log/nginx
touch /var/log/nginx/error.log && touch /var/log/nginx/access.log


配置 Xray

利用 Nginx 支持 SNI 分流特性,实现多协议共用 443 端口。其中 Trojan+TCP+TLS 为 WebSocket 提供分流转发;Nginx 同时为 Vless Vision TLS、Vless Vision Reality 与 Trojan 提供回落服务,为 Xray 的 gRPC 提供反向代理。

以下代码实现了 Xray 服务中 Vless+Vision+TLS、Vless+Version+Reality、Vless+ws、Vless gRPC、Trojan+tls、Trojan+ws、Trojan gRPC 七种组合协议共存。

mkdir /etc/xray && nano /etc/xray/config-vision.json

# 添加以下代码
{
    "log": {
        "loglevel": "warning",
        "error": "/var/log/xray/error.log",
        "access": "/var/log/xray/access.log"
    },
    "inbounds": [
        {
	    "listen": "/dev/shm/vless.sock",
            "protocol": "vless",
            "settings": {
                "clients": [
                    {
                        "id": "048e0bf2-dd56-11e9-aa37-5600024c1d6a", # 修改为自己的UUID
                        "flow": "xtls-rprx-vision"
                    }
                ],
                "decryption": "none",
                "fallbacks": [
                    {
                        "alpn": "h2",
                        "dest": "/dev/shm/h2c.sock",
                        "xver": 2
                    },
                    {
                        "dest": "/dev/shm/h1.sock",
                        "xver": 2
                    },
                    {
                        "path": "/vws",
						"dest": "@vless-ws",
                        "xver": 2
                    }
                ]
            },
            "streamSettings": {
                "network": "tcp",
                "security": "tls",
                "tlsSettings": {
                    "alpn": [
                        "h2",
                        "http/1.1"
                    ],
                    "minVersion": "1.2",
                    "cipherSuites": "TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384:TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256:TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256",
                    "certificates": [
                        {
                            "certificateFile": "/etc/ssl/fullchain.cer",
                            "keyFile": "/etc/ssl/domain.com.key",
                            "ocspStapling": 3600
                        }
                    ]
                },
                "tcpSettings": {
					"acceptProxyProtocol": true
				}
            },
      		"sniffing": {
        		"enabled": true,
        		"destOverride": [
         		 "http",
          		 "tls"
        		]
      		}
        },
        {
            "listen": "@vless-ws",
            "protocol": "vless",
            "settings": {
                "clients": [
                    {
                        "id": "048e0bf2-dd56-11e9-aa37-5600024c1d6a" # 修改为自己的UUID
                    }
                ],
                "decryption": "none"
            },
            "streamSettings": {
                "network": "ws",
                "security": "none",
                "wsSettings": {
					"acceptProxyProtocol": true,
					"path": "/vws"
				}
            },
      		"sniffing": {
        		"enabled": true,
        		"destOverride": [
         		 "http",
          		 "tls"
        		]
      		}
        },
        {
			"listen": "/dev/shm/reality.sock",
            "protocol": "vless",
            "settings": {
                "clients": [
                    {
                        "id": "048e0bf2-dd56-11e9-aa37-5600024c1d6a", # 修改为自己的UUID
                        "flow": "xtls-rprx-vision"
                    }
                ],
                "decryption": "none"
            },
            "streamSettings": {
                "network": "tcp",
                "security": "reality",
                "realitySettings": {
                    "show": false,
                    "dest": "/dev/shm/web.sock",
                    "xver": 2,
                    "serverNames": [
                        "r.domain.com"
                    ],
                    "privateKey": "8GY5APNJPGftVueqa_pCH6ofL9ZlvxNPptZe7iTMdHc", # 修改为自己的privateKey
                    "shortIds": [
                        ""
                    ]
                },
                "tcpSettings": {
					"acceptProxyProtocol": true
				}
            },
      		"sniffing": {
        		"enabled": true,
        		"destOverride": [
         		 "http",
          		 "tls"
        		]
      		}
        },
        {
	    "listen": "/dev/shm/trojan.sock",
            "protocol": "trojan",
            "settings": {
                "clients": [
                    {
                        "password":"Your password" # 修改为自己的密码
                    }
                ],
                "fallbacks": [
                    {
                    	"alpn": "h2",
                        "dest": "/dev/shm/h2c.sock",
                        "xver": 2
                    },
                    {
                        "dest": "/dev/shm/h1.sock",
                        "xver": 2
                    },
                    {
                        "path": "/tws",
						"dest": "@trojan-ws",
                        "xver": 2
                    }
                ]
            },
            "streamSettings": {
                "network": "tcp",
                "security": "tls",
                "tlsSettings": {
                    "alpn": [
                        "h2",
                        "http/1.1"
                    ],
                    "minVersion": "1.2",
                    "cipherSuites": "TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384:TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256:TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256",
                    "certificates": [
                        {
                            "certificateFile": "/etc/ssl/fullchain.cer",
                            "keyFile": "/etc/ssl/domain.com.key",
                            "ocspStapling": 3600
                        }
                    ]
                },
                "tcpSettings": {
                	"acceptProxyProtocol": true
                }
            },
      		"sniffing": {
        		"enabled": true,
        		"destOverride": [
         		 "http",
          		 "tls"
        		]
      		}
        },
        {
            "listen": "@trojan-ws",
            "protocol": "trojan",
            "settings": {
                "clients": [
                    {
                        "password":"Your password" # 修改为自己的密码
                    }
                ],
                "decryption": "none"
            },
            "streamSettings": {
                "network": "ws",
                "security": "none",
                "wsSettings": {
					"acceptProxyProtocol": true,
					"path": "/tws"
				}
            },
      		"sniffing": {
        		"enabled": true,
        		"destOverride": [
         		 "http",
          		 "tls"
        		]
      		}
        },
        {
		"listen": "/dev/shm/vgrpc.sock",
    	 	"protocol": "vless",
     	  	"settings": {
                "clients": [
                    {
                        "id": "048e0bf2-dd56-11e9-aa37-5600024c1d6a" # 修改为自己的UUID
                    }
                ],
        		"decryption": "none"
     	  	},
     	  	"streamSettings": {
                "network": "grpc",
       			"security": "none",
       			"grpcSettings": {
                    "serviceName": "vdngrpc" # 修改为自己的服务名称 与Nginx配置里一致
        		}
      		},
      		"sniffing": {
        		"enabled": true,
        		"destOverride": [
         		 "http",
          		 "tls"
        		]
      		}
        },

        {
		"listen": "/dev/shm/tgrpc.sock",
    	 	"protocol": "trojan",
     	  	"settings": {
                "clients": [
                    {
                        "password": "xxxxxx" # 修改为自己的密码
                    }
                ]
     	  	},
     	  	"streamSettings": {
                "network": "grpc",
       			"security": "none",
       			"grpcSettings": {
                    "serviceName": "tdngrpc" # 修改为自己的服务名称 与Nginx配置里一致
        		}
      		},
      		"sniffing": {
        		"enabled": true,
        		"destOverride": [
         		 "http",
          		 "tls"
        		]
      		}
        }
    ],
    "outbounds": [
        {
            "protocol": "freedom"
        }
    ]
}

建议协议用新不用旧,在客户端支持的情况下,推荐 Vless + Vision、Vless + Vision+Reality。

Xray 配置文件里的 Private key 为 8GY5APNJPGftVueqa_pCH6ofL9ZlvxNPptZe7iTMdHc,在客户端里对应 Public key 为 zdZDyO6e4rZbY9ntngS8yXPRR5dF2JHdlfIl6cJEMic,也可以自己生成这对 Key。

docker exec -it xray-v sh
xray x25519
# 执行上面的命令后会生成 Private key 和 Public key,最后输入exit 退出容器。


配置 Nginx

因为需要多个域名来标记分流,所以事先应在 Cloudflare 里设置好二级域名。这里假设 v.domain.com 对应 Vless 协议,t.domain.com 对应 Trojan 协议,r.domain.com 对应 Reality 协议。

Nginx 配置文件是 /etc/nginx/nginx.conf

mkdir /etc/nginx
nano /etc/nginx/nginx.conf

# 添加以下代码
user  root;
worker_processes auto;

error_log  /var/log/nginx/error.log;

pid       /run/nginx.pid;

events {
    worker_connections 1024;
}

stream {
    map $ssl_preread_server_name $backend_name {
        v.domain.com  vless;
        t.domain.com trojan;
        r.domain.com reality;
        domain.com      web;
        default         web;
    }

    upstream vless {
        server unix:/dev/shm/vless.sock;
    }

    upstream trojan {
        server unix:/dev/shm/trojan.sock;
    }

    upstream reality {
        server unix:/dev/shm/reality.sock;
    }    
    
    upstream web {
        server unix:/dev/shm/web.sock;
    }

    server {
        listen 443;
        listen [::]:443;
        ssl_preread on;
        proxy_protocol on;
        proxy_pass  $backend_name;
    }
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for" '
                      '$proxy_protocol_addr:$proxy_protocol_port';

	access_log  /var/log/nginx/access.log  main;
    
    sendfile on;
    keepalive_timeout 65;
    include /etc/nginx/conf.d/*.conf;
}

Nginx 站点配置文件是 /etc/nginx/conf.d/default.conf

mkdir /etc/nginx/conf.d
nano /etc/nginx/conf.d/default.conf

# 添加以下代码
server {
    listen 80;
    listen [::]:80;
    return 301 https://domain.com$request_uri;
}

server {
    listen unix:/dev/shm/h1.sock proxy_protocol;
    listen unix:/dev/shm/h2c.sock proxy_protocol; 
    set_real_ip_from unix:;
	real_ip_header proxy_protocol;
    return 301 https://domain.com$request_uri;
}

server {
    listen unix:/dev/shm/web.sock ssl proxy_protocol;
    http2 on;
	set_real_ip_from unix:;
	real_ip_header proxy_protocol;
    ssl_protocols TLSv1.3 TLSv1.2;
	ssl_reject_handshake on;
} #限定域名连接(包括禁止以 IP 方式访问网站)

server {
    listen unix:/dev/shm/web.sock ssl proxy_protocol;
    server_name domain.com www.domain.com r.domain.com;
    if ($host = www.domain.com) { return 301 https://domain.com$request_uri; }
    http2 on;
    set_real_ip_from unix:;
	real_ip_header proxy_protocol;
    ssl_certificate /etc/ssl/fullchain.cer;
    ssl_certificate_key /etc/ssl/domain.com.key;
    ssl_session_cache    shared:SSL:1m;
    ssl_session_timeout  5m;
    ssl_session_tickets  off;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers  TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305;
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;

    location / {
		proxy_pass http://unix:/run/cloudreve.sock;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
		client_max_body_size 20000m;
		proxy_redirect     off;
		proxy_buffer_size          64k; 
		proxy_buffers              32 32k; 
		proxy_busy_buffers_size    128k;
    }

    location /vdngrpc { # 修改为自己的服务名称 与xray配置里一致
		if ($request_method != "POST") {
            return 404;
        }
        client_body_buffer_size 1m;
        client_body_timeout 1h;
        client_max_body_size 0;
        grpc_read_timeout 1h;
        grpc_send_timeout 1h;
        grpc_set_header X-Real-IP $remote_addr;
        grpc_pass grpc://unix:/dev/shm/vgrpc.sock;
    }

    location /tdngrpc { # 修改为自己的服务名称 与xray配置里一致
		if ($request_method != "POST") {
            return 404;
        }
        client_body_buffer_size 1m;
        client_body_timeout 1h;
        client_max_body_size 0;
        grpc_read_timeout 1h;
        grpc_send_timeout 1h;
        grpc_set_header X-Real-IP $remote_addr;
        grpc_pass grpc://unix:/dev/shm/tgrpc.sock;
    }
}


启动 Nginx、Xray 服务

运行 Docker Xray 服务

docker run -d --network host --name xray-v --restart=always -v /etc/xray/config-vision.json:/etc/xray/config.json -v /var/log/xray:/var/log/xray -v /etc/ssl:/etc/ssl -v /dev/shm:/dev/shm teddysun/xray

运行 Docker Nginx 服务

docker run -d --network host --name nginx --restart=always -v /etc/nginx/conf.d:/etc/nginx/conf.d -v /etc/nginx/nginx.conf:/etc/nginx/nginx.conf -v /run/cloudreve.sock:/run/cloudreve.sock -v /etc/ssl:/etc/ssl -v /var/log/nginx:/var/log/nginx -v /dev/shm:/dev/shm nginx

现在可以在浏览器里打开 domain.com,会自动跳转到 https://domain.com,页面就是 Cloudreve 网盘,用刚才保存的用户名和密码登录,可以配置 Cloudreve 网盘。

安装非443端口的 Reality 协议

上面代码实现的是共用 443 端口的 Reality 协议,要求网站开启 TLS 1.3,但是可能会带来一个问题,如果有人在同一个IP段中扫描到了你的域名,那么你的网站域名会被“偷走”用于别人的 Reality 协议。如果担心的话,就不要在 Nginx 配置里开启 TLS 1.3,在不支持 TLS 1.3 的情况下,上面的代码就没法使用 Reality 协议了,于是我建议再安装一个非 443 端口的 Reality 服务。

nano /etc/xray/config-reality.json

# 添加以下代码

{
    "log": {
        "loglevel": "warning",
        "error": "/var/log/xray/error.log",
        "access": "/var/log/xray/access.log"
    },
    "inbounds": [
        {
			"Port": "2000",
            "protocol": "vless",
            "settings": {
                "clients": [
                    {
                        "id": "048e0bf2-dd56-11e9-aa37-5600024c1d6a", # 修改为自己的UUID
                        "flow": "xtls-rprx-vision"
                    }
                ],
                "decryption": "none"
            },
            "streamSettings": {
                "network": "tcp",
                "security": "reality",
                "realitySettings": {
                    "show": false,
                    "dest": "www.figma.com:443", # 可自行替换符合要求的域名
                    "xver": 0,
                    "serverNames": [
                        "www.figma.com" # 可自行替换符合要求的域名
                    ],
                    "privateKey": "8GY5APNJPGftVueqa_pCH6ofL9ZlvxNPptZe7iTMdHc", # 修改为自己的privateKey
                    "shortIds": [
                        ""
                    ]
                }
            },
      		"sniffing": {
        		"enabled": true,
        		"destOverride": [
         		 "http",
          		 "tls"
        		]
      		}
        }
    ],
    "outbounds": [
        {
            "protocol": "freedom"
        }
    ]
}

# 运行服务
docker run -d --network host --name xray-r --restart=always -v /etc/xray/config-reality.json:/etc/xray/config.json -v /var/log/xray:/var/log/xray teddysun/xray

安装 Tuic v5 协议

使用 UDP,可以在任何系统平台实现双向的 BBR,网络切换时的会话平滑转移,例如在从 Wi-Fi 切换到移动数据时连接不会像 TCP 一样直接断开,支持多路复用,实际体验是非常丝滑。
直接上代码

docker pull monkeyray/tuic
mkdir /etc/tuic

nano /etc/tuic/config.json
# 添加以下代码
{
    "server": "[::]:3000",
    "users": {
        "048e0bf2-dd56-11e9-aa37-5600024c1d6a": "password" # 自行修改UUID和密码
    },
    "certificate": "/etc/ssl/fullchain.cer",
    "private_key": "/etc/ssl/domain.com.key",
    "congestion_control": "bbr",
    "alpn": ["h3", "spdy/3.1"],
    "dual_stack": true,
    "max_idle_time": "300s",
    "max_external_packet_size": 1500,
    "auth_timeout": "3s",
    "task_negotiation_timeout": "3s",
    "send_window": 16777216,
    "receive_window": 8388608,
    "udp_relay_ipv6": true,
    "zero_rtt_handshake": false,
    "gc_interval": "3s",
    "gc_lifetime": "15s",
    "log_level": "info"
}

#运行服务
docker run -d \
     --network host \
     --name tuic \
     --restart=always \
     -v /etc/tuic/config.json:/etc/tuic/config.json \
     -v /etc/ssl:/etc/ssl \
     monkeyray/tuic

安装 Hysteria 2 协议

也是基于 UDP,相比 Tuic,更加“暴力”,速度更快些,还支持自定义路由功能。
直接上代码

docker pull teddysun/hysteria
mkdir /etc/hysteria

nano /etc/hysteria/server.yaml
# 添加以下代码

listen: :4000

tls:
  cert: /etc/ssl/fullchain.cer
  key: /etc/ssl/domain.com.key

auth:
  type: password
  password: your_password #自行修改密码

resolver:
  type: udp
  udp:
    addr: 8.8.8.8:53
    timeout: 10s
  tls:
    addr: 1.1.1.1:853
    timeout: 10s
  https:
    addr: 1.1.1.1:443
    timeout: 10s

# 运行服务
docker run -d --network host --name hysteria --restart=always -v /etc/hysteria:/etc/hysteria -v /etc/ssl:/etc/ssl teddysun/hysteria

最后,运行 Docker Watchtower 服务 自动监测并更新软件

docker run -d --name watchtower -v /var/run/docker.sock:/var/run/docker.sock --restart unless-stopped  containrrr/watchtower --cleanup xray-v xray-r tuic hysteria

因为在实际运行中发现 Nginx Docker 镜像自动更新时,停止 Nginx 容器后仍然占用 /dev/shm/ 里面几个 sock 文件(h1.sock/h2c.sock/web.sock),这样新的 Nginx 容器启动后会报错,导致打不开网站和 Xray,只能重启服务器或者删除 /dev/shm/ 下所有文件后重启 Nginx 。因此上面的命令行不自动更新 Nginx 。

客户端

Windows:
v2rayN https://github.com/2dust/v2rayN
Nekoray https://github.com/MatsuriDayo/nekoray (推荐)

IOS:
Shadowrocket https://apps.apple.com/sg/app/shadowrocket/id932747118

Android:
Nekoray https://github.com/MatsuriDayo/NekoBoxForAndroid

评论

  1. lyly
    Windows Chrome
    2 年前
    2022-12-09 1:13:50

    请问xray 没有在宿主机上生成/h2c.sock. 如何解决呢?从docker中copy出来吗?

    • 博主
      lyly
      Windows Firefox
      1 年前
      2023-1-14 15:21:10

      我也发现宿主机上没有h1.sock和h2c.sock,所以docker运行时没挂载。

  2. lyly
    Windows Chrome
    2 年前
    2022-12-11 17:32:52

    重新看了一般入站流程恍然大悟,原来vless+gRPC方式是通过路径进来而不通过SNI,加上SNI就报错。
    但官方文档不是说gRPC不能通过路径来分流,要通过SNI域名吗?这样不是说反了?或者是我理解错误了

    • 博主
      lyly
      Windows Firefox
      1 年前
      2023-1-14 15:17:41

      我有很长一段时间没更新了,很抱歉今天才回复你。
      grpc是通过nginx反向代理实现的,所以客户端的sni必须填写主域名domian.com,当TLS验证域名进行握手时会通过这个sni进行握手,而客户端里的address可以填写domain.com,也可以填写v.domain.com或t.domain.com,只要address里的域名都能解析到服务器IP即可。
      大致流程:TLS验证SNI域名 -> Nginx(匹配vdncrpc或tdngrpc)-> Xray
      另外今天更新了xray的配置,增加了vless+vision和trojan+ws支持。

  3. churricane
    Windows Chrome
    1 年前
    2023-5-15 20:28:08

    nano /usr/local/etc/xray/config.json这个路径错误

    • 博主
      churricane
      Windows Firefox
      1 年前
      2023-5-17 20:28:03

      感谢指正,这条指令写错了,应该是 nano /etc/xray/config.json。

  4. churricane
    Windows Chrome
    1 年前
    2023-5-15 20:29:31

    除了grpc 其余的都不通,nginx配置是不是有问题?

    • 博主
      churricane
      Windows Firefox
      1 年前
      2023-5-17 20:30:33

      grpc可以用,看起来nginx配置应该是对的。
      1.输入docker logs xray,确认xray配置文件是否正确?
      2.停止nginx/xray服务,删除/dev/shm下所有文件,重新运行xray和nginx服务。
      3.客户端配置vless 协议,地址填写v.domain.com;配置trojan协议,地址填写t.domain.com。

      • churricane
        admin
        Windows Chrome
        1 年前
        2023-5-19 20:55:51

        都可以用了 谢谢!
        是我设置代理的时候网址没有填对,调整之后都可以用了

        • 博主
          churricane
          Windows Firefox
          1 年前
          2023-5-23 12:24:06

          能用就好,目前本文配置里只有Vless Vision能避免tls in tls,所以推荐用vision,其它的能不用就不用,除非客户端不支持。

          • churricane
            admin
            Windows Chrome
            1 年前
            2023-5-26 22:01:27

            用了几天有时候会连不上不知道什么原因,删除了/dev/shm/文件夹里面的内容之后,再重启docker又能用

          • 博主
            churricane
            Windows Firefox
            1 年前
            2023-6-01 9:54:42

            我也遇到过这个情况,不是很频繁,重启服务器或删除所有sock文件能恢复正常。
            看了这几个sock文件,发现tgrpc.sock、trojan.sock、vgrpc.sock、vless.sock这四个sock文件的权限是0755,其他的sock文件权限是0666。
            怀疑是nginx和xray创建的文件权限不一致导致,可以在/etc/xray/config.json配置里,找到 “listen”: “/dev/shm/xxx.sock”, 修改为 “listen”: “/dev/shm/xxx.sock,0666”,应该有四个地方需要修改。
            重启服务后查看/dev/shm下的sock文件权限是否一致,再运行观察几日。

  5. qq
    Windows Chrome
    8 月前
    2023-10-20 10:02:34

    @admin,大佬您好,请教两个问题。
    1、证书能用多久,到期了是否要续期?
    2、是否先要在cloudflare增加子域名的设置?

    • 博主
      qq
      Windows Firefox
      8 月前
      2023-10-27 13:59:30

      1、证书由acme每三个月自动更新,无需人工干预。
      2、二级域名需要在cloudflare提前设置好,添加cname,指向主域名。

  6. yalaso
    Macintosh Firefox
    7 月前
    2023-11-28 17:36:11

    请教,按照教程走完,nginx无法启动,报错如下:
    Error response from daemon: Cannot restart container nginx: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: error mounting “/run/cloudreve.sock” to rootfs at “/run/cloudreve.sock”: mount /run/cloudreve.sock:/run/cloudreve.sock (via /proc/self/fd/6), flags: 0x5000: not a directory: unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type

    如果先启动nginx后再启动cloudreve没有报错,但是访问网页520,nginx日志如下:
    2023/11/28 09:14:14 [error] 29#29: *37 connect() to unix:/run/cloudreve.sock failed (111: Connection refused) while connecting to upstream, client: x.x.x.x, server: domain.com, request: “GET / HTTP/2.0”, upstream: “http://unix:/run/cloudreve.sock:/”, host: “domain.com”

    求指导思路,感谢!

    • 博主
      yalaso
      Windows Chrome
      7 月前
      2023-11-29 23:36:35

      我明天在服务器上测试一遍,再回复你。

    • 博主
      yalaso
      Windows Firefox
      7 月前
      2023-11-30 12:02:47

      你好,又查看了一遍配置,发现是我的失误,/etc/xray/config-vision.json 这个文件里有多余的符号,导致xray服务启动失败。配置已修正,请你自己修改后再试一次。

      • yalaso
        admin
        Macintosh Firefox
        7 月前
        2023-12-04 13:41:51

        感谢博主回复,xray配置文件里有多余符号我检查出来了,现在还是服务冲突,我自己慢慢看看,再次感谢!

        • 博主
          yalaso
          Windows Firefox
          7 月前
          2023-12-05 15:02:24

          上面的配置,前几天我在vps上完整执行过一遍,是可以正常运行的。若有疑问,可以联系TG(首页里有链接)。

  7. 土拨鼠
    Windows Chrome
    4 月前
    2024-3-14 12:50:28

    这种是什么东西…listen:/dev/shm/tgrpc.sock 这是个自己创建的文件吗 我是linux渣渣哈哈,不都是写个端口,没见过这玩意…

    • 博主
      土拨鼠
      Windows Chrome
      4 月前
      2024-3-16 13:14:03

      配置使用了unix socket监听方式,因为不需要经过tcp网络协议栈,会比端口监听方式性能更好。
      不过实际使用中两者没有明显差别。

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇