openvpn自建记录

用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服务器上,需要为每一个独立的客户端设备生成专属的配置文件。

  1. 为特定客户端创建证书和密钥
    在服务器上,使用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:可选参数,表示不为客户端密钥设置密码,方便自动连接。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注