基于Docker搭建OpenVPN服务器

之前在公司内网搭建了PPTPD服务器解决疫情期间远程办公从家里连接公司内网服务器的问题,但一直不太稳定,平时随便用用还行,偶尔断开可以重连,一直想换个方式搭建,之前尝试过其他搭建方式没有成功,后来恢复线下办公后需求不强了就没有继续尝试,今天发现在Ubuntu系统下基于Docker搭建相对简单,于是记录下来

使用Docker Hub上的kylemanna/openvpn镜像

kylemanna/openvpn - Docker Image | Docker Hub

拉取镜像

1
docker pull kylemanna/openvpn

设置卷名环境变量

取一个名称用来创建用于存放openvpn数据的docker volume,建议用ovpn-data-前缀,后面的example换成自己取的

1
OVPN_DATA="ovpn-data-example"

初始化数据

VPN.SERVERNAME.COM换成自己的IP地址或域名

1
2
3
docker volume create --name $OVPN_DATA
docker run -v $OVPN_DATA:/etc/openvpn --rm kylemanna/openvpn ovpn_genconfig -u udp://VPN.SERVERNAME.COM
docker run -v $OVPN_DATA:/etc/openvpn --rm -it kylemanna/openvpn ovpn_initpki

启动OpenVPN服务器

1
docker run --name=openvpn -v $OVPN_DATA:/etc/openvpn -d -p 1194:1194/udp --cap-add=NET_ADMIN kylemanna/openvpn

生成不带密码的客户端证书

CLIENTNAME换成自定义的客户端标识,可以取形如USERNAME@SERVERNAME方便管理

1
docker run -v $OVPN_DATA:/etc/openvpn --rm -it kylemanna/openvpn easyrsa build-client-full CLIENTNAME nopass

导出包含证书的客户端配置文件

CLIENTNAME同样换成自定义的客户端标识,导出为当前目录的CLIENTNAME.ovpn文件

1
docker run -v $OVPN_DATA:/etc/openvpn --rm kylemanna/openvpn ovpn_getclient CLIENTNAME > CLIENTNAME.ovpn

如果服务器端口做过NAT映射,可以打开CLIENTNAME.ovpn修改其中的端口号

作废客户端证书

先查看openvpn数据卷的所在位置

1
docker volume inspect ovpn-data-example

删除文件

1
rm ***/_data/pki/private/CLIENTNAME.key

编辑

1
vim ***/_data/pki/index.txt

删除CLIENTNAME所在的行

取消全局代理

默认配置会将全部对外流量通过VPN,如果想要指定仅访问公司局域网时走VPN,其他流量走默认路由不变,可以通过在.ovpn配置文件中追加

1
2
3
4
5
route-nopull
route-metric 150
route remote_host 255.255.255.255 net_gateway
route 172.19.0.0 255.255.0.0 net_gateway
route 192.168.1.0 255.255.0.0 vpn_gateway

.ovpn配置文件的结尾找到

1
# redirect-gateway def1

注释掉这一行

其中route-nopull表示不接受服务器对于修改路由表的推送,而可以按照我们之后指定的规则去修改。

我所在的内网网段是172.19.0.0/16,所以明确指定路由,走net_gateway,也就是原有网关。

192.168.1.0/24是需要走VPN的,所以也明确指定了路由,走vpn_gateway。

redirect-gateway def1作用是将默认网关重定向到 VPN 服务器上,所以要注释掉。

修改服务器配置

<openvpn容器卷路径>/_data/openvpn.conf

1
#push "block-outside-dns"

<openvpn容器卷路径>/_data/ovpn_env.sh

1
declare -x OVPN_DISABLE_PUSH_BLOCK_DNS=1

重启服务器,重连客户端

客户端

Windows 7

Windows 10

macOS v2

macOS v3

Ubuntu

安装openvpn

1
apt -y install openvpn

客户端和服务器会同时安装,我们不用服务器可以把它关掉

1
service openvpn stop

禁止openvpn服务器开启自启动

1
systemctl disable openvpn

用客户端配置文件在后台创建VPN连接

1
openvpn --daemon --config CLIENTNAME.ovpn

BTW:根据测试,同一份配置文件似乎不能在多个主机重复使用,如果使用会造成两边连接频繁断开。