跳转至

23. 虚拟私人网络(VPN)

本章介绍 RHEL 9 上两种主流 VPN 方案的完整配置:OpenVPN(基于 TLS 证书的远程访问 VPN,适合员工从外网接入内网)和 Libreswan IPsec(基于 IKEv2 的站点到站点加密隧道,适合两个固定网络节点互通)。VPN 为远程管理和多站点互联提供加密通道,是企业网络安全架构的重要组件。

实验环境说明

本章以 linuxdc192.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 返回 activess -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 实践任务

  1. 登录 linuxdc(SecureCRT 端口 2222,ops 用户,密钥认证,sudo -i 切换 root)。
  2. 安装 OpenVPN 和 Easy-RSA,完成 PKI 初始化:init-pkibuild-cagen-req serversign-req servergen-dhgenkey ta.key
  3. 创建 server.conf,配置防火墙(add-service=openvpn + add-masquerade)和 SELinux,启动服务,验证 UDP 1194 监听。
  4. 生成客户端证书 client01,创建 client01.conf 配置文件。
  5. 安装 Libreswan,创建 site-to-site.confsite-to-site.secrets,执行 ipsec verify 查看配置诊断。
  6. 执行 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 加密套件)。两者各有侧重,互为补充,共同构成企业远程访问与多站点互联的安全加密网络基础设施。