用docker自建VPN,在此记录下过程:
提前配置好docker镜像源,多配置几个以便成功拉取镜像
# 创建数据目录 OVPN_DATA="/opt/openvpn-data" sudo mkdir -p $OVPN_DATA # 拉取镜像 sudo docker pull kylemanna/openvpn # 初始化配置。将 `vpn.example.com` 替换为你的公网服务器IP或域名。 sudo docker run -v $OVPN_DATA:/etc/openvpn --rm kylemanna/openvpn ovpn_genconfig -u udp://vpn.example.com # 生成证书和密钥。此命令会交互式地要求你设置CA密码和服务器端证书信息。 sudo docker run -v $OVPN_DATA:/etc/openvpn --rm -it kylemanna/openvpn ovpn_initpki
挂载数据卷 OVPN_DATA="open-data" docker volume create --name $OVPN_DATA 列出数据卷 docker volume ls 查看数据卷存储文职 docker volume inspect <卷名>
在执行 ovpn_initpki 时,请务必记住设置的 CA 密码,并为服务器证书使用一个易识别的通用名(如 server)。
sudo docker run -d \ --name openvpn-server \ --restart unless-stopped \ -v $OVPN_DATA:/etc/openvpn \ -p 1194:1194/udp \ --cap-add=NET_ADMIN \ kylemanna/openvpn
# 生成客户端证书密钥对。将 `client-internal` 替换为你为内网服务器起的名字。 sudo docker run -v $OVPN_DATA:/etc/openvpn --rm -it kylemanna/openvpn easyrsa build-client-full client-internal nopass # 将客户端配置导出为一个独立的 .ovpn 文件 sudo docker run -v $OVPN_DATA:/etc/openvpn --rm kylemanna/openvpn ovpn_getclient client-internal > client-internal.ovpn
内网服务器直接使用old-pc-client.ovpn加载到客户端配置文件来启动容器
docker run -d \ --name openvpn-client \ --network=host \ --restart unless-stopped \ --cap-add=NET_ADMIN \ --device /dev/net/tun \ -v /home/user/vpn/old-pc-client.ovpn:/client.ovpn:ro \ kylemanna/openvpn \ openvpn --config /client.ovpn
关键修改说明:
- 挂载路径与文件名:将配置文件挂载到一个任意的容器内路径(如
/client.ovpn),而不是服务端默认的/etc/openvpn/目录下,以避免触发服务端的初始化脚本。 - 启动命令:在镜像名
kylemanna/openvpn之后,显式指定了容器的启动命令为openvpn --config /client.ovpn。这直接调用openvpn二进制程序,并告诉它使用您挂载的配置文件,从而绕过了会报错的ovpn_run脚本。
启动后,查看容器日志以确认连接成功
docker logs openvpn-client
如果连接成功,将在日志末尾看到 Initialization Sequence Completed 的提示。
服务器为公网客户端生成配置文件
在公网VPN服务器上,需要为每一个独立的客户端设备生成专属的配置文件。
- 为特定客户端创建证书和密钥
在服务器上,使用Docker命令为新的客户端(例如名为user-laptop)生成证书和密钥
# 为客户端生成证书和密钥对 docker run -v ovpn-data:/etc/openvpn --rm -it kylemanna/openvpn easyrsa build-client-full user-laptop nopass # 将客户端配置导出为独立的 .ovpn 文件 docker run -v ovpn-data:/etc/openvpn --rm kylemanna/openvpn ovpn_getclient user-laptop > user-laptop.ovpn
user-laptop:客户端的名称,可自定义,用于标识设备。nopass:可选参数,表示不为客户端密钥设置密码,方便自动连接。