OpenVpn搭建
本文将详细介绍如何在一台 CentOS 服务器上从零开始搭建 OpenVPN 服务,包括服务端配置、客户端配置、高级功能以及常见问题排查。
前置要求:网络环境
在开始之前,请确保您的 OpenVPN 服务器满足以下网络条件之一:
- 拥有公网 IP 地址: 这是最常见的部署方式。服务器可以通过互联网被任何地方的客户端访问。
- 与所有客户端位于同一局域网: 如果您只在内部网络(例如家庭或办公室)使用 VPN,请确保服务器和所有客户端设备都连接到同一个局域网,并且网络内部没有防火墙或路由策略阻止它们之间的通信。
简而言之,所有客户端必须能够通过网络访问到您的 OpenVPN 服务器,否则连接将无法建立。
1. 环境准备:安装 OpenVPN 和 Easy-RSA
首先,我们需要在 CentOS 服务器上安装 openvpn 和 easy-rsa。
# 步骤1: 安装 EPEL (Extra Packages for Enterprise Linux) 源
# 如果安装失败,请尝试更换为国内镜像源。
yum -y install epel-release
# 步骤2: 安装 OpenVPN 和 Easy-RSA
yum -y install openvpn easy-rsa默认情况下,easy-rsa 的文件位于 /usr/share/easy-rsa/。为了方便管理,我们将其复制到 OpenVPN 的配置目录下。
# 创建 easy-rsa 目录并复制文件
mkdir -p /etc/openvpn/easy-rsa
cp -r /usr/share/easy-rsa/3/* /etc/openvpn/easy-rsa/复制完成后,/etc/openvpn/ 目录下的结构如下图所示:

2. 生成证书和密钥
进入 easy-rsa 工作目录,开始我们的证书生成工作。
cd /etc/openvpn/easy-rsa/2.1 初始化 PKI 并创建 CA
在生成证书之前,我们先将 vars.example 示例文件复制一份名为 vars,进行修改。
cp vars.example vars现在,您可以按需修改 vars 文件来配置证书的默认有效期等信息。

接下来,初始化公钥基础设施 (PKI) 并创建一个新的证书颁发机构 (CA)。
# 1. 初始化 PKI
# 这会创建一个新的 pki 目录
./easyrsa init-pki
# 2. 创建 CA 证书
# nopass 选项表示不为 CA 私钥设置密码,方便自动启动
# 您会被要求输入一个通用名称 (Common Name),例如 "My-VPN-CA"
./easyrsa build-ca nopass创建 CA 证书的过程如下图所示:

2.2 生成服务端证书和密钥
现在,为 OpenVPN 服务器生成证书和私钥。
# 1. 生成服务端证书请求
# Common Name 建议使用 "server",同样不设置密码
./easyrsa gen-req server nopass创建服务端证书请求的过程如下图所示:

# 2. 为服务端证书签名
# 您需要输入 "yes" 来确认签名
./easyrsa sign-req server server
# 3. 生成 Diffie-Hellman 参数
# 这个过程可能需要几分钟。如果报错,可以尝试 `openssl dhparam -out dh2048.pem 2048`
./easyrsa gen-dh
# 4. 生成 TLS 认证密钥
# 用于防御 DoS、UDP 端口扫描等攻击
openvpn --genkey --secret ta.key2.3 生成客户端证书和密钥
以 client1 为例,为第一个客户端生成证书。如果您有多个客户端,重复此步骤即可(只需更改 client1 为 client2 等)。
# 1. 生成客户端证书请求 (client1 是客户端名称)
./easyrsa gen-req client1 nopass
# 2. 为客户端证书签名 (输入 'yes' 确认)
./easyrsa sign-req client client13. 配置 OpenVPN 服务端
3.1 整理证书文件
为了方便管理,我们创建一个 server 目录,将所有服务端需要用到的证书和密钥文件统一存放到此处。
# 1. 创建服务端密钥存放目录
mkdir -p /etc/openvpn/server
# 2. 从 easy-rsa 的工作目录中复制所需文件
cp pki/ca.crt /etc/openvpn/server/
cp pki/issued/server.crt /etc/openvpn/server/
cp pki/private/server.key /etc/openvpn/server/
cp pki/dh.pem /etc/openvpn/server/
cp ta.key /etc/openvpn/server/复制完成后,/etc/openvpn/server/ 目录下的文件结构应如下图所示:

3.2 编写服务端配置文件 (server.conf)
创建并编辑 /etc/openvpn/server.conf 文件。下面是一个推荐的配置模板,其路径已全部指向我们上一步创建的 server 目录。

#【基本配置】
port 1194 # 监听的端口
proto udp # 使用 UDP 协议
dev tun # 创建一个 TUN 隧道设备
#【证书和密钥路径】(已指向 /etc/openvpn/server/)
ca /etc/openvpn/server/ca.crt # CA 根证书
cert /etc/openvpn/server/server.crt # 服务端证书
key /etc/openvpn/server/server.key # 服务端私钥
dh /etc/openvpn/server/dh.pem # Diffie-Hellman 参数
tls-auth /etc/openvpn/server/ta.key 0 # TLS 认证密钥,0 表示服务端
#【VPN 网络配置】
server 10.8.0.0 255.255.255.0 # 分配给客户端的虚拟 IP 地址池
push "redirect-gateway def1 bypass-dhcp" # 强制客户端所有流量通过 VPN
push "dhcp-option DNS 8.8.8.8" # 向客户端推送 DNS 服务器地址
#【其他推荐配置】
client-to-client # 允许客户端之间互相访问
keepalive 10 120 # 每 10 秒 ping 一次,120 秒未收到响应则认为断线
cipher AES-256-GCM # 数据通道加密算法
auth SHA256 # HMAC 签名算法
compress lz4-v2 # 启用 lz4-v2 压缩
push "compress lz4-v2" # 向客户端推送压缩选项
user nobody # 以 nobody 用户运行
group nobody # 以 nobody 组运行
persist-key # 重启时保持密钥不重新读取
persist-tun # 重启时保持隧道设备开启
status /var/log/openvpn-status.log # 状态日志文件
log-append /var/log/openvpn.log # 追加模式的日志文件
verb 3 # 日志详细级别 (3 是一个比较合适的级别)
client-config-dir /etc/openvpn/ccd # 客户端特定配置文件的目录 (用于静态 IP 分配等)4. 配置网络并启动服务
4.1 配置网络与防火墙
为了让 VPN 客户端能够通过服务器访问互联网,我们需要启用 IP 转发并配置防火墙。
# 1. 启用内核 IP 转发
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p
# 2. 配置 firewalld 防火墙
# 开放 OpenVPN 的 1194/udp 端口
firewall-cmd --zone=public --add-port=1194/udp --permanent
# 开启 NAT 转发 (Masquerade)
firewall-cmd --zone=public --add-masquerade --permanent
# 重新加载防火墙规则使其生效
firewall-cmd --reload4.2 启动并验证 OpenVPN 服务
完成以上所有配置后,我们现在可以启动 OpenVPN 服务并验证其运行状态。
# 1. 启动 OpenVPN 服务
# 这里的 `server` 对应的是配置文件名 `server.conf`
systemctl start openvpn-server@server
# 2. 查看服务状态,确保服务已成功启动且无错误
systemctl status openvpn-server@server
# 3. 设置开机自启
systemctl enable openvpn-server@server如果服务启动失败,您可以通过 journalctl -xe 或检查 /var/log/openvpn.log 文件来排查问题。
提示:手动启动命令 (用于调试)
除了使用
systemctl,您也可以在调试时通过以下命令手动启动 OpenVPN 服务,以便直接观察输出。# 以后台守护进程方式启动 (私钥无密码) openvpn --daemon --config /etc/openvpn/server.conf # 如果私钥有密码,启动时会提示输入 openvpn --daemon --askpass --config /etc/openvpn/server.conf # 也可以直接指定密码文件 (需先按 6.3 节创建密码文件) openvpn --daemon --askpass /etc/openvpn/server/pass.key --config /etc/openvpn/server.conf
5. 配置 OpenVPN 客户端
5.1 编写客户端配置文件 (.ovpn)(Windows)
在您的本地电脑上创建一个 .ovpn 文件(例如 client1.ovpn),并将以下模板内容复制进去。您需要将服务器上的证书内容手动嵌入其中。
client
dev tun
proto udp
# 将 YOUR_SERVER_IP 替换为你的服务器公网 IP 地址
remote YOUR_SERVER_IP 1194
resolv-retry infinite
nobind
persist-key
persist-tun
cipher AES-256-GCM
auth SHA256
compress lz4-v2
verb 3
<ca>
# 在此处粘贴服务器上 /etc/openvpn/easy-rsa/pki/ca.crt 文件的内容
</ca>
<cert>
# 在此处粘贴服务器上 /etc/openvpn/easy-rsa/pki/issued/client1.crt 文件的内容
</cert>
<key>
# 在此处粘贴服务器上 /etc/openvpn/easy-rsa/pki/private/client1.key 文件的内容
</key>
<tls-auth>
# 在此处粘贴服务器上 /etc/openvpn/easy-rsa/ta.key 文件的内容
</tls-auth>
# 客户端方向为 1
key-direction 15.2 导入配置并连接
将编辑好的 .ovpn 文件导入到您的 OpenVPN 客户端(例如 Windows 的 OpenVPN GUI 或 macOS 的 Tunnelblick),然后发起连接即可。
6. 高级配置 (可选)
6.1 为客户端分配静态 IP
如果你希望某个客户端(例如 client1)每次连接时都获得相同的固定 IP 地址,可以按以下步骤操作:
确保
server.conf中已启用client-config-dir确保
server.conf中包含client-config-dir /etc/openvpn/ccd这一行。创建
ccd目录mkdir -p /etc/openvpn/ccd为客户端创建配置文件
在
ccd目录下,创建一个与客户端证书名完全相同的文件(例如client1),并根据你的网络拓扑写入以下内容,为其分配一个静态 IP。如果
server.conf中topology为subnet(默认推荐):# 文件路径: /etc/openvpn/ccd/client1 ifconfig-push 10.8.0.10 255.255.255.0如果
topology为net30:# 文件路径: /etc/openvpn/ccd/client1 ifconfig-push 10.8.0.10 10.8.0.9
配置完成后,当名为
client1的客户端连接时,OpenVPN 会自动为其分配指定的 IP 地址。
自启密码配置文件运行成功图
6.2 客户端之间互通
如果希望连接到同一 VPN 的不同客户端能够互相访问(例如,进行内网联机游戏或文件共享),只需取消 server.conf 文件中 client-to-client 这一行的注释即可。
# server.conf
client-to-client修改配置后,不要忘记重启 OpenVPN 服务:
systemctl restart openvpn-server@server6.3 密码保护私钥的自动启动
如果在生成服务端私钥 (server.key) 时设置了密码,OpenVPN 服务在开机自启时会因为等待密码输入而失败。为了实现无人值守的自动启动,可以按以下步骤操作:
创建密码文件
创建一个只包含私钥密码的文本文件。
# 将 your_password 替换为您的真实私钥密码 echo "your_password" > /etc/openvpn/server/pass.key # 设置严格的权限,确保只有 root 用户可读 chmod 600 /etc/openvpn/server/pass.key修改服务端配置
在
server.conf文件中,添加askpass指令,指向我们刚刚创建的密码文件。# server.conf askpass /etc/openvpn/server/pass.key
完成以上配置后,OpenVPN 服务就可以在启动时自动读取密码,从而实现无人值守的自启。
7. 常见问题排查 (FAQ)
Q1: OpenVPN 服务启动失败怎么办?
- A1: 首先检查服务日志。使用
systemctl status openvpn-server@server和journalctl -xe查看简要错误。然后,详细阅读 OpenVPN 的日志文件/var/log/openvpn.log,里面通常会记录具体的配置错误,例如文件路径不正确、权限问题或配置项拼写错误。
Q2: 客户端可以连接,但无法访问互联网?
- A2: 这通常是防火墙或内核转发问题。
- 检查 IP 转发: 运行
cat /proc/sys/net/ipv4/ip_forward,确保输出为1。如果不是,请重新执行sysctl -p命令。 - 检查防火墙规则: 运行
firewall-cmd --list-all,确保masquerade设置为yes,并且1194/udp端口已在publiczone 中打开。
- 检查 IP 转发: 运行
Q3: 在 gen-dh 步骤卡住或报错?
- A3:
gen-dh会消耗大量系统熵,在某些虚拟机上可能很慢。如果长时间卡住,可以尝试使用openssl命令直接生成:openssl dhparam -out /etc/openvpn/server/dh.pem 2048。
Q4: 客户端日志中出现 AUTH_FAILED 错误?
- A4: 这个错误通常与
tls-auth密钥有关。- 检查密钥是否一致: 确保客户端
.ovpn文件中的<tls-auth>块内容与服务器上/etc/openvpn/server/ta.key的内容完全一致。 - 检查
key-direction: 确保服务端server.conf中tls-auth的方向是0,客户端.ovpn文件中的key-direction是1。
- 检查密钥是否一致: 确保客户端