Skip to content

VPN 技术详解与搭建实战 — IPSec、OpenVPN、WireGuard

Published:
12 min read

虚拟专用网络(VPN)通过加密隧道技术在公共网络上构建安全的私密通信通道,是远程办公、站点互联和隐私保护的核心技术。本文将从 VPN 的基本原理出发,深入讲解 IPSec、OpenVPN 和 WireGuard 三种主流 VPN 方案的工作机制,并提供完整的搭建配置示例。

VPN 的工作原理

隧道协议

VPN 的核心是隧道封装(Tunneling):将原始数据包封装在另一个协议的数据包内进行传输。外层协议负责在公网上路由,内层协议承载真实的通信数据。常见的隧道协议包括:

加密传输

VPN 通过以下机制保障数据安全:

IPSec VPN 详解

IPSec(Internet Protocol Security)是一组在网络层提供安全服务的协议族,包括 AH(认证头)、ESP(封装安全载荷)和 IKE(因特网密钥交换)协议。

IKE 协商过程

IKE 协商分为两个阶段:

阶段一(IKE SA):在双方之间建立一条安全的管理通道,协商加密算法、认证方式等参数。支持主模式(Main Mode,6 个包交换)和积极模式(Aggressive Mode,3 个包交换)。

阶段二(IPSec SA):在 IKE SA 的保护下协商数据传输的安全参数,建立用于实际数据加密的 IPSec SA,使用快速模式(Quick Mode)。

传输模式 vs 隧道模式

特性传输模式隧道模式
加密范围仅加密 IP 载荷加密整个原始 IP 包
IP 头部保留原始 IP 头新增外层 IP 头
适用场景主机到主机通信网关到网关(站点互联)
NAT 穿越困难支持(通过 NAT-T)

StrongSwan IPSec 配置示例

# 安装 StrongSwan
sudo apt install -y strongswan strongswan-pki libcharon-extra-plugins

服务端配置(/etc/ipsec.conf):

# /etc/ipsec.conf - StrongSwan IPSec VPN 服务端

config setup
    charondebug="ike 2, knl 2, cfg 2, net 2"
    uniqueids=never

conn %default
    keyexchange=ikev2
    ike=aes256-sha256-modp2048!
    esp=aes256-sha256!
    dpdaction=clear
    dpddelay=300s
    rekey=no

conn site-to-site
    left=203.0.113.1            # 本端公网IP
    leftsubnet=192.168.1.0/24   # 本端内网网段
    leftcert=server.cert.pem
    leftid=@vpn-server
    right=198.51.100.1           # 对端公网IP
    rightsubnet=10.0.0.0/24      # 对端内网网段
    rightid=@vpn-client
    auto=start

conn remote-access
    left=%any
    leftsubnet=0.0.0.0/0
    leftcert=server.cert.pem
    leftid=@vpn-server
    right=%any
    rightdns=8.8.8.8,8.8.4.4
    rightsourceip=10.10.10.0/24  # 分配给客户端的IP池
    auto=add

预共享密钥配置(/etc/ipsec.secrets):

# /etc/ipsec.secrets
: RSA server.key.pem
vpn-client : EAP "SecurePassword123!"
# 启动 IPSec
sudo systemctl enable strongswan-starter
sudo systemctl start strongswan-starter

# 查看 SA 状态
sudo ipsec statusall

OpenVPN 搭建实战

OpenVPN 基于 SSL/TLS 协议,运行在用户空间,支持 TCP 和 UDP 传输,配置灵活,是最广泛使用的开源 VPN 方案之一。

生成 PKI 证书体系

# 安装 OpenVPN 和 Easy-RSA
sudo apt install -y openvpn easy-rsa

# 初始化 PKI
make-cadir ~/openvpn-ca && cd ~/openvpn-ca
./easyrsa init-pki

# 创建 CA 根证书
./easyrsa build-ca nopass
# Common Name: OpenVPN-CA

# 生成服务端证书和密钥
./easyrsa gen-req server nopass
./easyrsa sign-req server server

# 生成客户端证书
./easyrsa gen-req client1 nopass
./easyrsa sign-req client client1

# 生成 DH 参数
./easyrsa gen-dh

# 生成 TLS-Auth 密钥(防 DoS 攻击)
openvpn --genkey secret ta.key

服务端配置 server.conf

# /etc/openvpn/server/server.conf

# 基本设置
port 1194
proto udp
dev tun
topology subnet

# 证书和密钥
ca /etc/openvpn/server/ca.crt
cert /etc/openvpn/server/server.crt
key /etc/openvpn/server/server.key
dh /etc/openvpn/server/dh.pem
tls-auth /etc/openvpn/server/ta.key 0

# 网络配置
server 10.8.0.0 255.255.255.0          # VPN 子网
push "redirect-gateway def1 bypass-dhcp" # 全部流量走VPN
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 1.1.1.1"

# 允许客户端之间通信
client-to-client

# 安全设置
cipher AES-256-GCM
auth SHA256
tls-version-min 1.2
tls-cipher TLS-ECDHE-ECDSA-WITH-AES-256-GCM-SHA384:TLS-ECDHE-RSA-WITH-AES-256-GCM-SHA384

# 性能优化
sndbuf 524288
rcvbuf 524288
push "sndbuf 524288"
push "rcvbuf 524288"
txqueuelen 1000

# 保活和超时
keepalive 10 120
persist-key
persist-tun

# 权限降低
user nobody
group nogroup

# 日志
status /var/log/openvpn/status.log
log-append /var/log/openvpn/openvpn.log
verb 3
mute 20

# 最大客户端数
max-clients 100

客户端配置 client.conf

# client.conf / client.ovpn

client
dev tun
proto udp
remote your-server-ip 1194
resolv-retry infinite
nobind
persist-key
persist-tun

# 证书(可内嵌或指定路径)
ca ca.crt
cert client1.crt
key client1.key
tls-auth ta.key 1

# 安全设置
cipher AES-256-GCM
auth SHA256
tls-version-min 1.2

# 验证服务端证书
remote-cert-tls server
verify-x509-name server name

verb 3

服务端启动与管理

# 启用 IP 转发
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
sysctl -p

# 配置 NAT(iptables)
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE

# 启动 OpenVPN
sudo systemctl enable openvpn-server@server
sudo systemctl start openvpn-server@server

# 查看连接状态
cat /var/log/openvpn/status.log

WireGuard 搭建实战

WireGuard 是一种现代化 VPN 协议,代码量仅约 4000 行(对比 OpenVPN 约 70000 行),已合入 Linux 5.6+ 内核。它使用 Noise 协议框架进行密钥协商,采用 ChaCha20-Poly1305 加密,Curve25519 密钥交换,性能极其出色。

安装 WireGuard

# Ubuntu 20.04+(已集成到内核)
sudo apt install -y wireguard wireguard-tools

# CentOS 8
sudo yum install -y epel-release elrepo-release
sudo yum install -y kmod-wireguard wireguard-tools

密钥生成

# 生成服务端密钥对
wg genkey | tee server_private.key | wg pubkey > server_public.key

# 生成客户端密钥对
wg genkey | tee client1_private.key | wg pubkey > client1_public.key

# 生成预共享密钥(可选,增强安全性)
wg genpsk > preshared.key

# 设置密钥文件权限
chmod 600 server_private.key client1_private.key

服务端配置

# /etc/wireguard/wg0.conf

[Interface]
# 服务端私钥
PrivateKey = SERVER_PRIVATE_KEY_HERE
# VPN 接口地址
Address = 10.66.66.1/24, fd86:ea04:1115::1/64
# 监听端口
ListenPort = 51820
# 启动/关闭时的 iptables 规则
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE; ip6tables -A FORWARD -i %i -j ACCEPT; ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE; ip6tables -D FORWARD -i %i -j ACCEPT; ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
# DNS
DNS = 8.8.8.8, 1.1.1.1
# 保存配置修改
SaveConfig = true

[Peer]
# 客户端1 公钥
PublicKey = CLIENT1_PUBLIC_KEY_HERE
# 预共享密钥(可选)
PresharedKey = PRESHARED_KEY_HERE
# 允许的 IP 范围
AllowedIPs = 10.66.66.2/32, fd86:ea04:1115::2/128

客户端配置

# /etc/wireguard/wg0.conf(客户端)

[Interface]
PrivateKey = CLIENT1_PRIVATE_KEY_HERE
Address = 10.66.66.2/24, fd86:ea04:1115::2/64
DNS = 8.8.8.8, 1.1.1.1
# 可选:防止 DNS 泄漏
# PostUp = resolvectl dns %i 8.8.8.8; resolvectl domain %i "~."

[Peer]
PublicKey = SERVER_PUBLIC_KEY_HERE
PresharedKey = PRESHARED_KEY_HERE
# 全部流量走 VPN
AllowedIPs = 0.0.0.0/0, ::/0
# 服务端公网地址
Endpoint = your-server-ip:51820
# 保活(NAT穿越需要)
PersistentKeepalive = 25

WireGuard 管理命令

# 启动接口
sudo wg-quick up wg0

# 关闭接口
sudo wg-quick down wg0

# 设置开机自启
sudo systemctl enable wg-quick@wg0

# 查看连接状态
sudo wg show

# 实时监控
sudo wg show wg0 latest-handshakes

# 动态添加 Peer(无需重启)
sudo wg set wg0 peer CLIENT2_PUBLIC_KEY allowed-ips 10.66.66.3/32

# 删除 Peer
sudo wg set wg0 peer CLIENT2_PUBLIC_KEY remove

三者性能与安全性对比

特性IPSec (IKEv2)OpenVPNWireGuard
协议层网络层(L3)应用层(SSL/TLS)网络层(L3)
代码量约 40万行约 7万行约 4000行
加密算法可配置(AES等)可配置(AES等)固定(ChaCha20)
性能高(内核态)中(用户态)极高(内核态)
NAT 穿越NAT-T(UDP 4500)原生支持原生支持
移动端支持优秀(IKEv2)良好优秀
配置复杂度
审计难度高(代码庞大)低(代码精简)
适用场景企业站点互联通用远程接入高性能场景

安全建议

  1. 禁用弱加密算法:IPSec 中禁用 DES、3DES、MD5,OpenVPN 中使用 AES-256-GCM 和 SHA256+。
  2. 证书而非 PSK:生产环境优先使用数字证书进行身份认证,避免预共享密钥带来的安全风险。
  3. 定期轮换密钥:WireGuard 密钥、OpenVPN 证书都应定期更换。
  4. 最小化 AllowedIPs:WireGuard 中精确配置每个 Peer 的允许 IP 范围,避免使用 0.0.0.0/0(除非全流量代理)。
  5. 启用 Perfect Forward Secrecy:确保 IPSec 和 OpenVPN 配置中启用 PFS(ECDH 密钥交换),防止长期密钥泄露导致历史流量被解密。
  6. 防火墙联动:VPN 服务器上仅开放 VPN 端口,其余管理端口通过 VPN 隧道访问。
  7. 日志审计:记录 VPN 连接/断开事件,监控异常连接行为。

总结

VPN 技术是网络安全基础设施的重要组成部分。IPSec 适合企业级站点互联场景,配置复杂但功能全面;OpenVPN 凭借灵活性和跨平台能力成为最通用的远程接入方案;WireGuard 以极简设计和卓越性能代表了 VPN 技术的未来方向。在实际选型中,应根据业务需求、性能要求和运维能力综合考量。无论选择哪种方案,都必须坚持使用强加密算法、完善的身份认证和严格的访问控制,确保 VPN 隧道的安全可靠。