Docker v2ray + caddy

Coorpee
7 min readMay 12, 2020

--

说明

我也是个半吊子,这篇只是我成功了的配置,可以作参考。

到今年5月份之前我都是用ssr的,也还算稳定,只是想尝试下v2ray,稍微了解下tls和web之类的东西。只用docker的v2ray配置起来还是很方便的,就加了个caddy竟然花了一下午。

这就是兴趣吧

我使用的配置

  • VPS: Vultr Cloud Instance Tokyo
  • System: Centos7
  • 客户端:一台win10笔记本

官方参考文档

Project V

前言

caddy - Docker Hub

准备

  • 服务器端安装docker 和 docker-compose
  • 域名并解析到vps的ip
  • 客户端(win10推荐Qv2ray,v2rayN)

docker-compose运行的目录层级,带/ 的是目录需要创建

.
├── Caddyfile
├── config/
├── data/
├── docker-compose.yml
├── log/
│ ├── caddy/
│ └── v2ray/
└── config.json
mkdir -p config data log/caddy log/v2ray

后面将介绍Caddyfile config.json docker-compose.yml 三个文件,他们当中要修改的部分

  • $port 两个容器通信的端口
  • your.domain 你购买的域名
  • your@email 申请证书用的邮箱
  • $uuid 相当于密码,服务端客户端需一致
    可以通过v2ray客户端生成v2ctl.exe uuid ,也可以用其他工具生成

对于centos7还需要开放https/http防火墙

sudo firewall-cmd --zone=public --permanent --add-service=https
sudo firewall-cmd --reload
sudo firewall-cmd --list-all

看到service 有显示https字样就完成了。参考

How To Set Up a Firewall Using FirewallD on CentOS 7 | DigitalOcean

Caddyfile — Caddy的配置文件

your.domain
{
log {
output file /var/log/caddy/caddy.log
}
tls your@email
@websockets {
header Connection Upgrade
header Upgrade websocket
}
reverse_proxy @websockets v2ray://v2ray:$port
}

首先用Caddy是因为小小调研了下后发现Caddy可以自动申请和更新证书很方便,因而配置文件相比nginx也简单

WebSocket+TLS+Web

上面教程上的Caddy文件是Caddy1,我使用的image是Caddy2所以有所不同,比如proxy 条目在Caddy2中就没有了,参考下面

V2 — adapt unrecognized directive: proxy - moving from Caddy v1

@websockets的写法是参照社区中的回复而来

Unrecognized subdirective websocket

Caddy V2 how to proxy websoket (v2ray websocket + tls)

关于v2ray://v2ray:$port ,这是Docker-compose中访问另一个容器端口的写法(log中可以看到访问的是172.开头的本地ip),如果Caddy报dial tcp : connect: connection refused之类的错误很可能是这儿出的问题。V2ray容器的本地监听端口是在容器内部的而不是物理主机的端口,而Docker-compose默认支持一个service通过service名称访问另一个service。见下篇Links章节

Networking in Compose

关于docker网络

Connection refused? Docker networking and how it impacts your image

config.json — v2ray配置文件

{
"log": {
"loglevel": "warning",
"access": "/var/log/v2ray/access.log",
"error": "/var/log/v2ray/error.log"
},
"inbounds": [
{
"port": $port,
//"listen":"127.0.0.1",//只监听 127.0.0.1,避免除本机外的机器探测到开放了 10000 端口
"protocol": "vmess",
"settings": {
"clients": [
{
"id": "$uuid",
"alterId": 64
}
]
},
"streamSettings": {
"network": "ws",
"wsSettings": {
"path": "/$uuid"
}
}
}
],
"outbounds": [
{
"protocol": "freedom",
"settings": {}
}
]
}

大致就是官方教程Websocket+tls+Web 一节中给出的服务端配置,这里一个区别是由于是在Docker中使用V2ray,不需要"listen":"127.0.0.1" ,因为容器的端口本身就是隐蔽的。而且由于防火墙也没有开放$port 端口,外界是无法访问的。

"path": "/$uuid" 这里看很多文章都提到或者下面文章就直接使用$uuid 作路径(注意这是路径前面有/ ),可能有安全之类的原因,我不清楚

A-Docker-V2ray+WebSocket+TLS+Web.md

Docker-compose.yml

version: '3'services:
v2ray:
image: v2ray/official
container_name: v2ray
volumes:
- ./config.json:/etc/v2ray/config.json
- ./log/v2ray:/var/log/v2ray
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
expose:
- "$port"
caddy:
image: caddy
container_name: caddy
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- ./data:/data
- ./log/caddy:/var/log/caddy
- ./config:/config
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
ports:
- "443:443"

expose 这个条目就是声明了v2ray service监听的本地端口

volume 中最后两个条目是让容器内时间和物理主机一致,方便查看log文件

container_name 这个写不写无所谓

使用

docker-compose up

在当前目录下运行即可,建议一开始不加-d 参数,可以直接看到错误信息然后及时调试,等调试好了再直接后台

客户端以v2rayN为例,就直接按上文的config.json 填就行了。protocolws ,路径框里填上之前设置的/$uuid 就行,allowInsecure最好选否

v2rayN的配置界面

其他阅读和参考

基于v2ray的websocket+tls+web实现安全网络代理

Docker快速部署v2ray翻墙

--

--