23. 虚拟私人网络(VPN)
本章介绍 RHEL 9 上两种主流 VPN 方案的完整配置:OpenVPN(基于 TLS 证书的远程访问 VPN,适合员工从外网接入内网)和 Libreswan IPsec(基于 IKEv2 的站点到站点加密隧道,适合两个固定网络节点互通)。VPN 为远程管理和多站点互联提供加密通道,是企业网络安全架构的重要组件。
实验环境说明
本章以 linuxdc(192.168.1.100)作为 VPN 服务端,192.168.1.101 作为客户端或对端节点。若只有一台主机,可使用 VMware 克隆虚拟机创建第二个节点。
23.1 前提条件
- 已完成第四阶段前序配置(第 20–22 章)。
- 通过 SecureCRT(SSH 端口 2222)以
ops用户、密钥认证方式登录192.168.1.100,执行sudo -i切换至 root 环境。 - SELinux 处于 Enforcing 模式,firewalld 已启用(第 12 章)。
- EPEL 仓库已启用(第 7 章)。
- IP 转发已在第 11 章 sysctl 配置中启用,验证:
sysctl net.ipv4.ip_forward
# 若输出为 0,立即修复:
sysctl -w net.ipv4.ip_forward=1
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.d/99-linuxdc.conf
本章全局参数
| 参数 | 值 |
|---|---|
| VPN 服务端 IP | 192.168.1.100(linuxdc) |
| VPN 客户端 / 对端 IP | 192.168.1.101 |
| OpenVPN 监听端口 | UDP 1194 |
| OpenVPN VPN 子网 | 10.8.0.0/24 |
| IPsec 本端保护子网 | 192.168.1.0/24 |
| IPsec 对端保护子网 | 192.168.2.0/24 |
23.2 OpenVPN 配置
OpenVPN 基于 SSL/TLS,使用 Easy-RSA PKI 管理证书,支持 UDP/TCP 传输,适合员工远程接入企业内网的场景。
23.2.1 安装工具
dnf install -y openvpn easy-rsa
23.2.2 初始化 PKI 与生成证书
# 初始化 Easy-RSA 工作目录
mkdir -p /etc/openvpn/easy-rsa
cp -r /usr/share/easy-rsa/3/* /etc/openvpn/easy-rsa/
cd /etc/openvpn/easy-rsa
# 初始化 PKI 目录结构
./easyrsa init-pki
# 创建 CA(nopass 表示不加密 CA 私钥,实验用;生产应设置密码)
./easyrsa build-ca nopass
# 生成服务端密钥对和证书请求
./easyrsa gen-req server nopass
# 签发服务端证书
./easyrsa sign-req server server
# 生成 Diffie-Hellman 参数(首次约需 1–2 分钟)
./easyrsa gen-dh
# 生成 TLS 认证密钥(用于 tls-auth,防止 DoS 攻击)
openvpn --genkey secret /etc/openvpn/easy-rsa/pki/ta.key
23.2.3 配置 OpenVPN 服务端
tee /etc/openvpn/server/server.conf << 'EOF'
# 监听端口与协议
port 1194
proto udp
dev tun
# 证书与密钥路径
ca /etc/openvpn/easy-rsa/pki/ca.crt
cert /etc/openvpn/easy-rsa/pki/issued/server.crt
key /etc/openvpn/easy-rsa/pki/private/server.key
dh /etc/openvpn/easy-rsa/pki/dh.pem
# TLS 认证(防 DoS 攻击,0=服务端方向)
tls-auth /etc/openvpn/easy-rsa/pki/ta.key 0
tls-version-min 1.2
cipher AES-256-GCM
auth SHA256
# VPN 内网子网(客户端从此池获取 IP)
server 10.8.0.0 255.255.255.0
# 向客户端推送路由与 DNS
push "route 192.168.1.0 255.255.255.0"
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
# 保活心跳(每 10 秒探测,120 秒无响应认为断线)
keepalive 10 120
# 降权运行(安全最佳实践)
user nobody
group nobody
# 持久化(降权后仍可维持隧道状态)
persist-key
persist-tun
# 日志
status /var/log/openvpn-status.log
log-append /var/log/openvpn.log
verb 3
EOF
配置防火墙与 SELinux:
firewall-cmd --permanent --add-service=openvpn
firewall-cmd --permanent --add-masquerade
firewall-cmd --reload
# SELinux 放行 OpenVPN 绑定 UDP 1194
semanage port -a -t openvpn_port_t -p udp 1194 2>/dev/null || \
echo "端口已存在,跳过"
启动服务:
systemctl enable --now openvpn-server@server
systemctl status openvpn-server@server
# 验证 UDP 1194 监听
ss -uln | grep :1194
检查点
systemctl is-active openvpn-server@server 返回 active;ss -uln | grep 1194 显示 UDP 监听正常。
23.2.4 生成客户端证书
cd /etc/openvpn/easy-rsa
# 为客户端 client01 生成密钥对和证书请求
./easyrsa gen-req client01 nopass
# 签发客户端证书
./easyrsa sign-req client client01
通过 SecureFX 将以下文件传输给客户端:
/etc/openvpn/easy-rsa/pki/ca.crt
/etc/openvpn/easy-rsa/pki/issued/client01.crt
/etc/openvpn/easy-rsa/pki/private/client01.key
/etc/openvpn/easy-rsa/pki/ta.key
客户端配置文件(client01.conf):
client
dev tun
proto udp
remote 192.168.1.100 1194
resolv-retry infinite
nobind
ca ca.crt
cert client01.crt
key client01.key
tls-auth ta.key 1
tls-version-min 1.2
cipher AES-256-GCM
auth SHA256
persist-key
persist-tun
verb 3
Linux 客户端连接与验证:
openvpn --config client01.conf --daemon
sleep 3
# 查看 VPN 隧道接口
ip addr show tun0
# ping VPN 服务端隧道 IP
ping -c 3 10.8.0.1
23.3 Libreswan IPsec 配置(站点到站点)
Libreswan 实现 IKEv2 协议,用于在两个固定网络节点之间建立永久加密隧道,用户透明,无需客户端软件。
| 角色 | 主机名 | 公网 IP | 内网子网 |
|---|---|---|---|
| 本端 | linuxdc |
192.168.1.100 |
192.168.1.0/24 |
| 对端 | node2 |
192.168.1.101 |
192.168.2.0/24 |
23.3.1 安装并启动
dnf install -y libreswan
systemctl enable --now ipsec
systemctl status ipsec
23.3.2 配置隧道(两端均需配置)
本端(192.168.1.100):
tee /etc/ipsec.d/site-to-site.conf << 'EOF'
conn site-to-site
type = tunnel
authby = secret
# 本端参数
left = 192.168.1.100
leftsubnet = 192.168.1.0/24
leftid = @linuxdc
# 对端参数
right = 192.168.1.101
rightsubnet = 192.168.2.0/24
rightid = @node2
# IKEv2 加密套件
ikev2 = insist
ike = aes256-sha2_512;modp2048
phase2alg = aes256-sha2_512;modp2048
pfs = yes
# 启动时自动建立隧道
auto = start
EOF
生成并配置预共享密钥(两端必须完全一致):
# 生成 32 字节随机密钥
PSK=$(openssl rand -base64 32)
echo "PSK 已生成,请同步到对端:${PSK}"
tee /etc/ipsec.d/site-to-site.secrets << EOF
@linuxdc @node2 : PSK "${PSK}"
EOF
chmod 600 /etc/ipsec.d/site-to-site.secrets
开放防火墙:
firewall-cmd --permanent --add-service=ipsec
firewall-cmd --reload
启动并验证:
systemctl restart ipsec
# 手动触发隧道建立
ipsec auto --up site-to-site
# 查看隧道状态
ipsec status
ipsec whack --status | grep "site-to-site"
检查点
ipsec status 输出中 site-to-site 连接状态显示 STATE_V2_ESTABLISHED_CHILD_SA,表示 IKEv2 隧道已成功建立。
23.4 常见问题与排查
| 问题现象 | 排查步骤 |
|---|---|
| OpenVPN 服务启动失败 | journalctl -u openvpn-server@server -n 30;检查证书路径与文件权限 |
| 客户端连接超时 | 确认防火墙开放 UDP 1194;ss -uln | grep 1194 验证监听 |
| VPN 连通但无法访问内网 | 确认 net.ipv4.ip_forward=1;确认 firewalld masquerade 已启用 |
| IPsec 隧道建立失败 | ipsec verify 诊断配置;确认两端 PSK 完全一致;检查 UDP 500/4500 防火墙规则 |
| IPsec 隧道建立后无流量通过 | 确认两端 leftsubnet/rightsubnet 配置正确;检查路由表 ip route show |
# OpenVPN 实时日志
tail -f /var/log/openvpn.log
# IPsec 全面诊断
ipsec verify
journalctl -u ipsec -f
23.5 实践任务
- 登录
linuxdc(SecureCRT 端口 2222,ops用户,密钥认证,sudo -i切换 root)。 - 安装 OpenVPN 和 Easy-RSA,完成 PKI 初始化:
init-pki→build-ca→gen-req server→sign-req server→gen-dh→genkey ta.key。 - 创建
server.conf,配置防火墙(add-service=openvpn+add-masquerade)和 SELinux,启动服务,验证 UDP 1194 监听。 - 生成客户端证书
client01,创建client01.conf配置文件。 - 安装 Libreswan,创建
site-to-site.conf和site-to-site.secrets,执行ipsec verify查看配置诊断。 - 执行
ipsec auto --up site-to-site(若有对端)或查看配置语法,验证服务正常运行。
23.6 自测问题
Q1:Easy-RSA 在 OpenVPN 中扮演什么角色?
Easy-RSA 是轻量级 PKI 管理工具,负责创建 CA(证书颁发机构)、签发和管理服务端及客户端的 X.509 证书。OpenVPN 使用 TLS 证书进行双向身份认证:服务端验证客户端证书确认其为已授权用户,客户端验证服务端证书防止中间人攻击。每位用户持有独立证书,吊销单个证书(./easyrsa revoke client01)不影响其他用户,管理粒度精细,安全性远优于预共享密钥方式。
Q2:OpenVPN 配置中 tls-auth 的防护作用是什么?
tls-auth 在 TLS 握手之前增加一层 HMAC 签名验证。任何不携带有效 HMAC 签名的数据包在进入 TLS 协议栈之前即被直接丢弃,有效防御三类攻击:端口扫描(扫描者无法识别服务,看不到任何响应)、TLS 缓冲区溢出漏洞利用(在 TLS 处理层之前过滤掉恶意包)、TLS 握手级 DoS 攻击(无签名的大量连接请求被提前丢弃,不消耗 TLS 处理资源)。
Q3:IPsec 站点到站点 VPN 与 OpenVPN 远程访问 VPN 的典型应用场景有何差异?
IPsec 站点到站点:两个固定网络(如总部与分公司数据中心)之间的永久加密互联,配置在网关设备或服务器上,网络内部用户完全透明,无需安装任何客户端,适合网络基础设施层互通需求,一旦配置好基本无需维护。OpenVPN 远程访问:出差员工或居家办公人员从任意位置通过客户端软件接入公司内网,每位用户拥有独立证书,证书管理灵活(随时签发/吊销),审计粒度细至单个用户,适合动态移动办公场景。
23.7 章节总结
本章完成了 RHEL 9 上两种 VPN 方案的完整配置:OpenVPN 基于 Easy-RSA PKI 证书体系的远程访问 VPN(UDP 1194,AES-256-GCM 加密,tls-auth 防 DoS)和 Libreswan IPsec 基于 IKEv2 的站点到站点加密隧道(PSK 认证,AES-256/SHA-512 加密套件)。两者各有侧重,互为补充,共同构成企业远程访问与多站点互联的安全加密网络基础设施。