4 min read

OpenVPN系列 - Docker快速部署

OpenVPN系列 - Docker快速部署

容器化部署

初始化配置与启动服务

  1. 创建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

创建用户

  1. 为新用户创建证书
# 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
  1. 生成证书
docker-compose run --rm openvpn ovpn_getclient $CLIENTNAME > $CLIENTNAME.ovpn
  1. 查看生成的证书
# 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

运维场景

注销用户

当用户文件泄露或者该用户离职时,可以使用以下方式来注销。

  1. 吊销证书
# export CLIENTNAME=zhang3
# cd /data/compose/openvpn && docker-compose run --rm openvpn ovpn_revokeclient $CLIENTNAME
  1. 删除证书文件[可选]
# 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 是服务器端的对等地址。

验证

参考引用