Docker 部署 V2Ray 伪装
通过 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
中废弃,建议采用 Trojan
。Trojan
和 VLESS
大同小异,不同的是,Trojan
可以脱离 Nginx
而单独运行,想查看关于 Trojan
协议的部署,可以参考作者的另一篇博客:Docker 部署 Nginx+Trojan+V2ray
本文目录