概述
搭建 OpenVPN 服务器的核心步骤如下:

- 环境准备:更新系统,安装必要的软件包。
- 安装 OpenVPN:安装 OpenVPN 服务端和客户端工具。
- 配置 CA 和证书:创建一个简单的证书颁发机构,并为服务器和每个客户端生成唯一的证书和密钥,这是保证安全通信的关键。
- 配置服务器:编辑 OpenVPN 的主配置文件
server.conf。 - 启动服务:使用
systemd启动并启用 OpenVPN 服务。 - 配置客户端:生成客户端配置文件,方便客户端连接。
- 安全加固:配置防火墙和 IP 转发,确保服务器安全且客户端能正确访问网络。
- 客户端连接测试:使用客户端软件进行连接测试。
第一步:环境准备
登录到你的 Linux 服务器(建议使用具有 sudo 权限的非 root 用户)。
-
更新系统包列表
sudo apt update && sudo apt upgrade -y
-
安装必要的工具 我们需要
wget来下载easy-rsa,git(可选),以及unzip。sudo apt install -y wget git unzip
第二步:安装 OpenVPN 和 Easy-RSA
OpenVPN 的包通常包含在官方仓库中,而 easy-rsa 是一个用于管理 PKI (Public Key Infrastructure) 的工具,用于生成证书。

-
安装 OpenVPN
sudo apt install -y openvpn
-
下载并设置 Easy-RSA v3 我们从 GitHub 获取最新的
easy-rsa,因为它比旧版本更强大、更安全。# 创建一个工作目录 mkdir ~/easyrsa && cd ~/easyrsa # 下载并解压 wget https://github.com/OpenVPN/easy-rsa/releases/download/v3.1.7/EasyRSA-v3.1.7.tgz tar xzf EasyRSA-v3.1.7.tgz mv EasyRSA-v3.1.7/* . rm -rf EasyRSA-v3.1.7.tgz EasyRSA-v3.1.7 # 为了方便使用,创建一个软链接 sudo ln -s ~/easyrsa/easyrsa /usr/local/bin/
第三步:配置 PKI 和生成证书
这是整个过程中最核心的部分,我们将创建一个根证书(CA),并用它来签发服务器和客户端的证书。
-
初始化 PKI
(图片来源网络,侵删)cd ~/easyrsa easyrsa init-pki
这会在当前目录下创建一个
pki文件夹,用于存放所有证书和密钥。 -
构建 CA (Certificate Authority) CA 是信任的根,用于签发所有其他证书,请务必为
ca.key设置一个强密码并妥善保存。easyrsa build-ca nopass
nopass:为了方便服务器自动启动,我们这里不设置 CA 密码。在生产环境中,强烈建议设置密码。- 过程中会提示你输入一个 Common Name (CN),可以直接按回车使用默认值(如
Easy-RSA CA)。
-
为服务器生成证书和密钥
easyrsa gen-req server nopass
- 同样,为
server.key不设置密码。 - 输入 Common Name,可以设置为
server或你的服务器域名/IP。
- 同样,为
-
为服务器证书签名 使用 CA 来签发服务器的请求,生成一个完整的证书。
easyrsa sign-req server server
- 这里会要求你输入之前设置的 CA 密码。
-
为客户端生成证书和密钥 每个客户端都需要一个唯一的证书,这里我们为第一个客户端
client1生成。# 回到 easyrsa 目录 cd ~/easyrsa # 生成客户端请求(可以为 client.key 设置密码,但连接时需要输入,这里为了方便也使用 nopass) easyrsa gen-req client1 nopass # 使用 CA 签名客户端请求(需要输入 CA 密码) easyrsa sign-req client client1
-
生成 Diffie-Hellman 参数 这个参数用于增强前向安全性,防止密钥在未来被破解。
easyrsa gen-dh
- 注意:这个过程可能需要几分钟到几十分钟,具体取决于服务器的 CPU 性能。
-
生成 HMAC 密钥 用于增强 TLS 认证的安全性,防止 DoS 攻击。
openvpn --genkey --secret pki/ta.key
-
整理证书和密钥文件 为了方便管理,我们将所有生成的必要文件复制到一个单独的目录。
mkdir -p ~/openvpnccd cp pki/ca.crt pki/issued/server.crt pki/private/server.key pki/dh.pem pki/ta.key ~/openvpnccd/
第四步:配置 OpenVPN 服务器
-
复制并编辑服务器配置文件 OpenVPN 提供了一个示例配置文件,我们基于它进行修改。
sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/ sudo gunzip /etc/openvpn/server.conf.gz sudo nano /etc/openvpn/server.conf
编辑
server.conf文件,确保以下配置项正确:port 1194 proto udp dev tun # 使用我们生成的证书和密钥路径 ca /root/openvpnccd/ca.crt cert /root/openvpnccd/server.crt key /root/openvpnccd/server.key # This file should be kept secret dh /root/openvpnccd/dh.pem server 10.8.0.0 255.255.255.0 ifconfig-pool-persist /var/log/openvpn/ipp.txt # 推送路由和 DNS push "redirect-gateway def1 bypass-dhcp" push "dhcp-option DNS 8.8.8.8" push "dhcp-option DNS 8.8.4.4" keepalive 10 120 tls-crypt /root/openvpnccd/ta.key cipher AES-256-CBC auth SHA256 user nobody group nogroup persist-key persist-tun status /var/log/openvpn/openvpn-status.log log-append /var/log/openvpn/openvpn.log verb 3 explicit-exit-notify 1
关键配置解释:
proto udp:推荐使用 UDP,因为它更高效、更能丢包。server 10.8.0.0 255.255.255.0:定义了 VPN 客户端将获得的虚拟 IP 地址段。push "redirect-gateway def1":非常重要,这会让客户端的所有网络流量都通过 VPN 服务器。push "dhcp-option DNS ...":为客户端指定 DNS 服务器,防止 DNS 泄漏。tls-crypt /root/openvpnccd/ta.key:使用我们生成的 HMAC 密钥,增强安全性。cipher AES-256-CBC和auth SHA256:指定加密和认证算法,是当前的安全标准。
-
创建客户端配置目录 这个目录用于存放客户端的证书和配置文件。
sudo mkdir -p /etc/openvpn/ccd # 这个目录是可选的,用于为特定客户端分配固定的静态 IP
第五步:启动 OpenVPN 服务
-
配置 IP 转发 为了让 VPN 客户端能够访问互联网,服务器需要开启 IP 转发功能。
# 编辑 sysctl.conf sudo nano /etc/sysctl.conf # 取消注释或添加下面这行 net.ipv4.ip_forward=1
立即生效:
sudo sysctl -p
-
配置防火墙 (UFW) 允许 OpenVPN 端口和 NAT 转发。
# 允许 SSH 连接(如果你还没有允许) sudo ufw allow OpenSSH # 允许 UDP 1194 端口 sudo ufw allow 1194/udp # 允许转发规则(在 UFW 中启用转发) sudo nano /etc/default/ufw # 找到 DEFAULT_FORWARD_POLICY 这一行,将其改为 "ACCEPT" DEFAULT_FORWARD_POLICY="ACCEPT" # 创建一个 UFW 规则来伪装 NAT 流量 sudo nano /etc/ufw/before.rules # 在文件开头的 `*filter` 之前,添加以下内容: # # rules.before # # rules that should be run before the ufw command line added rules. see # ufw-framework(8) for a description of how this file works. # # START UFW AND IPTABLES RULES # # Don't delete these required lines, otherwise there will be errors *filter :ufw-before-input - [0:0] :ufw-before-forward - [0:0] :ufw-before-output - [0:0] :ufw-not-input - [0:0] :ufw-not-forward - [0:0] :ufw-not-output - [0:0] :ufw-user-input - [0:0] :ufw-user-forward - [0:0] :ufw-user-output - [0:0] :ufw-after-input - [0:0] :ufw-after-forward - [0:0] :ufw-after-output - [0:0] # End required lines # NAT rules for OpenVPN # *nat # :POSTROUTING ACCEPT [0:0] # -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE # COMMIT # 在文件末尾,在 `COMMIT` 之后,添加以下 NAT 规则: # START OPENVPN RULES # NAT table rules *nat :POSTROUTING ACCEPT [0:0] # Allow traffic from VPN to the internet -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE COMMIT # END OPENVPN RULES # Don't delete these required lines, otherwise there will be errors COMMIT # # END UFW AND IPTABLES RULES
-
启用并启动 OpenVPN 服务
# 使用 systemd 启动服务 sudo systemctl start openvpn@server # 设置开机自启 sudo systemctl enable openvpn@server # 检查服务状态 sudo systemctl status openvpn@server
如果看到
active (running),说明服务已成功启动。
第六步:生成客户端配置文件
我们需要为客户端创建一个 client.ovpn 文件,以便他们可以轻松地连接到 VPN。
-
创建客户端配置文件 在服务器上创建一个目录来存放客户端配置,然后生成文件。
mkdir -p ~/clients nano ~/clients/client1.ovpn
-
向
client1.ovpn文件中添加内容 将以下内容粘贴进去,并确保路径正确。client dev tun proto udp remote YOUR_SERVER_IP 1194 # <--- 将 YOUR_SERVER_IP 替换为你的服务器公网 IP resolv-retry infinite nobind persist-key persist-tun remote-cert-tls server cipher AES-256-CBC auth SHA256 key-direction 1 script-security 3 verb 3 # <--- 在下面添加证书和密钥内容 <--- <ca> -----BEGIN CERTIFICATE----- # 将 /root/openvpnccd/ca.crt 文件中的所有内容(包括头尾)复制到这里 -----END CERTIFICATE----- </ca> <cert> -----BEGIN CERTIFICATE----- # 将 /root/easyrsa/pki/issued/client1.crt 文件中的所有内容复制到这里 -----END CERTIFICATE----- </cert> <key> -----BEGIN PRIVATE KEY----- # 将 /root/easyrsa/pki/private/client1.key 文件中的所有内容复制到这里 -----END PRIVATE KEY----- </key> <tls-crypt> -----BEGIN OpenVPN Static key V1----- # 将 /root/openvpnccd/ta.key 文件中的所有内容复制到这里 -----END OpenVPN Static key V1----- </tls-crypt>
重要:
remote YOUR_SERVER_IP 1194:这是最关键的一步,必须替换成你服务器的公网 IP 地址或域名。key-direction 1:当使用tls-crypt时,客户端必须设置为1。- 将
<ca>,<cert>,<key>,<tls-crypt>标签内的内容替换为对应文件的实际内容。
-
传输文件 使用
scp或 SFTP 将~/clients/client1.ovpn文件下载到你的本地电脑。# 在你的本地电脑终端执行 scp user@YOUR_SERVER_IP:~/clients/client1.ovpn .
第七步:客户端连接测试
-
安装 OpenVPN 客户端
- Windows: 从 openvpn.net 下载并安装 OpenVPN GUI。
- macOS: 使用 Tunnelblick 或 Homebrew 安装
openvpn。 - Android/iOS: 从应用商店下载 "OpenVPN Connect"。
-
导入配置 将下载的
client1.ovpn文件复制到客户端设备,然后导入到 OpenVPN 客户端中。 -
连接 启动 OpenVPN 客户端,选择
client1配置并连接,如果一切正常,客户端应该能成功获取到8.0.x网段的 IP,并且你的所有网络流量都会通过 VPN 服务器。 -
验证 打开浏览器,访问 ipleak.net 或 dnsleaktest.com,检查你的 IP 地址和 DNS 服务器是否已更改为服务器的 IP 和你配置的 DNS。
总结与后续步骤
恭喜!你已经成功搭建了一个功能齐全的 OpenVPN 服务器。
后续可以做的优化:
- 为更多用户创建证书:重复第三步的
5和第六步,为每个新用户生成唯一的证书和配置文件。 - 使用用户名/密码认证:可以结合 PAM 和插件实现双因素认证,即除了证书,还需要用户名和密码。
- 配置客户端固定 IP:在
/etc/openvpn/ccd/目录下创建一个与客户端 Common Name 同名的文件(如client1),在其中写入ifconfig-push 10.8.0.2 255.255.255.252,即可为该客户端分配固定 IP。 - 日志监控:定期检查
/var/log/openvpn/openvpn.log文件,排查连接问题。 - 考虑使用
firewalld:如果你使用的是 CentOS/RHEL,防火墙配置会略有不同,需要使用firewall-cmd来设置。
这个教程提供了一个坚实的基础,你可以根据需要进行扩展和加固。
