一、docker-compose.yaml文件
version: '2'
services:
openvpn:
container_name: openvpn
image: kylemanna/openvpn
volumes:
- "./data:/etc/openvpn"
ports:
- '1194:1194/udp'
cap_add:
- NET_ADMIN
restart: always
privileged: true
二、配置openvpn
mkdir data
mkdir client
# 把后面的 udp 改成自己的网址
docker-compose run --rm openvpn ovpn_genconfig -u udp://aa.bbb.com
# 生成密钥文件,随后根据提示输入密钥和CA名称
docker-compose run --rm openvpn ovpn_initpki
# 启动服务
docker-compose up -d
三、用户操作
1、添加用户
(1)、生成证书
#生成一个叫test的用户,输入密钥
docker-compose run --rm openvpn easyrsa build-client-full test nopass
# 如果生成的用户需要输入密码则把后面的nopass去掉,根据提示输入密钥和个人密码
docker-compose run --rm openvpn easyrsa build-client-full test
(2)、导出test用户证书到client文件夹里
docker-compose run --rm openvpn ovpn_getclient test > ./client/test.ovpn
2、删除用户
#删除用户证书
docker-compose run --rm openvpn easyrsa revoke user_name
#更新证书数据库
docker-compose run --rm openvpn easyrsa gen-crl update-db
#重启openvpn容器
docker-compose restart
四、配置客户端固定IP
1、修改服务端配置文件
# 进入容器外挂目录下的data文件夹,修改openvpn.conf文件,添加如下代码
client-config-dir ccd
2、添加客户端配置文件
# 进入容器外挂目录下的data/ccd文件夹
vim user_name
# 添加如下代码
ifconfig-push 192.168.255.12 192.168.255.13
# 前面是IP地址,后面是网关地址
# 或者如下设置
# ifconfig-push 192.168.255.11 192.168.255.12
注意,上面的配置在客户端是Windows系统的时候,会报告如下错误:
There is a problem in your selection of --ifconfig endpoints [local=10.8.0.8, remote=10.8.0.9]. The local and remote VPN endpoints cannot use the first or last address within a given 255.255.255.252 subnet. This is a limitation of --dev tun when used with the TAP-WIN32 driver. Try 'openvpn --show-valid-subnets' option for more info.
导致这个错误的原因是TAP-WIN32使用默认子网掩码255.255.255.252 因此一个网段之内只能有两个相邻IP,一个是网关,一个是子网设备。
这个问题在Linux/macOS系统上是不存在的,这个是TAP-WIN32驱动的限制。
因此,如果系统是Windows 并且使用TAP-WIN32驱动,那么配置的地址只能是如下情况:
ifconfig-push 192.168.255.14 192.168.255.13
# 前面是设备IP地址,后面是网关IP
# 或者如下设置:
# ifconfig-push 192.168.255.10 192.168.225.9
windows系统客户端地址池如下所示:
cc1ae9cc-cb97-4597-b285-13d6eb41547b.png优化改进
为了减少工作量,方便快速配置,可以使用如下两个增添用户的脚本。
OpenVPN 创建用户脚本:
#!/bin/bash
read -p "please your username: " NAME
OVPN_DATA="openvpn-data"
LOCALIP="IP"
docker run -v $OVPN_DATA:/etc/openvpn --rm -it kylemanna/openvpn easyrsa build-client-full $NAME nopass
docker run -v $OVPN_DATA:/etc/openvpn --rm kylemanna/openvpn ovpn_getclient $NAME > /data/openvpn/conf/"$NAME".ovpn
#修改端口(可选)
sed -i "s/$LOCALIP 1194/$LOCALIP 1194/g" /data/openvpn/conf/"$NAME".ovpn
#压缩(可选)
echo "comp-lzo" >> /data/openvpn/conf/"$NAME".ovpn
docker restart openvpn
echo "CA saved to /data/openvpn/conf/$NAME.ovpn"
OpenVPN 删除用户脚本,基于docker,需要自行改造成docker-compose:
#!/bin/bash
read -p "Delete username: " DNAME
OVPN_DATA="openvpn-data"
docker run -v $OVPN_DATA:/etc/openvpn --rm -it kylemanna/openvpn easyrsa revoke $DNAME
docker run -v $OVPN_DATA:/etc/openvpn --rm -it kylemanna/openvpn easyrsa gen-crl
docker run -v $OVPN_DATA:/etc/openvpn --rm -it kylemanna/openvpn rm -f /etc/openvpn/pki/reqs/"$DNAME".req
docker run -v $OVPN_DATA:/etc/openvpn --rm -it kylemanna/openvpn rm -f /etc/openvpn/pki/private/"$DNAME".key
docker run -v $OVPN_DATA:/etc/openvpn --rm -it kylemanna/openvpn rm -f /etc/openvpn/pki/issued/"$DNAME".crt
#删除相关用户conf(可选)
docker run -v $OVPN_DATA:/etc/openvpn --rm -it kylemanna/openvpn rm -f /data/openvpn/conf/"$DNAME"
docker restart openvpn
echo "Deleted $DNAME"
引用链接:
1、https://openvpn.net/community-resources/configuring-client-specific-rules-and-access-policies/
网友评论