xray搭建reality和网站共用443端口启用网站SSL
当我们只有一个vps,又想部署网站同时又想搭建代理,当然两个程序可以分开占用端口,做到不冲突,但是感觉不怎么优雅,所以想要让两个程序都去共用一个443端口,这样子网站可以使用域名并开启ssl,代理也可以使用443(心理作用,感觉代理走443会更好一些,毕竟代理使用了ssl,走其他端口怪怪的)。下面就开启折腾之路。
代理协议
目前比较稳定的协议要数reality了,所以自己搭建的代理也是使用reality,reality可以使用自己的证书,也可以使用其他域名的证书:就是宣传的“偷证书”。既然我的网站要使用443开启ssl,那我当时使用自己的证书最方便,而且延迟最小。
证书申请
安装reality可以使用xui来安装,具体的xui安装可以参考我的文章:x-ui安装配置使用。xui本身可以帮助我们申请证书,如果不想使用xui的证书申请,还可以参考我的另一篇文章使用certbot来申请证书:docker部署certbot申请Let’s Encrypt证书,我这里就使用certbot来申请证书。
站点部署
这里是为了演示,所以我这里就只启动nginx,然后配置ssl,对域名启用ssl。nginx我使用的是docker来启动的,具体的目录如下,所在的路径是:/root/images/nginx
├── README.md├── conf│ ├── conf.d│ └── nginx.conf├── docker-compose.yaml├── html│ └── index.html└── logs ├── 1.txt ├── access.log ├── error.log
conf目录下是站点的配置文件,nginx.conf是默认的,它包含了conf.d目录为的所有.conf
结尾的文件。
nginx.conf
nginx.conf的配置如下:
user nginx;worker_processes auto;error_log /var/log/nginx/error.log notice;pid /var/run/nginx.pid;events { worker_connections 1024; }http { include /etc/nginx/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"'; access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; #gzip on; include /etc/nginx/conf.d/*.conf; }
很简单就是默认配置。
web.conf
web.conf是在conf.d目录下的,就是我们部署的站点的配置文件,如下:
# 设置 HTTP 服务器,将所有 HTTP 请求都重定向到 HTTPSserver { listen 80; server_name test.xxx.me; # 重定向所有 HTTP 请求到 HTTPS location / { return 301 https://$server_name$request_uri; } }# 设置 HTTPS 服务器server { listen 443 ssl http2; server_name test.xxx.me; # ======域名,需要改成自己的========= # SSL 证书和密钥文件的路径 ssl_certificate /etc/letsencrypt/ssl/xx/fullchain.pem; # ======自己的证书文件路径========= ssl_certificate_key /etc/letsencrypt/ssl/xx/privkey.pem;# ====自己的证书文件路径======= # 可选:设置 SSL 会话缓存 ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; # 可选:设置 SSL 协议和加密算法 ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384"; # 可选:开启 OCSP Stapling,提高 SSL 握手性能 ssl_stapling on; ssl_stapling_verify on; ssl_trusted_certificate /etc/letsencrypt/ssl/xx/fullchain.pem; # ======自己的证书文件路径======= # 可选:设置 Content Security Policy(内容安全策略)头 # add_header Content-Security-Policy "default-src 'self';" always; # 可选:设置访问日志 access_log /var/log/nginx/test.access.log; error_log /var/log/nginx/test.error.log; location / { root /usr/share/nginx/html; index index.html index.htm; } }
访问80端口强制转到443端口,证书使用的是docker中的使用certbot申请的证书。证书的路径是和下边的docker-compose.yaml中挂载的目录相关的,xx只是为了在nginx容器中找到正确的目录。
docker-compose.yaml
具体内容如下:
version: '3'networks: mynet: external: trueservices: nginx: image: nginx:1.22.0 restart: unless-stopped container_name: nginx volumes: - ./conf/nginx.conf:/etc/nginx/nginx.conf - ./conf/conf.d:/etc/nginx/conf.d - ./html:/usr/share/nginx/html - ./logs:/var/log/nginx - /root/images/certbot/certs:/etc/letsencrypt - /root/images/certbot/certs/live/test.ml520.me:/etc/letsencrypt/ssl/xx networks: - mynet ports: - 80:80 - 443:443
这里映射了letsencrypt的两个目录,配合nginx,找到对应的证书路径,如果不是在docker中就按找实际的证书路径处理就行了。
index.html
index.html就是一个非常简单的网页了,里边的内容很随意,就是一个欢迎语。
这时候我们把nginx启动起来,通过域名访问我们的网站看是否已经可以正常使用https。
代理配置
代理的配置这里就简单带过,通过x-ui或者直接安装xray-core来运行。也可以通过我的镜像:xray,直接使用docker安装,参考文章:xray配置使用reality
xray的配置文件如下:
{ "log": { "loglevel": "warning", "access": "/var/log/xray/access.log", "error": "/var/log/xray/error.log" }, "api": { "services": [ "HandlerService", "LoggerService", "StatsService" ], "tag": "api" }, "inbounds": [ { "listen": null, "port": 8443, "protocol": "vless", "settings": { "clients": [ { "id": "0c41318a-32b6-4017-9938-4033bf261234", "flow": "xtls-rprx-vision", "email": "reality@xray.com" } ], "decryption": "none" }, "streamSettings": { "network": "tcp", "security": "reality", "realitySettings": { "show": false, "dest": "www.microsoft.com:443", "xver": 1, "serverNames": [ "www.microsoft.com" ], "privateKey": "uPPcl9806d81DMdlojRB_ps78jrxNpT0wcG0ueOmD69", "shortIds": [ "6ba85179e30d4fc2" ] } }, "sniffing": { "enabled": true, "destOverride": [ "http", "tls" ] } } ], "outbounds": [ { "tag": "common", "protocol": "freedom" } ], "routing": { "rules": [ { "type": "field", "outboundTag": "common", "network": "udp,tcp" } ] }, "policy": { "statsInboundUplink": true, "statsInboundDownlink": true, "statsOutboundUplink": true, "statsOutboundDownlink": true }, "dns": null, "transport": null, "stats": null, "reverse": null, "fakeDns": null}
这里先使用偷微软的证书进行验证。不出意外就已经ok了,此时xray用的8443,nginx使用的443,两个单独占用端口,是完全可以正常访问的。
共用端口
经过上边的准备,现在我们就可以开始来合并端口了,首先是修改nginx的配置,原来的nginx容器是暴露了80和443端口,现在我们需要把443端口让给xray,所以需要修改docker-compose.yaml文件,改变端口映射,让它的https使用18443,并且需要修改nginx的web.conf配置文件。
docker-compose.yaml
内容如下:
version: '3'networks: mynet: external: trueservices: nginx: image: nginx:1.22.0 restart: unless-stopped container_name: nginx volumes: - ./conf/nginx.conf:/etc/nginx/nginx.conf - ./conf/conf.d:/etc/nginx/conf.d - ./html:/usr/share/nginx/html - ./logs:/var/log/nginx - ./../naiveproxy/conf/cert:/ssl - ./../wordpress/html:/wordpress - /root/images/certbot/certs:/etc/letsencrypt - /root/images/certbot/certs/live/test.ml520.me:/etc/letsencrypt/ssl/xx networks: - mynet ports: - 80:80 - 18443:18443 # 主要是修改这里,改变端口映射
主要是修改了端口,由原来的443改成18443,把443端口让给xray使用。
改了开放端口后,还需要修改web.conf,把监听的443变成18443以及一些其他配置。
web.conf
先放出配置:
# 设置 HTTP 服务器,将所有 HTTP 请求都重定向到 HTTPSserver { listen 80; server_name test.xxx.me; # 重定向所有 HTTP 请求到 HTTPS location / { return 301 https://$server_name$request_uri; } }# 设置 HTTPS 服务器server { listen 18443 ssl http2 proxy_protocol; # =======修改了这里====== server_name test.xxx.me; set_real_ip_from 127.0.0.1; # ======添加了这里======= real_ip_header proxy_protocol; # ======添加了这里====== # SSL 证书和密钥文件的路径 ssl_certificate /etc/letsencrypt/ssl/xx/fullchain.pem; # 证书文件,通常不区分扩展名,证书文件需要使用fullchain(全SSL证书链) ssl_certificate_key /etc/letsencrypt/ssl/xx/privkey.pem; # 私钥文件,通常不区分扩展名 # 可选:设置 SSL 会话缓存 ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; # 可选:设置 SSL 协议和加密算法 ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384"; # 可选:开启 OCSP Stapling,提高 SSL 握手性能 ssl_stapling on; ssl_stapling_verify on; ssl_trusted_certificate /etc/letsencrypt/ssl/xx/fullchain.pem; # 可选:设置访问日志 access_log /var/log/nginx/test.access.log; error_log /var/log/nginx/test.error.log; location / { root /usr/share/nginx/html; index index.html index.htm; } }
主要是修改了listen的配置,添加了proxy_protocol,另外添加了set_real_ip_from
和real_ip_header
。
接下来就是修改xray的配置文件了。
xray配置
主要是修改config.json文件,从原来的8443换成可,以及域名配置,详细改动如下:
{ "log": { "loglevel": "warning", "access": "/var/log/xray/access.log", "error": "/var/log/xray/error.log" }, "api": { "services": [ "HandlerService", "LoggerService", "StatsService" ], "tag": "api" }, "inbounds": [ { "listen": null, "port": 443, "protocol": "vless", "settings": { "clients": [ { "id": "0c41234a-32b6-4017-9938-4033bf26b948", "flow": "xtls-rprx-vision", "email": "reality@xray.com" } ], "decryption": "none" }, "streamSettings": { "network": "tcp", "security": "reality", "realitySettings": { "show": false, "dest": "nginx:18443", # 这里目标网站要换成我们的nginx里的地址,这里使用了容器名加ssl监听端口 "xver": 1, # 该参数我也不知道是什么意思 "serverNames": [ "test.xxx.me" # 域名就换成自己的域名 ], "privateKey": "uPPcl3v45d81DMdlojRB_ps78jrxNpT0wcG0ueOmD12", "shortIds": [ "6ba85179e30d4fc2" ] } }, "sniffing": { "enabled": true, "destOverride": [ "http", "tls" ] } } ], "outbounds": [ { "tag": "common", "protocol": "freedom" } ], "routing": { "rules": [ { "type": "field", "outboundTag": "common", "network": "udp,tcp" } ] }, "policy": { "statsInboundUplink": true, "statsInboundDownlink": true, "statsOutboundUplink": true, "statsOutboundDownlink": true }, "dns": null, "transport": null, "stats": null, "reverse": null, "fakeDns": null}
如上,改动不大,主要是dest、xver和server_name。另外需要修改xray的docker-compose.yaml,把原来的8443端口改成443端口,并重新build启动。
验证
经过上边的改变后,通过域名就可以访问到项目,并且reality也同时在监听443,代理工具的配置改成443端口,域名也改成自己的就可以正常使用了。我这里就不再贴图了。完美的实现网站和xray共存,xray也成功的偷了自己的证书。
最后祝大家都能成功配置。
参考:
未经允许不得转载:测试博客 » xray搭建reality和网站共用443端口启用网站SSL