基于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 | docker volume create --name $OVPN_DATA |
启动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 | route-nopull |
在.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 |
重启服务器,重连客户端
客户端
Ubuntu
安装openvpn
1 | apt -y install openvpn |
客户端和服务器会同时安装,我们不用服务器可以把它关掉
1 | service openvpn stop |
禁止openvpn服务器开启自启动
1 | systemctl disable openvpn |
用客户端配置文件在后台创建VPN连接
1 | openvpn --daemon --config CLIENTNAME.ovpn |
BTW:根据测试,同一份配置文件似乎不能在多个主机重复使用,如果使用会造成两边连接频繁断开。