|

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分流实现。

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注