OpenVPN系列 - Docker快速部署
容器化部署
初始化配置与启动服务
- 创建docker-compose.yaml
services:
openvpn:
#network_mode: "host"
cap_add:
- NET_ADMIN
#image: kylemanna/openvpn:latest
image: registry.cn-shenzhen.aliyuncs.com/shuhui/openvpn:latest
container_name: openvpn
ports:
- "1194:1194/udp"
restart: always
volumes:
- ./config:/etc/openvpn
创建配置文件
# docker-compose run --rm openvpn ovpn_genconfig -D -b -d -N -u udp://vpn.vqiu.top
更多选项:
-2 Enable two factor authentication using Google Authenticator.
-a Authenticate packets with HMAC using the given message digest algorithm (auth).
-b Disable 'push block-outside-dns'
-c Enable client-to-client option
-C A list of allowable TLS ciphers delimited by a colon (cipher).
-d Disable default route
-D Do not push dns servers
-k Set keepalive. Default: '10 60'
-m Set client MTU"
-N Configure NAT to access external server network
-t Use TAP device (instead of TUN device)
-T Encrypt packets with the given cipher algorithm instead of the default one (tls-cipher).
-z Enable comp-lzo compression.
初始化证书
docker-compose run --rm openvpn ovpn_initpki
OpenVPN服务启动
# docker-compose up -d openvpn
创建用户
- 为新用户创建证书
# export CLIENTNAME="zhang3" // 注意不能使用中文
# cd /data/compose/openvpn
# docker-compose run --rm openvpn easyrsa build-client-full $CLIENTNAME
Using SSL: openssl OpenSSL 1.1.1g 21 Apr 20205
Generating a RSA private key
......+++++
.........................+++++
writing new private key to '/etc/openvpn/pki/easy-rsa-1.aaFolb/tmp.HgLPLj'
Enter PEM pass phrase: //输入证书密码
Verifying - Enter PEM pass phrase: //再次输入证书密码
-----
Using configuration from /etc/openvpn/pki/easy-rsa-1.aaFolb/tmp.akmcfm
Enter pass phrase for /etc/openvpn/pki/private/ca.key: //输入密码:vqiu..123 (不含引号)
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName :ASN.1 12:'zhang3'
Certificate is to be certified until Sep 10 16:11:31 2026 GMT (825 days)
Write out database with 1 new entries
Data Base Updated
- 生成证书
docker-compose run --rm openvpn ovpn_getclient $CLIENTNAME > $CLIENTNAME.ovpn
- 查看生成的证书
# ls $CLIENTNAME
zhang3.ovpn
Tips: 妥善保管好该文件
使用OTP 场景
// 初始化
# docker-compose run --rm openvpn ovpn_genconfig -2 -D -b -d -N -u udp://vpn.vqiu.top
// 创建客户端证书
# export CLIENTNAME=zhang3
# docker-compose run --rm openvpn easyrsa build-client-full $CLIENTNAME nopass
//关联OTP
# docker-compose run --rm -it openvpn ovpn_otp_user $CLIENTNAME
使用Google身份验证器扫描终端中的二维码
或
// 或者更为精细OTP
# docker-compose run --rm -it openvpn bash
bash-5.0# google-authenticator --time-based --disallow-reuse --force --rate-limit=3 --rate-time=30 --window-size=3 -l "zhang3@vpn.you-qin.com" -s /etc/openvpn/otp/zhang3.google_authenticator
// 测试
# docker-compose run --rm -it openvpn bash
bash-5.0# pamtester -v openvpn zhang3 authenticate
pamtester: invoking pam_start(openvpn, zhang3, ...)
pamtester: performing operation - authenticate
Verification code:
openvpn(pam_google_authenticato[9]: Accepted google_authenticator for zhang3
pamtester: successfully authenticated
运维场景
注销用户
当用户文件泄露或者该用户离职时,可以使用以下方式来注销。
- 吊销证书
# export CLIENTNAME=zhang3
# cd /data/compose/openvpn && docker-compose run --rm openvpn ovpn_revokeclient $CLIENTNAME
- 删除证书文件[可选]
# docker-compose run --rm openvpn ovpn_revokeclient $CLIENTNAME remove
查看当前用户列表
# docker-compose run --rm openvpn ovpn_listclients
针对某个用户推送特定的路由
在 OpenVPN 服务器配置文件(server.conf
)中,添加以下指令以启用 CCD(Client Config Directory):
client-config-dir /etc/openvpn/ccd
创建ccd目录
mkdir -pv /etc/openvpn/ccd
在 ccd
目录下为需要推送特定路由的用户创建一个配置文件,文件名需与用户的 Common Name(证书名称)一致。例如,用户名为 user1
,则创建文件 /etc/openvpn/ccd/zhang3
。
push "route 10.10.0.0 255.255.255.0"
这样,当 zhang3
连接到 VPN 时,会收到上述路由,使其能够访问指定的网络。
注意ccd目录的访问权限,建议配置成0755
为用户分配固定 IP[可选]
如果需要为用户分配固定 IP,可以在用户配置文件中使用 ifconfig-push
指令。例如:
ifconfig-push 192.168.255.110 192.168.255.111
#ifconfig-push 192.168.255.110 255.255.255.0 //subnet模式
192.168.255.110
是分配给客户端的固定 IP 地址,192.168.255.111
是服务器端的对等地址。
验证