oldme 博客

斧子要先扬到头顶,劈下才有力度

Docker 部署 V2Ray 伪装

oldme create: 2023-02-11

通过 Docker 部署 Nginx + V2Ray 伪装,简单的写了使用 Docker 来部署 V2Ray 伪装服务端,使用的协议是 VLESS。本文非新手向,开始之前你需要先了解一些基本的概念与操作:Nginx,V2ray。

Docker

Cenots 服务器安装 Docker:

1. 添加 Docker 源
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

2. 安装 Docker
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Ubutun/Debian 安装Docker:

1. 添加 Docker 官方 GPG key
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

2. apt 源更新
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update

3. 安装 Docker
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

检查 Docker 是否安装成功:

// 查看 Docker 版本
docker -v

Docker 加入开机自启动:

systemctl enable docker

Docker 启动:

systemctl start docker

Docker 基本命令:

下面命令 name 代表容器名称

启动容器
docker start name

停止容器
docker stop name

删除容器
docker rm name

查看容器的最近30行日志
docker logs --tail 30 name

查看运行中的容器
docker ps

查看所有的容器
docker ps -a

Docker-Compose

Docker V2 版本已经使用 Go 重写了 Compose 并且将其作为 docker cli 的子命令,你可以在安装 docker 后直接使用 docker compose version 查看它的版本,如果有版本号,则不需要额外安装,否则,请继续安装 docker-compose:

安装 Docker-Compose 用作管理 Docker 容器的工具:

curl -L https://github.com/docker/compose/releases/download/v2.14.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

chmod +x /usr/local/bin/docker-compose

如果访问不了 GitHub,可以在网上搜一下镜像站使之下载成功。

如果想要安装其他版本的 Docker,请替换v2.14.2。运行查看版本命令,如果出现版本号,即安装成功:

docker-compose -v

部署前须知

自设立防火墙后,技术干扰一步一步演变进步。简简单单的VPN技术已经可以被防火墙精确识别并干扰。伪装的 V2Ray 以常见的 HTTPS/TLS 包装,这样可以大大降低防火墙发现的可能性。当然,最近笔者使用 V2Ray 伪装也碰见了封端口的情况,这种情况下最好不要更换新的端口,防止被防火墙进一步封IP。等待一段时间后,端口一般会被放出。如果迫切使用,可以使用 Cloudflare 代理域名。

在部署前,请先准备一个域名和该域名的 Pem 格式的证书。

运行容器

建立以下目录:

  • /home/docker/nginx
  • /home/docker/v2ray

进入 /home/docker 目录下,建立 docker-compose.yml 文件:

version: "3"

services:
    nginx:
        image: "nginx"
        container_name: "nginx"
        restart: "always"
        ports:
            - "80:80"  # 可以选择是否对外暴露80端口
            - "443:443"
        volumes:
            - "nginx_conf:/etc/nginx"
        depends_on:
            - v2ray
    v2ray:
        image: "teddysun/v2ray"
        container_name: "v2ray"
        volumes:
            - "v2ray_conf:/etc/v2ray"

volumes:
    nginx_conf:
        driver: local
        driver_opts:
            type: "none"
            o: "bind"
            device: "/home/docker/nginx"
    v2ray_conf:
        driver: local
        driver_opts:
            type: "none"
            o: "bind"
            device: "/home/docker/v2ray"

然后运行以下命令:

docer compose up -d
或者
docker-compose up -d

等待容器建立成功后,即可使用 docker -ps 命令看见两个正在运行的容器:

Nginx 配置

打开 /home/docker/nginx 的目录,新建一个 ssl 目录,将已经准备的好的证书放进去,即一个 .pem 文件和一个 .key 文件。

打开 /home/docker/nginx 的目录,编辑 nginx.conf 文件,在 http 模块中新增一个服务:

server {
    listen 443 ssl;
    server_name 你的域名;
    charset utf-8;

    ssl_protocols TLSv1.2;
    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;
    ssl_prefer_server_ciphers off;

    ssl_certificate ssl/你的pem文件名称;
    ssl_certificate_key ssl/你的key文件名称;
}

V2Ray 配置

我们这里采用 VLESS 协议,这里给出基本的 VLESS 配置,如果需要更多配置,可以访问:https://github.com/v2fly/v2ray-examples

建立 /home/docker/v2ray/config.json 文件:

{
  "inbounds": [{
    "port": 9999, // 这里的端口会交给内网的 Nginx 处理,无需暴露在公网上
    "listen": "0.0.0.0",
    "protocol": "vless",
    "settings": {
      "clients": [
        {
          "id": "39107bf3-1760-41f9-a8a2-5b40dfef8c75", // 用户id,可以随机生成填写
          "level": 0
        }
      ],
      "decryption": "none"
    },
    "streamSettings": {
      "network": "ws",
      "security": "none",
      "wsSettings": {
        "path": "/about" // 该路径可以随便填写,一会需要在 Nginx 配置它。最好不要写的很奇怪,伪装成一个正常网站访问的地址即可
      }
    }
  }],
  "outbounds": [{
    "protocol": "freedom"
  }]
}

V2Ray 配置编写完成后在 Nginx 中添加一个反向代理,代理到刚刚 V2Ray 里面的路径,nginx.conf

server {
    listen 443 ssl;
    server_name 你的域名;
    charset utf-8;

    ssl_protocols TLSv1.2;
    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;
    ssl_prefer_server_ciphers off;

    ssl_certificate ssl/你的pem文件名称;
    ssl_certificate_key ssl/你的key文件名称;

    // 配置如下反向代理,/about填写刚刚的路径
    location /about{
            proxy_redirect off;
            proxy_pass http://v2ray:9999; // Docker 容器在同一内网下可以使用 Docker 容器名访问
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

配置完成后重启两个容器:

docker restart nginx v2ray

这个时候访问 https://你的域名/about 可以看到 Bad Request,代表部署成功。

后续更新

2024-06-19

VLESS 协议已经在最新版的 V2ray 中废弃,建议采用 TrojanTrojanVLESS 大同小异,不同的是,Trojan 可以脱离 Nginx 而单独运行,想查看关于 Trojan 协议的部署,可以参考作者的另一篇博客:Docker 部署 Nginx+Trojan+V2ray

评论

欢迎您的回复 取消回复

您的邮箱不会显示出来,*必填

本文目录