本文目录导读:

strongSwan 是一个开源的 IPsec VPN 解决方案,常用于 Linux 系统,它实现了 IKEv1 和 IKEv2 协议,用于建立安全的 IPsec 隧道。
以下是使用 strongSwan 实现 IPsec VPN 的核心机制、典型架构及配置步骤:
核心实现机制
strongSwan 通过以下组件和流程实现 VPN:
- charon daemon:这是 strongSwan 的 IKE 守护进程,负责处理密钥交换(IKE_SA)、协商安全策略、建立子通道(CHILD_SA)。
- ipsec 命令:用于控制和管理 strongSwan 服务的脚本(
ipsec start,ipsec status)。 - 配置后端:默认使用
swanctl.conf(新版) 或ipsec.conf(旧版),建议使用swanctl因为它配置更清晰、功能更全。
工作流程(简化):
- 初始化:客户端(
initiator)向服务器(responder)发起连接请求。 - 身份验证:双方验证彼此身份(通过预共享密钥 PSK、证书、EAP 等)。
- 密钥协商:通过 DH(Diffie-Hellman) 算法生成会话密钥。
- 建立隧道:在双方内核的网络安全层创建 SA(安全联盟),加载加密和认证密钥。
- 数据传输:用户数据(如 HTTP 流量)被加密后通过虚拟网卡(如
tun0)或直接通过策略路由发送到对端。
常见实现场景与配置示例
场景 A:站点到站点(Site-to-Site)VPN
用于连接两个不同的局域网,例如公司总部与分公司。
拓扑:
- 左端网关(Left):
1.1.0/24<-> 公网 IP0.113.1 - 右端网关(Right):
2.2.0/24<-> 公网 IP51.100.1
配置文件 (/etc/swanctl/swanctl.conf):
# 在左端网关上的配置
connections {
site-to-site {
version = 2 # 使用 IKEv2
local_addrs = 203.0.113.1 # 本地公网 IP
remote_addrs = 198.51.100.1 # 对端公网 IP
local {
auth = psk
id = "left-gateway.example.com"
}
remote {
auth = psk
id = "right-gateway.example.com"
}
children {
net {
local_ts = 10.1.1.0/24 # 本地子网
remote_ts = 10.2.2.0/24 # 远程子网
esp_proposals = aes256-sha256-modp2048
start_action = trap # 当有流量触发时自动建立隧道
}
}
}
}
# 密钥(需要在两台机器上相同)
secrets {
ike-site-secret {
id = "left-gateway.example.com"
secret = "MyVeryStrongPSK123!"
}
}
启动命令:
sudo swanctl --load-all sudo swanctl --initiate --child site-to-site
场景 B:远程访问(Road Warrior / Remote Access)
允许员工通过手机或笔记本安全接入公司内网。
配置步骤(服务器端):
- 安装证书:服务器需要有 CA 签发的证书和私钥,客户端也需要安装相同的 CA 根证书和客户端证书。
- 服务器配置:
# /etc/swanctl/swanctl.conf
connections {
rw-vpn {
version = 2
pools = internal-pool # 分配给客户端的虚拟 IP 池
local {
auth = pubkey # 服务器使用证书认证
certs = serverCert.pem
id = @vpn.example.com # 服务器的标识,需要与客户端连接的域名匹配
}
remote {
auth = eap-tls # 客户端使用 EAP-TLS(证书)认证
# 或者使用 auth = pubkey (只验证客户端证书,不验证用户名)
}
children {
net {
local_ts = 0.0.0.0/0 # 代表全流量(Split/Full Tunnel)
# 如果只想访问内网,可以写:local_ts = 10.0.0.0/8
remote_ts = dynamic # 客户端 IP 由服务器分配
updown = /usr/lib/ipsec/_updown iptables
start_action = trap
}
}
}
}
pools {
internal-pool {
addrs = 10.10.10.0/24 # 分配给客户端的 IP 范围
dns = 8.8.8.8
}
}
客户端(Android/iOS/Win10 原生客户端):
- 类型:IKEv2
- 服务器:
vpn.example.com - 认证方式:证书(导入客户端证书和 CA 证书)
关键参数与优化建议
| 参数 | 建议值 | 说明 |
|---|---|---|
| 密钥交换算法 | modp2048 或 curve25519 |
避免使用过弱的 modp1024。curve25519 更安全且速度快。 |
| 加密算法 | aes256-gcm 或 chacha20poly1305 |
GCM 模式自带认证,性能更好。 |
| 完整性算法 | sha256 或 sha384 |
避免使用 MD5 或 SHA1。 |
| DH 分组 | modp2048 或 ecp384 |
确保前向安全性。 |
| 生命周期 | lifetime = 8h (IKE) / lifetime = 1h (IPsec) |
到期后自动重新协商密钥。 |
| MOBIKE | mobike = yes |
移动客户端切换网络时不断线。 |
高级功能
- NAT 穿透:当双方都位于 NAT 设备后时,strongSwan 自动启用
nat_traversal = yes(默认开启)。 - 分隧道(Split Tunneling):只将特定内网流量(如
0.0.0/8)通过 VPN,其他流量直连互联网,通过调整local_ts和内核路由表实现。 - 高可用性(HA):见下方
charon-systemd插件,支持多节点集群。
调试与排错
VPN 连接失败,可以使用以下命令:
# 查看服务状态 sudo systemctl status strongswan # 实时日志监控 sudo journalctl -u strongswan -f # 或者查看传统日志 sudo swanctl --log # 手动触发连接测试 sudo swanctl --initiate --child <connection_name>
常见问题:
- 防火墙规则:确保 UDP 端口
500(IKE) 和4500(NAT-T) 已开放。 - 内核配置:确认
/proc/sys/net/ipv4/ip_forward已设为1。 - 证书问题:检查证书链是否完整,客户端时间是否同步(影响证书有效期验证)。
strongSwan 通过高性能的 charon 守护进程,结合内核的 IPsec 协议栈,实现了稳定、安全的 VPN,无论是简单的主机到主机加密,还是大规模的企业远程访问,它都能胜任,关键在于正确选择认证方式(PSK vs 证书)、强力加密算法以及合理的路由策略。
标签: strongSwan IPsec VPN