nginx前置sni分流sing-box
一、通过docker安装ngnix
1、安装docker和docker compose。此处使用官方一键脚本进行安装,自带compose插件。
curl -fsSL https://get.docker.com | bash -s docker
安装完成后,可检查docker和docker compose版本情况
docker version
docker compose version
2、可选择于/opt/路径下,mkdir nginx(新建nginx的目录文件),在nginx路径下使用docker compose安装,方便管理。vi docker-compose.yml 内容如下:
services:
nginx:
image: nginx:latest
container_name: nginx-stream
restart: unless-stopped
environment:
- TZ=Asia/Shanghai
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
- ./conf.d:/etc/nginx/conf.d:ro
- ./stream.conf.d:/etc/nginx/stream.conf.d:ro
- ./html:/usr/share/nginx/html
- ./ssl:/etc/nginx/ssl:ro
- ./logs:/var/log/nginx
3、同时在nginx路径下,mkdir conf.d stream.conf.d html ssl logs && touch nginx.conf
创建上面的挂载目录及文件,vi nginx.conf 写入下面的默认配置内容到nginx.conf文件内:
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /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;
}
stream {
include /etc/nginx/stream.conf.d/*.conf;
}
4、docker compose up -d (启动容器),不出意外,nginx已经正常运行。
二、自建sing-box的reality节点,监听端口50001
此处不是重点,默认已经搭建好了reality节点如下:
{
"type": "vless",
"tag": "real-in",
"listen": "::",
"listen_port": 50001,
"users": [
{
"uuid": "42a1f08a-d9ff-4aga-ac8a-cc622caf68a5",
"flow": "xtls-rprx-vision"
}
],
"tls": {
"enabled": true,
"server_name": "www.cityofrc.us",
"reality": {
"enabled": true,
"handshake": {
"server": "www.cityofrc.us",
"server_port": 443
},
"private_key": "IJ6MvrtAgMGCJdLk4JHtaRci5uAIa2SD5aNO0hsNJ9U",
"short_id": [
"4eae9cfd38fb4a7d"
]
}
}
}
三、配置nginx的stream分流配置
1、在路径/opt/nginx/stream.conf.d下,新建一个sni分流配置,vi sni.conf (名称可自定义) ,内容如下:
# 定义 SNI 分流映射表
map $ssl_preread_server_name $backend {
# 需要走 Web 服务的域名(示例域名,请按实际修改)
a.example.com web_backend;
b.example.com web_backend;
c.example.com web_backend;
# 其他域名转发到 Sing-Box
default singbox_reality_backend;
}
# 上游服务器定义
upstream web_backend {
server 127.0.0.1:444; # Web 服务新监听端口
}
upstream singbox_reality_backend {
server 172.17.0.1:50001; # Sing-Box reality 监听端口,172.17.0.1为容器桥椄的默认网关。
}
# 主监听配置 统一走443端口
server {
listen 443 reuseport;
listen [::]:443 reuseport;
proxy_pass $backend;
proxy_protocol on;
ssl_preread on;
}
注:此配置带了三个web服务可自由定义,a.example.com、 b.example.com、c.example.com,Web 服务监听端口的端口为444,可按需要配置即可。这些web服务可与reality协议复用443端口。
2、重载nginx配置
docker compose exec nginx nginx -s reload
此时,客户端的reality协议就可以改成443端口使用了,同时不影响建站的web服务使用443端口,大家都通过ngnix对sni分流实现。
