重要提示
- 操作系统: 本教程主要针对 CentOS 7/8/9,对于其他 Red Hat 系发行版(如 RHEL, Rocky Linux, AlmaLinux),命令基本通用。
- 权限: 大部分操作需要
root权限,你可以使用sudo前缀,或者直接su -切换到 root 用户。 - 防火墙: 本教程会详细配置防火墙,确保 OpenVPN 服务能被正常访问。
- 安全性: 这份教程会设置强密码和加密参数,但请务必定期更新系统和软件。
第一步:准备工作
-
更新系统 确保你的系统是最新的,这是安全的基础。
# 对于 CentOS 7 sudo yum update -y # 对于 CentOS 8/9 sudo dnf update -y
-
安装必要工具 安装
wget(用于下载安装包)、iptables(用于配置防火墙,即使使用 firewalld 底层也是它)和git(方便获取easy-rsa)。# 对于 CentOS 7 sudo yum install -y wget iptables-services git # 对于 CentOS 8/9 sudo dnf install -y wget iptables-services git
-
关闭 SELinux 和防火墙(临时操作) 为了简化安装过程,我们先临时关闭它们,安装成功后再按需开启。
# 1. 关闭 SELinux sudo setenforce 0 # 编辑 SELinux 配置文件,使其永久关闭(可选,但生产环境建议设置为 Permissive) sudo sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config # 2. 停止并禁用 firewalld sudo systemctl stop firewalld sudo systemctl disable firewalld
第二步:安装 OpenVPN 和 Easy-RSA
-
安装 EPEL 仓库 OpenVPN 不在 CentOS 的默认源中,我们需要启用 EPEL (Extra Packages for Enterprise Linux) 仓库。
# 对于 CentOS 7 sudo yum install -y epel-release # 对于 CentOS 8/9 sudo dnf install -y epel-release
-
安装 OpenVPN 和 Easy-RSA
easy-rsa是一个用于构建和管理 PKI (Public Key Infrastructure) 的工具集,用于生成服务器和客户端的证书。# 对于 CentOS 7 sudo yum install -y openvpn easy-rsa # 对于 CentOS 8/9 sudo dnf install -y openvpn easy-rsa
第三步:配置 PKI (证书颁发机构) 和密钥
这是最关键的一步,我们将创建一个私有的 CA 来签发所有 VPN 使用的证书。
-
准备 Easy-RSA 工作目录 我们将创建一个专门用于存放证书和密钥的目录。
# 创建一个工作目录 mkdir -p ~/openvpn-ca # 将 easy-rsa 的示例配置文件复制到我们的工作目录 cp -r /usr/share/easy-rsa/3/* ~/openvpn-ca/
-
初始化 PKI 并创建 CA 进入工作目录,初始化 PKI,并创建我们自己的根证书颁发机构。
cd ~/openvpn-ca # 初始化 PKI ./easyrsa init-pki # 创建 CA,系统会提示你输入一个 Common Name (CN),"MyVPN-CA",并设置一个密码,请务必记住这个密码! ./easyrsa build-ca nopass
nopass: 表示 CA 私钥不使用密码保护,方便服务器自动启动,如果安全性要求极高,可以去掉此参数,但每次启动 OpenVPN 时都需要手动输入密码。
-
生成服务器证书和密钥 为 OpenVPN 服务器生成一个证书和私钥。
# 生成服务器证书,Common Name 可以是服务器的域名或 IP,"server" 或 "vpn.mydomain.com" ./easyrsa gen-req server nopass # 使用 CA 来签署服务器证书 ./easyrsa sign-req server server
系统会问你
Confirm request details: (y/n),输入y,然后会要求你输入之前创建 CA 时设置的密码。 -
生成 Diffie-Hellman 参数 这个参数用于增强前向保密性,生成过程可能需要几分钟。
./easyrsa gen-dh
-
生成 HMAC 密钥 这个密钥用于验证数据包的来源,防止某些攻击。
openvpn --genkey --secret pki/ta.key
-
生成客户端证书和密钥 为你的第一个客户端生成证书,你可以为每个客户端都执行此步骤,使用不同的 Common Name。
# 为客户端 "client1" 生成证书 ./easyrsa gen-req client1 nopass # 使用 CA 签署客户端证书 ./easyrsa sign-req client client1
同样,输入
y确认,并输入 CA 的密码。
第四步:配置 OpenVPN 服务器
-
创建服务器配置文件 将 OpenVPN 的示例配置文件复制到
/etc/openvpn/server/目录下,并命名为server.conf。sudo cp /usr/share/doc/openvpn-*/sample/sample-config-files/server.conf /etc/openvpn/server/
-
编辑配置文件 用你喜欢的编辑器(如
vim或nano)打开并编辑配置文件。sudo vim /etc/openvpn/server/server.conf
找到并修改以下几行:
port 1194 proto udp dev tun # 将 ca, cert, key 的路径指向我们生成的文件 ca /root/openvpn-ca/pki/ca.crt cert /root/openvpn-ca/pki/issued/server.crt key /root/openvpn-ca/pki/private/server.key dh /root/openvpn-ca/pki/dh.pem # 推送 DNS 服务器给客户端,避免 DNS 泄漏 push "redirect-gateway def1 bypass-dhcp" push "dhcp-option DNS 8.8.8.8" push "dhcp-option DNS 1.1.1.1" # 保持客户端连接 keepalive 10 120 # 使用 HMAC tls-crypt /root/openvpn-ca/pki/ta.key # 使用更强的加密算法 cipher AES-256-CBC auth SHA256 # 启用用户/密码认证(可选,但推荐) ;client-cert-not-required ;username-as-common-name ;plugin /usr/lib64/openvpn/plugins/openvpn-plugin-auth-pam.so /etc/pam.d/login # 让 OpenVPN 作为网关 server 10.8.0.0 255.255.255.0 # 允许客户端之间互相通信(可选) ;client-to-client # 为客户端分配的 IP 地址池 ;ifconfig-pool-persist /var/log/openvpn/ipp.txt # 启用日志 user nobody group nobody persist-key persist-tun status /var/log/openvpn/openvpn-status.log log-append /var/log/openvpn/openvpn.log verb 3
重要说明:
plugin ... pam.so这几行默认是注释掉的,如果你希望用户可以使用用户名和密码登录,而不仅仅是证书,可以取消注释它们,本教程暂不启用,以证书认证为主。cipher和auth设置了强加密算法,与你的客户端配置必须一致。
第五步:配置系统防火墙和 IP 转发
-
启用 IP 转发 VPN 需要服务器作为客户端的网关,因此必须开启内核的 IP 转发功能。
# 临时生效 sudo sysctl -w net.ipv4.ip_forward=1 # 永久生效 echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf sudo sysctl -p
-
配置防火墙规则 我们重新启用并配置
firewalld,这是 CentOS 推荐的防火墙工具。
