在当今注重网络安全的时代,构建一个个人或企业专属的虚拟专用网络(VPN)至关重要,OpenVPN 作为一款开源、强大且灵活的 VPN 解决方案,深受广大用户信赖,本文将详细介绍如何在 CentOS 7 系统上,一步步搭建一个功能完整、安全可靠的 OpenVPN 服务器,涵盖从环境准备到客户端配置的全过程。
环境准备
在开始之前,请确保您拥有一台公网可达的 CentOS 7 服务器,并且拥有 root 权限或 sudo 权限,整个搭建过程将围绕这台服务器展开。
更新系统软件包到最新版本,这是一个良好的运维习惯,可以修复已知的安全漏洞和软件缺陷。
yum update -y
安装 OpenVPN 所需的软件包,CentOS 7 的默认源中不包含 OpenVPN,因此我们需要先安装 EPEL (Extra Packages for Enterprise Linux) 扩展源。
yum install epel-release -y yum install openvpn easy-rsa -y
这里,openvpn
是核心服务程序,而 easy-rsa
则是一个用于管理证书颁发机构(CA)和生成各类密钥、证书的实用工具集,是保障 VPN 通信安全的基石。
配置证书颁发机构 (CA)
OpenVPN 的安全性依赖于 SSL/TLS 协议,其核心是公钥基础设施(PKI),我们需要创建一个私有的 CA 来签发服务器和客户端的证书。
复制并准备 Easy-RSA 脚本
将easy-rsa
脚本目录复制到 OpenVPN 的配置目录下,便于统一管理。mkdir -p /etc/openvpn/easy-rsa cp -r /usr/share/easy-rsa/3/* /etc/openvpn/easy-rsa/ cd /etc/openvpn/easy-rsa
初始化 PKI 并生成 CA 根证书
Easy-RSA 3.x 版本使用了更简洁的命令。./easyrsa init-pki ./easyrsa build-ca nopass
init-pki
会创建一个名为pki
的目录用于存放所有证书和密钥。build-ca nopass
会生成 CA 根证书(ca.crt
)和私钥(ca.key
),nopass
参数表示不为私钥设置密码,方便自动化管理,但在生产环境中建议设置强密码。
生成服务器证书与密钥
有了 CA 之后,我们就可以为 OpenVPN 服务器生成其专属的证书和密钥了。
./easyrsa gen-req server nopass ./easyrsa sign-req server server
第一条命令 gen-req server nopass
生成了服务器的证书请求文件(server.req
)和私钥(server.key
),第二条命令 sign-req server server
使用我们之前创建的 CA 来签署这个请求,生成最终的服务器证书(server.crt
),在签署过程中,系统会要求你确认,输入 yes
即可。
为了增强安全性,还需要生成 Diffie-Hellman (DH) 参数,用于在密钥交换过程中提供前向保密性。
./easyrsa gen-dh
这个过程可能会根据服务器性能花费几分钟时间,完成后,会在 pki
目录下生成 dh.pem
文件。
生成一个 HMAC 签名(ta.key
),用于抵御 DoS 攻击和 UDP 端口泛洪攻击。
openvpn --genkey --secret /etc/openvpn/ta.key
至此,服务器所需的所有证书和密钥文件都已准备就绪,下表列出了关键文件及其用途:
文件名 | 路径 | 用途 |
---|---|---|
ca.crt | /etc/openvpn/easy-rsa/pki/ | CA 根证书,用于验证所有证书的合法性 |
server.crt | /etc/openvpn/easy-rsa/pki/issued/ | OpenVPN 服务器公钥证书 |
server.key | /etc/openvpn/easy-rsa/pki/private/ | OpenVPN 服务器私钥,需严格保密 |
dh.pem | /etc/openvpn/easy-rsa/pki/ | Diffie-Hellman 参数文件 |
ta.key | /etc/openvpn/ | HMAC 签名文件,增强安全性 |
配置 OpenVPN 服务器
OpenVPN 提供了一个示例配置文件,我们可以基于它进行修改。
cp /usr/share/doc/openvpn-*/sample/sample-config-files/server.conf /etc/openvpn/
使用文本编辑器(如 vi
或 nano
)打开 /etc/openvpn/server.conf
,进行以下关键配置:
port 1194 proto udp dev tun ca ca.crt cert server.crt key server.key dh dh.pem server 10.8.0.0 255.255.255.0 ifconfig-pool-persist ipp.txt push "redirect-gateway def1 bypass-dhcp" push "dhcp-option DNS 8.8.8.8" push "dhcp-option DNS 8.8.4.4" tls-auth ta.key 0 cipher AES-256-CBC auth SHA256 user nobody group nobody persist-key persist-tun status openvpn-status.log verb 3
配置项解释:
port
和proto
:指定 OpenVPN 监听的端口和协议,UDP 性能更佳。dev tun
:使用 TUN 虚拟网络设备,创建一个路由模式的 VPN。ca
,cert
,key
,dh
:指定我们刚刚生成的证书和密钥文件的路径。server 10.8.0.0 255.255.255.0
:为 VPN 客户端分配一个虚拟网段。push "redirect-gateway..."
:将客户端的所有流量都通过 VPN 服务器转发。push "dhcp-option DNS..."
:为客户端指定 DNS 服务器。tls-auth ta.key 0
:启用 HMAC 签名验证。user nobody
,group nobody
:以低权限用户运行 OpenVPN 服务,提高安全性。
配置网络与防火墙
为了让客户端的流量能够通过 VPN 服务器访问互联网,需要开启内核的 IP 转发功能。
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf sysctl -p
CentOS 7 默认使用 firewalld
作为防火墙管理工具,我们需要配置防火墙,允许 VPN 流量并设置 NAT。
# 添加 OpenVPN 服务到防火墙 firewall-cmd --add-service=openvpn --permanent # 添加 tun0 接口到信任区域 firewall-cmd --add-interface=tun0 --permanent # 设置地址伪装(MASQUERADE),实现 NAT firewall-cmd --add-masquerade --permanent # 重新加载防火墙配置 firewall-cmd --reload
启动服务并生成客户端证书
可以启动 OpenVPN 服务并设置其开机自启。
systemctl start openvpn@server systemctl enable openvpn@server
检查服务状态和 tun0
接口是否已成功创建:
systemctl status openvpn@server ip addr show tun0
为客户端生成证书,为名为 client1
的客户端生成证书:
cd /etc/openvpn/easy-rsa ./easyrsa gen-req client1 nopass ./easyrsa sign-req client client1
生成后,需要将以下文件安全地传输到客户端设备上:
/etc/openvpn/easy-rsa/pki/ca.crt
/etc/openvpn/easy-rsa/pki/issued/client1.crt
/etc/openvpn/easy-rsa/pki/private/client1.key
/etc/openvpn/ta.key
在客户端,创建一个 .ovpn
配置文件,内容如下:
client dev tun proto udp remote YOUR_SERVER_IP 1194 resolv-retry infinite nobind user nobody group nogroup persist-key persist-tun ca ca.crt cert client1.crt key client1.key remote-cert-tls server tls-auth ta.key 1 cipher AES-256-CBC auth SHA256 verb 3
将 YOUR_SERVER_IP
替换为你的服务器公网 IP 地址,将此文件与下载的四个证书/密钥文件放在同一目录,即可使用 OpenVPN 客户端连接。
相关问答FAQs
Q1:客户端可以成功连接到 VPN 服务器,但无法访问互联网,是什么原因?
A: 这是一个非常常见的网络配置问题,通常由以下两个原因导致:
- IP 转发未开启:请检查
/etc/sysctl.conf
文件中是否包含net.ipv4.ip_forward = 1
,并使用sysctl -p
使其生效。 - 防火墙 NAT 规则错误:请确认
firewalld
已经正确配置了地址伪装,可以使用firewall-cmd --query-masquerade
命令检查,如果返回no
,请重新执行firewall-cmd --add-masquerade --permanent
并firewall-cmd --reload
。
Q2:如何撤销一个已发放的客户端证书,例如禁用丢失设备的访问权限?
A: Easy-RSA 提供了便捷的证书撤销功能,操作步骤如下:
- 进入 Easy-RSA 目录:
cd /etc/openvpn/easy-rsa
。 - 执行撤销命令,例如撤销
client1
的证书:./easyrsa revoke client1
,过程中需要输入yes
确认。 - 生成新的证书吊销列表(CRL):
./easyrsa gen-crl
。 - 将生成的 CRL 文件复制到 OpenVPN 配置目录:
cp pki/crl.pem /etc/openvpn/
。 - 编辑
/etc/openvpn/server.conf
文件,添加一行crl-verify crl.pem
。 - 重启 OpenVPN 服务使配置生效:
systemctl restart openvpn@server
。
完成以上步骤后,client1
的证书将被列入黑名单,无法再连接到 VPN 服务器。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
发表回复