OpenVPN 适合需要兼容 Windows、macOS、Linux、Android、iOS 和路由器的远程访问场景。它不一定比 WireGuard 更快,但客户端成熟、证书权限清晰,在公司内网访问、远程维护家庭设备和公共 Wi-Fi 加密等场景中依然常用。
本文以 Ubuntu 22.04/24.04 为例,使用系统仓库中的 OpenVPN 和 Easy-RSA 搭建证书认证服务器。最终会得到一个可以直接导入 OpenVPN Connect 的 .ovpn 文件,并处理 IP 转发、UFW、NAT 和客户端撤销。
| 使用人数 | 建议配置 | 适合场景 |
|---|---|---|
| 1-5 人 | 1 核 / 1GB / 20GB SSD | SSH、内网面板和轻量浏览 |
| 5-20 人 | 2 核 / 2GB / 40GB SSD | 办公访问、文件服务和日常上网 |
| 20 人以上 | 4 核 / 4GB 起 | 多客户端并发,需要监控带宽和连接数 |
OpenVPN 加密比较依赖单核性能。VPS 还要有公网 IPv4,虚拟化环境必须允许创建 TUN 设备。部署前运行:
test -c /dev/net/tun && echo "TUN available" || echo "TUN unavailable"
ip route show default
如果 /dev/net/tun 不存在,需要在 VPS 控制面板开启 TUN/TAP,或联系服务商处理。
先更新系统并安装需要的软件:
sudo apt update
sudo apt install -y openvpn easy-rsa ufw
openvpn --version | head -n 1
Ubuntu 官方文档使用 Easy-RSA 创建私有 CA,为服务器和每台客户端分别签发证书。复制工作目录:
sudo make-cadir /etc/openvpn/easy-rsa
sudo -i
cd /etc/openvpn/easy-rsa
./easyrsa init-pki
./easyrsa build-ca
build-ca 会要求设置 CA 密码。这个密码只在签发或撤销证书时使用,不要把 pki/private/ca.key 下载到普通客户端。
服务启动时不能等待输入私钥密码,因此服务器密钥使用 nopass:
cd /etc/openvpn/easy-rsa
./easyrsa gen-req server nopass
./easyrsa sign-req server server
./easyrsa gen-dh
openvpn --genkey secret /etc/openvpn/ta.key
复制服务器需要的文件,并限制私钥权限:
cp pki/ca.crt /etc/openvpn/
cp pki/issued/server.crt /etc/openvpn/
cp pki/private/server.key /etc/openvpn/
cp pki/dh.pem /etc/openvpn/
chmod 600 /etc/openvpn/server.key /etc/openvpn/ta.key
创建 /etc/openvpn/server.conf:
port 1194
proto udp4
dev tun
topology subnet
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist /var/log/openvpn-ipp.txt
ca /etc/openvpn/ca.crt
cert /etc/openvpn/server.crt
key /etc/openvpn/server.key
dh /etc/openvpn/dh.pem
tls-crypt /etc/openvpn/ta.key
remote-cert-tls client
data-ciphers AES-256-GCM:AES-128-GCM:CHACHA20-POLY1305
auth SHA256
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 1.1.1.1"
push "dhcp-option DNS 1.0.0.1"
keepalive 10 120
persist-key
persist-tun
user nobody
group nogroup
explicit-exit-notify 1
verb 3
redirect-gateway 表示客户端全部流量经过 VPS。如果只想访问服务器或家庭内网,删掉这行,改为推送指定网段,例如:
push "route 192.168.10.0 255.255.255.0"
启用 IPv4 转发:
echo 'net.ipv4.ip_forward = 1' > /etc/sysctl.d/50-enable-ipv4-forwarding.conf
sysctl -p /etc/sysctl.d/50-enable-ipv4-forwarding.conf
先查公网网卡名称,不要直接假设一定是 eth0:
WAN_IF=$(ip route show default | awk '/default/ {print $5; exit}')
echo "$WAN_IF"
如果 VPS 已启用 UFW,先放行 SSH 和 OpenVPN。SSH 使用非 22 端口时要替换对应规则:
ufw allow OpenSSH
ufw allow 1194/udp
编辑 /etc/default/ufw,把转发策略改成:
DEFAULT_FORWARD_POLICY="ACCEPT"
在 /etc/ufw/before.rules 文件最前面加入 NAT 段,其中 eth0 必须换成刚才查到的公网网卡:
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
COMMIT
确认云平台安全组也允许 UDP 1194,再重载 UFW:
ufw enable
ufw reload
ufw status verbose
开启防火墙前务必保留当前 SSH 会话,并确认 SSH 规则正确。误封后可参考 VPS 开启 UFW 后 SSH 进不去的自救清单。
Ubuntu 官方文档使用 openvpn@配置文件名 的模板服务。因为配置文件是 /etc/openvpn/server.conf,启动命令是:
systemctl enable --now openvpn@server
systemctl status openvpn@server --no-pager
ip addr show tun0
正常时日志会出现 Initialization Sequence Completed,并创建 10.8.0.1:
journalctl -u openvpn@server -n 100 --no-pager
ss -lunp | grep 1194
部分 Debian/Ubuntu 软件包把服务端配置放在 /etc/openvpn/server/server.conf,对应服务名是 openvpn-server@server。如果 openvpn@server 报找不到配置,运行 systemctl list-unit-files | grep openvpn 确认当前软件包采用哪种目录布局。
每台设备使用独立证书,不要让手机、电脑和路由器共用一个客户端私钥:
cd /etc/openvpn/easy-rsa
./easyrsa gen-req phone nopass
./easyrsa sign-req client phone
生成单文件配置 /root/phone.ovpn,将 YOUR_VPS_IP 换成服务器公网 IP 或域名:
cat > /root/phone.ovpn <<EOF
client
dev tun
proto udp4
remote YOUR_VPS_IP 1194
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
data-ciphers AES-256-GCM:AES-128-GCM:CHACHA20-POLY1305
auth SHA256
verb 3
<ca>
$(cat pki/ca.crt)
</ca>
<cert>
$(sed -ne '/BEGIN CERTIFICATE/,$p' pki/issued/phone.crt)
</cert>
<key>
$(cat pki/private/phone.key)
</key>
<tls-crypt>
$(cat /etc/openvpn/ta.key)
</tls-crypt>
EOF
chmod 600 /root/phone.ovpn
用 SFTP 安全下载这个文件,导入 OpenVPN Connect。不要通过公开网盘或聊天群转发,因为 .ovpn 内含客户端私钥。
客户端连接后,依次检查:
ping 10.8.0.1
curl https://ifconfig.me
全隧道模式下,第二条命令应返回 VPS 公网 IP。服务器端查看客户端连接:
ip addr show tun0
journalctl -u openvpn@server -f
OpenVPN 与 WireGuard 的主要区别如下:
| 对比项 | OpenVPN | WireGuard |
|---|---|---|
| 客户端兼容性 | 非常广,企业环境常见 | 新系统支持好 |
| 配置方式 | CA 和客户端证书 | 公私钥与 Peer |
| 性能 | 加密和用户态开销较高 | 通常延迟更低、吞吐更高 |
| 权限回收 | 撤销单个证书 | 删除对应 Peer |
如果更看重速度和简单配置,可以参考 VPS 搭建 WireGuard VPN 教程。
手机或电脑丢失后,立即撤销对应证书:
cd /etc/openvpn/easy-rsa
./easyrsa revoke phone
./easyrsa gen-crl
cp pki/crl.pem /etc/openvpn/crl.pem
chmod 644 /etc/openvpn/crl.pem
在服务端配置中增加:
crl-verify /etc/openvpn/crl.pem
然后重启服务:
systemctl restart openvpn@server
确认 UDP 1194 同时在系统防火墙和云安全组放行,并检查客户端的 IP、端口、proto 是否与服务器一致:
ss -lunp | grep 1194
journalctl -u openvpn@server -n 100 --no-pager
通常是 IP 转发、NAT 网卡名或 UFW 转发策略错误:
sysctl net.ipv4.ip_forward
ip route show default
grep DEFAULT_FORWARD_POLICY /etc/default/ufw
iptables -t nat -L POSTROUTING -n -v
先重启服务,再看具体报错:
systemctl restart openvpn@server
journalctl -u openvpn@server -xe --no-pager
重点检查证书路径、文件权限以及 tls-crypt 两端是否一致。不要为了兼容旧客户端随意启用 BF-CBC 或关闭证书验证,优先升级客户端。
- TUN/TAP 可用,VPS 公网 IP 稳定,UDP 1194 已在安全组放行。
- CA 私钥只保存在服务器或离线备份中,每台设备都有独立证书。
net.ipv4.ip_forward=1已生效,NAT 使用正确的公网网卡。- 客户端配置没有通过公开渠道传输,文件权限为
600。 - 服务已设置开机启动,日志中没有持续 TLS 或路由错误。
- 已记录证书撤销步骤,并定期备份
/etc/openvpn/easy-rsa/pki。
OpenVPN 部署最容易出错的不是证书生成,而是端口、防火墙和转发链路。先让客户端能够连到 10.8.0.1,再排查公网出口,可以快速区分 TLS 问题与 NAT 问题。
