青

一言

StrongSwan 概述及配置

StrongSwan 概述及配置

AIGC 提醒

本文 超过85% 内容使用 AIGC 技术生成,使用的模型包括: Claude-4-sonnet
在发布之前已进行人工整理修正,过程中尽可能确保信息真实可信,但还请在参考采用前更多进行验证。

通过StrongSwan构建IKEv2/IPSec完全技术指南

一、StrongSwan和IKEv2/IPSec技术概述

1.1 StrongSwan简介

StrongSwan是一个开源、模块化、可移植的基于IPSec的VPN解决方案,专注于强身份验证机制和高度安全的通信。作为FreeS/WAN项目的后继者,StrongSwan继承了其GPL许可证,并在此基础上进行了大量改进和现代化。

发展历程与特点:

  • StrongSwan起源于已停止维护的FreeS/WAN项目,由瑞士应用科学大学通信安全教授Andreas Steffen维护
  • 完全实现了RFC 7296定义的Internet Key Exchange (IKEv2)协议
  • 采用现代多线程架构设计,具有良好的扩展性
  • 支持多种操作系统平台,包括Linux、Android、FreeBSD、macOS等

核心优势:

  • 模块化架构:通过插件系统提供加密算法、凭证管理、身份验证方法等功能
  • 完整的IPv6支持:全面支持IPv6 IPSec隧道和传输模式
  • MOBIKE协议支持:支持移动客户端的动态IP地址和接口更新
  • 多加密库支持:用户可选择OpenSSL、gcrypt等加密库
  • 椭圆曲线密码学:支持ECDH组和ECDSA证书及签名

1.2 IKEv2/IPSec技术架构

IPSec(Internet Protocol Security)是一套协议集合,用于在IP层提供安全服务。它主要由两部分组成:

  1. IKE(Internet Key Exchange):负责密钥协商、身份验证和安全关联建立
  2. IPSec协议:负责实际数据包的加密、认证和传输保护
1
2
3
4
5
6
7
8
9
10
11
应用层数据

传输层(TCP/UDP)

ESP/AH(IPSec协议)

IP层

数据链路层

物理层

二、IKEv2/IPSec工作原理详解

2.1 IKEv2协议流程

IKEv2协议通过以下三个主要阶段建立安全连接:

2.1.1 IKE_SA_INIT阶段

这是IKEv2协商的第一个阶段,主要完成以下任务:

  • 协商加密和认证算法
  • 交换随机数(Nonce)
  • 执行Diffie-Hellman密钥交换

消息交换流程:

1
2
3
4
5
6
7
发起方                    响应方
| |
|--- IKE_SA_INIT请求 --->|
| HDR, SAi1, KEi, Ni |
| |
|<-- IKE_SA_INIT响应 ----|
| HDR, SAr1, KEr, Nr |

在这个阶段,双方协商:

  • 加密算法:如AES-128、AES-256、ChaCha20等
  • 完整性算法:如HMAC-SHA256、HMAC-SHA384等
  • 伪随机函数(PRF):用于密钥派生
  • Diffie-Hellman组:如MODP2048、ECP256等

2.1.2 IKE_AUTH阶段

第二阶段用于身份验证和建立第一个Child SA:

1
2
3
4
5
6
7
8
9
发起方                    响应方
| |
|--- IKE_AUTH请求 ------>|
| HDR, SK {IDi, AUTH, |
| SAi2, TSi, TSr, ...} |
| |
|<-- IKE_AUTH响应 -------|
| HDR, SK {IDr, AUTH, |
| SAr2, TSi, TSr, ...} |

这个阶段的消息使用第一阶段协商的密钥进行加密保护,主要载荷包括:

  • 身份标识(ID):可以是IP地址、FQDN、email地址等
  • 认证载荷(AUTH):包含身份验证数据
  • 流量选择器(TS):定义受保护的流量范围
  • 配置载荷:如虚拟IP地址请求等

2.1.3 CREATE_CHILD_SA阶段

用于创建新的Child SA或对现有SA进行重新密钥:

1
2
3
4
5
6
7
8
9
发起方                    响应方
| |
|-- CREATE_CHILD_SA请求->|
| HDR, SK {SA, Ni, |
| [KEi], TSi, TSr} |
| |
|<-CREATE_CHILD_SA响应---|
| HDR, SK {SA, Nr, |
| [KEr], TSi, TSr} |

2.2 加密机制

2.2.1 对称加密算法

StrongSwan支持多种对称加密算法:

AES(高级加密标准)

  • 密钥长度:128、192、256位
  • 工作模式:CBC、GCM(认证加密)
  • 性能优秀,支持硬件加速(AES-NI)

ChaCha20-Poly1305

  • 现代流密码,软件实现性能出色
  • 特别适合移动设备和没有AES硬件加速的环境
  • 提供256位安全强度

算法选择建议:

1
2
3
4
5
6
7
8
9
10
11
# 高安全性配置
ike = aes256gcm16-sha384-ecp384
esp = aes256gcm16-ecp384

# 高性能配置(有AES-NI支持)
ike = aes128gcm16-sha256-ecp256
esp = aes128gcm16

# 移动设备优化配置
ike = chacha20poly1305-sha256-ecp256
esp = chacha20poly1305

2.2.2 完整性保护

HMAC算法:

  • HMAC-SHA256(推荐):256位输出,当前标准
  • HMAC-SHA384/512:更高安全性,适用于高安全需求
  • HMAC-SHA1:已弱化,仅用于兼容性

AEAD算法:

  • AES-GCM:同时提供加密和完整性保护
  • ChaCha20-Poly1305:现代AEAD算法

2.3 认证方式

2.3.1 预共享密钥(PSK)

PSK是最简单的认证方式,适用于小规模部署:

优点:

  • 配置简单,部署快速
  • 不需要PKI基础设施

缺点:

  • 密钥管理困难,扩展性差
  • 安全性依赖于密钥强度

最佳实践:

1
2
# 生成强密钥
dd if=/dev/urandom count=1 bs=32 2>/dev/null | base64

2.3.2 数字证书认证

基于X.509证书的认证提供更高的安全性:

支持的证书类型:

  • RSA证书:广泛支持,密钥长度建议≥2048位
  • ECDSA证书:性能优秀,密钥短,推荐P-256或P-384曲线
  • EdDSA证书:现代椭圆曲线签名,如Ed25519

2.3.3 EAP认证

可扩展认证协议(EAP)支持多种认证方法:

  • EAP-TLS:基于证书的强认证
  • EAP-MSCHAPv2:用户名/密码认证
  • EAP-RADIUS:委托给RADIUS服务器

2.4 IPSec协议组件

2.4.1 ESP(封装安全载荷)

ESP提供数据机密性、完整性和防重放保护:

隧道模式封装:

1
2
3
[新IP头] [ESP头] [原始IP包] [ESP尾] [ESP认证数据]
|<------- 加密 ------->|
|<--------- 认证 ------------->|

传输模式封装:

1
2
3
[原IP头] [ESP头] [TCP/UDP+数据] [ESP尾] [ESP认证数据]
|<----- 加密 ----->|
|<------- 认证 ---------->|

2.4.2 安全关联(SA)

SA定义了通信双方之间的安全参数:

SA类型:

  • IKE SA:保护IKE协议消息
  • Child SA/IPSec SA:保护用户数据

SA参数:

  • SPI(安全参数索引):32位唯一标识符
  • 加密算法和密钥
  • 认证算法和密钥
  • SA生命周期
  • 序列号计数器

三、StrongSwan配置详解

3.1 现代配置方式(swanctl.conf)

从StrongSwan 5.x开始,推荐使用swanctl配置方式,它提供了更清晰的配置结构和更好的功能支持。

3.1.1 配置文件结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# /etc/swanctl/swanctl.conf
connections {
<连接名> {
# 连接级别参数
local {
# 本地端点配置
}
remote {
# 远程端点配置
}
children {
<子连接名> {
# Child SA配置
}
}
}
}

pools {
# IP地址池配置
}

secrets {
# 认证凭据配置
}

3.1.2 主要配置参数说明

连接参数:

  • version:IKE版本(1或2,默认2)
  • local_addrs:本地地址
  • remote_addrs:远程地址
  • local_port:本地IKE端口(默认500)
  • remote_port:远程IKE端口(默认500)
  • proposals:IKE提议
  • fragmentation:IKE分片支持
  • send_certreq:是否发送证书请求
  • send_cert:证书发送策略

认证参数:

  • auth:认证方法(pubkey、psk、eap等)
  • id:身份标识
  • eap_id:EAP身份
  • certs:证书文件
  • cacerts:CA证书

Child SA参数:

  • local_ts:本地流量选择器
  • remote_ts:远程流量选择器
  • start_action:启动动作(none、trap、start)
  • close_action:关闭动作(none、trap、start、restart)
  • dpd_action:DPD动作(clear、trap、restart)
  • mode:IPSec模式(tunnel、transport)
  • rekey_time:重新密钥时间
  • life_time:SA生命周期

3.2 传统配置方式(ipsec.conf)

虽然已被标记为过时,但仍有许多部署使用传统配置:

3.2.1 ipsec.conf结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
config setup
# 全局配置参数
charondebug="ike 2, knl 3, cfg 2"
uniqueids=yes

conn %default
# 默认连接参数
keyexchange=ikev2
ike=aes256-sha256-modp2048
esp=aes256-sha256

conn site-to-site
# 具体连接配置
left=192.168.1.1
leftsubnet=10.1.0.0/16
right=192.168.2.1
rightsubnet=10.2.0.0/16
auto=start

3.2.2 关键参数详解

身份和地址参数:

  • left/right:端点IP地址或主机名
  • leftid/rightid:身份标识符
  • leftsubnet/rightsubnet:保护的子网
  • leftsourceip/rightsourceip:虚拟IP配置

认证参数:

  • leftauth/rightauth:认证方法
  • leftcert/rightcert:证书路径
  • leftca/rightca:要求的CA

协议参数:

  • keyexchange:密钥交换版本(ikev1、ikev2)
  • ike:IKE加密提议
  • esp:ESP加密提议
  • type:连接类型(tunnel、transport)

生命周期和重新密钥:

  • ikelifetime:IKE SA生命周期
  • lifetime:IPSec SA生命周期
  • margintime:重新密钥提前时间
  • rekeymargin:重新密钥余量
  • rekeyfuzz:重新密钥随机化

3.3 ipsec.secrets配置

认证凭据存储在ipsec.secrets文件中:

1
2
3
4
5
6
7
8
9
10
11
12
13
# PSK格式
192.168.1.1 192.168.2.1 : PSK "SharedSecretKey"
%any : PSK "GlobalSharedKey"

# RSA私钥
: RSA /etc/ipsec.d/private/server-key.pem

# EAP凭据
alice : EAP "password123"
bob@example.com : EAP "secretpass"

# XAUTH凭据(IKEv1)
john : XAUTH "xauthpass"

四、常见应用场景配置

4.1 站点到站点VPN(Site-to-Site)

4.1.1 基本配置示例

网络拓扑:

1
站点A: 10.1.0.0/16 <---> [网关A: 1.1.1.1] ===IPSec=== [网关B: 2.2.2.2] <---> 站点B: 10.2.0.0/16

网关A配置(swanctl.conf):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
connections {
net-net {
local_addrs = 1.1.1.1
remote_addrs = 2.2.2.2

local {
auth = psk
id = gateway-a@example.com
}
remote {
auth = psk
id = gateway-b@example.com
}

children {
net-net {
local_ts = 10.1.0.0/16
remote_ts = 10.2.0.0/16
start_action = trap
dpd_action = restart
}
}
}
}

secrets {
ike-net-net {
id = gateway-a@example.com
secret = "StrongSharedSecret123!"
}
}

4.1.2 多子网配置

当需要连接多个子网时:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
connections {
multi-subnet {
local_addrs = gateway-a.example.com
remote_addrs = gateway-b.example.com

local {
auth = pubkey
certs = gateway-a.pem
id = gateway-a.example.com
}
remote {
auth = pubkey
id = gateway-b.example.com
}

children {
multi-subnet {
local_ts = 10.1.0.0/16,10.10.0.0/16,172.16.0.0/24
remote_ts = 10.2.0.0/16,10.20.0.0/16,172.17.0.0/24
start_action = trap
esp_proposals = aes256gcm16-ecp384
}
}
}
}

4.1.3 冗余网关配置

实现高可用性的冗余配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
connections {
primary-link {
local_addrs = local-primary.example.com
remote_addrs = remote-primary.example.com

# ... 认证配置 ...

children {
primary {
local_ts = 192.168.0.0/16
remote_ts = 10.0.0.0/8
start_action = start
dpd_action = restart
dpd_timeout = 60s
}
}
}

backup-link {
local_addrs = local-backup.example.com
remote_addrs = remote-backup.example.com

# ... 相同的认证配置 ...

children {
backup {
local_ts = 192.168.0.0/16
remote_ts = 10.0.0.0/8
start_action = trap
dpd_action = start
priority = 2 # 较低优先级
}
}
}
}

4.2 远程访问VPN(Remote Access)

4.2.1 证书认证配置

服务器端配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
connections {
rw-cert {
pools = rw_pool

local {
auth = pubkey
certs = server-cert.pem
id = vpn.company.com
}
remote {
auth = pubkey
cacerts = company-ca.pem
}

children {
rw-cert {
local_ts = 10.0.0.0/8,192.168.0.0/16
esp_proposals = aes256gcm16-ecp384,aes256-sha256-modp2048
}
}
}
}

pools {
rw_pool {
addrs = 10.100.0.0/16
dns = 8.8.8.8,8.8.4.4
# 分离隧道配置
split_include = 10.0.0.0/8,192.168.0.0/16
}
}

客户端配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
connections {
company-vpn {
remote_addrs = vpn.company.com
vips = 0.0.0.0

local {
auth = pubkey
certs = client-cert.pem
id = "C=CN, O=Company, CN=user@company.com"
}
remote {
auth = pubkey
id = vpn.company.com
}

children {
company-vpn {
remote_ts = 0.0.0.0/0
start_action = start
close_action = restart
}
}
}
}

4.2.2 用户名密码认证(EAP)

服务器端配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
connections {
rw-eap {
pools = eap_pool
send_certreq = no

local {
auth = pubkey
certs = server-cert.pem
id = vpn.company.com
}
remote {
auth = eap-mschapv2
eap_id = %any
}

children {
rw-eap {
local_ts = 0.0.0.0/0,::/0
dpd_action = clear
}
}
}
}

pools {
eap_pool {
addrs = 10.200.0.0/16
dns = 10.1.1.53,10.1.2.53
}
}

secrets {
eap-alice {
id = alice
secret = "AlicePassword123"
}
eap-bob {
id = bob
secret = "BobSecretPass456"
}
}

4.3 移动客户端配置

4.3.1 iOS/iPhone配置

iOS原生支持IKEv2,服务器端需要特殊配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
connections {
ios-ikev2 {
pools = ios_pool
send_cert = always
send_certreq = no

local {
auth = pubkey
certs = server-cert.pem
id = vpn.company.com
}
remote {
auth = eap-mschapv2
eap_id = %any
}

children {
ios-ikev2 {
local_ts = 0.0.0.0/0
dpd_action = clear
esp_proposals = aes256-sha256,aes128-sha256
}
}
}
}

4.3.2 Android StrongSwan应用配置

Android客户端支持更多的配置选项:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
connections {
android-ikev2 {
pools = android_pool

local {
auth = pubkey
certs = server-cert.pem
id = @vpn.company.com
}
remote {
auth = eap-mschapv2
eap_id = %any
}

children {
android-ikev2 {
local_ts = 0.0.0.0/0,::/0
dpd_action = clear
# 支持MOBIKE用于网络切换
mobike = yes
}
}
}
}

4.3.3 Windows内置VPN客户端

Windows 10/11对IKEv2支持需要注意证书和加密套件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
connections {
windows-clients {
pools = windows_pool
fragmentation = yes
send_cert = always

local {
auth = pubkey
certs = server-cert.pem
id = vpn.company.com
}
remote {
auth = eap-mschapv2
eap_id = %any
}

children {
windows-clients {
local_ts = 0.0.0.0/0
# Windows兼容的加密套件
esp_proposals = aes256-sha256-modp2048,aes128-sha256-modp2048
}
}
}
}

4.4 多站点互联配置

4.4.1 轮辐式拓扑(Hub-and-Spoke)

中心节点(Hub)配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
connections {
spoke-template {
local {
auth = psk
id = hub.company.com
}
remote {
auth = psk
}
}

to-spoke1 {
also = spoke-template
remote_addrs = spoke1.company.com
remote {
id = spoke1.company.com
}

children {
to-spoke1 {
local_ts = 10.0.0.0/16,10.2.0.0/16,10.3.0.0/16
remote_ts = 10.1.0.0/16
start_action = trap
}
}
}

to-spoke2 {
also = spoke-template
remote_addrs = spoke2.company.com
remote {
id = spoke2.company.com
}

children {
to-spoke2 {
local_ts = 10.0.0.0/16,10.1.0.0/16,10.3.0.0/16
remote_ts = 10.2.0.0/16
start_action = trap
}
}
}
}

4.4.2 全网状拓扑(Full Mesh)

每个站点都需要配置到其他所有站点的连接:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 站点A配置
connections {
to-site-b {
local_addrs = site-a.company.com
remote_addrs = site-b.company.com

local {
auth = pubkey
certs = site-a.pem
id = site-a.company.com
}
remote {
auth = pubkey
id = site-b.company.com
}

children {
site-a-to-b {
local_ts = 10.1.0.0/16
remote_ts = 10.2.0.0/16
start_action = trap
}
}
}

to-site-c {
# 类似配置到站点C
}
}

五、调试和故障排除

5.1 日志配置与分析

5.1.1 日志级别设置

StrongSwan提供了详细的日志级别控制:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# strongswan.conf
charon {
filelog {
/var/log/strongswan.log {
time_format = %b %e %T
ike_name = yes
append = no
default = 1
flush_line = yes

# 子系统日志级别
ike = 2 # IKE协商
cfg = 2 # 配置后端
knl = 3 # 内核接口
net = 2 # 网络通信
enc = 1 # 消息编码
chd = 2 # CHILD_SA
job = 1 # 作业处理
lib = 1 # 库操作
}
}
}

日志级别说明:

  • -1:完全静默
  • 0:基本审计日志
  • 1:通用控制流程和错误
  • 2:更详细的调试信息
  • 3:包含原始数据转储
  • 4:包含敏感材料(密钥)

5.1.2 常见日志分析

成功连接日志特征:

1
2
3
authentication of 'peer-identity' with RSA signature successful
IKE_SA conn-name[1] established between local[client]...remote[server]
CHILD_SA conn-name{1} established with SPIs xxx_i xxx_o

认证失败日志:

1
2
3
no trusted RSA public key found for 'identity'
authentication failed, tried N authentication methods
received AUTHENTICATION_FAILED notify error

5.2 常见问题解决

5.2.1 认证问题

PSK不匹配:

1
2
3
4
5
6
7
8
9
# 症状
invalid HASH_V1 payload length, decryption failed?
authentication failed

# 解决方案
1. 确认两端PSK完全一致
2. 检查ipsec.secrets中的身份关联
3. 使用高熵密钥:
openssl rand -base64 32

证书问题:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 症状
certificate validation failed
no trusted certificate found

# 解决方案
1. 验证证书链完整性:
openssl verify -CAfile ca.pem server.pem

2. 检查证书有效期:
openssl x509 -in cert.pem -noout -dates

3. 确认证书主题与配置的ID匹配:
openssl x509 -in cert.pem -noout -subject

5.2.2 NAT穿越问题

配置NAT-T:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
connections {
nat-traversal {
# 强制UDP封装
encap = yes
# 启用MOBIKE支持漫游
mobike = yes

children {
nat-traversal {
# NAT保活设置
dpd_delay = 20s
dpd_timeout = 60s
}
}
}
}

防火墙规则:

1
2
3
# 允许IKE和NAT-T端口
iptables -A INPUT -p udp --dport 500 -j ACCEPT
iptables -A INPUT -p udp --dport 4500 -j ACCEPT

5.2.3 MTU和分片问题

症状:

  • 连接建立成功但无法传输大数据包
  • 性能严重下降

解决方案:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 设置MSS钳制
iptables -t mangle -A FORWARD -m policy --pol ipsec --dir in \
-p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1360

# 在连接配置中启用分片
connections {
conn-name {
fragmentation = yes
children {
child-name {
# 降低MTU
mtu = 1400
}
}
}
}

5.3 性能优化

5.3.1 硬件加速

启用硬件加速以提高性能:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 检查AES-NI支持
grep -i aes /proc/cpuinfo

# 加载加速模块
modprobe aesni-intel

# 配置使用硬件加速的算法
connections {
high-performance {
children {
high-performance {
# 使用AES-GCM获得最佳性能
esp_proposals = aes256gcm16,aes128gcm16
}
}
}
}

5.3.2 系统优化

内核参数调优:

1
2
3
4
5
6
7
8
9
10
11
12
13
# /etc/sysctl.conf
# 增加网络缓冲区
net.core.rmem_max = 134217728
net.core.wmem_max = 134217728
net.ipv4.tcp_rmem = 4096 87380 134217728
net.ipv4.tcp_wmem = 4096 65536 134217728

# 增加连接跟踪表大小
net.netfilter.nf_conntrack_max = 1048576

# 优化IPSec处理
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.all.accept_redirects = 0

5.3.3 连接池和SA重用

通过适当的生命周期配置优化SA重用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
connections {
optimized {
# 延长IKE SA生命周期减少重新协商
reauth_time = 86400 # 24小时

children {
optimized {
# Child SA配置
rekey_time = 3600 # 1小时
life_time = 3900 # 略大于rekey_time
rand_time = 300 # 随机化避免同时重新密钥
}
}
}
}

5.4 监控和维护

5.4.1 状态监控脚本

创建自动化监控脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/bin/bash
# strongswan-monitor.sh

echo "=== StrongSwan状态监控 ==="
echo "时间: $(date)"

echo -e "\n--- 活动的IKE SA ---"
swanctl --list-sas

echo -e "\n--- 已安装的策略 ---"
swanctl --list-pols

echo -e "\n--- 系统统计 ---"
swanctl --stats

echo -e "\n--- XFRM状态 ---"
ip xfrm state show

echo -e "\n--- 连接错误 ---"
journalctl -u strongswan --since="1 hour ago" | grep -i "error\|fail"

5.4.2 证书自动更新

实现证书到期前自动更新:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash
# cert-renewal.sh

CERT_DIR="/etc/swanctl/x509"
DAYS_WARNING=30

for cert in $CERT_DIR/*.pem; do
if [ -f "$cert" ]; then
expiry=$(openssl x509 -in "$cert" -noout -enddate | cut -d= -f2)
expiry_epoch=$(date -d "$expiry" +%s)
current_epoch=$(date +%s)
days_left=$(( (expiry_epoch - current_epoch) / 86400 ))

if [ $days_left -le $DAYS_WARNING ]; then
echo "警告: $cert 将在 $days_left 天后过期"
# 在此处添加更新逻辑
fi
fi
done

六、安全最佳实践

6.1 加密算法选择

根据安全需求选择适当的加密套件:

高安全性配置:

1
2
3
# 使用强加密和大DH组
ike = aes256gcm16-prfsha384-ecp521,aes256-sha384-ecp384
esp = aes256gcm16-ecp384,aes256-sha384-ecp384

平衡性能与安全:

1
2
3
# 推荐配置
ike = aes256gcm16-prfsha256-ecp384,aes128gcm16-prfsha256-ecp256
esp = aes256gcm16,aes128gcm16

6.2 防火墙配置

正确配置防火墙规则保护VPN服务:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/bin/bash
# ipsec-firewall.sh

# 清除现有规则
iptables -F

# 允许IKE流量
iptables -A INPUT -p udp --dport 500 -j ACCEPT
iptables -A INPUT -p udp --dport 4500 -j ACCEPT

# 允许ESP流量
iptables -A INPUT -p esp -j ACCEPT

# 允许已建立的连接
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 允许IPSec策略匹配的转发流量
iptables -A FORWARD -m policy --pol ipsec --dir in -j ACCEPT
iptables -A FORWARD -m policy --pol ipsec --dir out -j ACCEPT

# 防止IPSec绕过
iptables -A FORWARD -s 10.0.0.0/8 -m policy --pol none -j DROP

# NAT规则(如果需要)
iptables -t nat -A POSTROUTING -s 10.100.0.0/16 -o eth0 -j MASQUERADE

6.3 审计和合规

配置详细的审计日志以满足合规要求:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
charon {
syslog {
auth {
default = -1
ike = 0 # 记录所有认证事件
cfg = 0 # 记录配置更改
}
}

# 审计特定事件
plugins {
audit {
# 记录所有连接尝试
log_level = 2
}
}
}

七、高级配置场景

7.1 云服务提供商集成

7.1.1 AWS VPC连接

配置到AWS VPC的站点到站点VPN:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
connections {
aws-vpc {
local_addrs = %any
remote_addrs = aws-vpn-gateway.amazonaws.com

local {
auth = psk
id = on-premises-gateway
}
remote {
auth = psk
id = aws-vpn-gateway
}

children {
aws-tunnel1 {
local_ts = 192.168.0.0/16
remote_ts = 172.31.0.0/16
start_action = start
close_action = restart
dpd_action = restart

# AWS兼容性设置
esp_proposals = aes128-sha1-modp1024
mode = tunnel
}
}
}
}

7.1.2 Azure VPN Gateway

连接到Azure虚拟网络:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
connections {
azure-vnet {
local_addrs = on-prem-gateway.company.com
remote_addrs = azure-gateway.cloudapp.net

local {
auth = psk
id = on-prem-gateway
}
remote {
auth = psk
id = azure-gateway
}

children {
azure-vnet {
local_ts = 192.168.0.0/16
remote_ts = 10.0.0.0/16

# Azure推荐配置
esp_proposals = aes256-sha256-modp2048
dpd_delay = 30s
dpd_timeout = 120s
}
}
}
}

7.2 IPv6支持

配置双栈VPN支持IPv4和IPv6:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
connections {
dual-stack {
local_addrs = 2001:db8:1::1,192.168.1.1
remote_addrs = 2001:db8:2::1,192.168.2.1

local {
auth = pubkey
certs = dual-stack.pem
}
remote {
auth = pubkey
id = remote.example.com
}

children {
dual-stack-v4 {
local_ts = 10.1.0.0/16
remote_ts = 10.2.0.0/16
start_action = trap
}

dual-stack-v6 {
local_ts = 2001:db8:a::/48
remote_ts = 2001:db8:b::/48
start_action = trap
}
}
}
}

pools {
dual_pool_v4 {
addrs = 10.100.0.0/16
}
dual_pool_v6 {
addrs = 2001:db8:100::/64
}
}

7.3 基于路由的VPN(VTI)

使用虚拟隧道接口实现基于路由的VPN:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
connections {
vti-based {
local_addrs = local.example.com
remote_addrs = remote.example.com

local {
auth = psk
id = local-vti
}
remote {
auth = psk
id = remote-vti
}

children {
vti {
local_ts = 0.0.0.0/0
remote_ts = 0.0.0.0/0

# 设置VTI接口标识
if_id_in = 42
if_id_out = 42

# 标记数据包用于策略路由
mark_in = 42
mark_out = 42

start_action = trap
close_action = restart
}
}
}
}

配置VTI接口:

1
2
3
4
5
6
7
8
#!/bin/bash
# 创建VTI接口
ip link add vti0 type vti local 192.168.1.1 remote 192.168.2.1 key 42
ip link set vti0 up
ip addr add 10.254.0.1/30 dev vti0

# 配置路由
ip route add 10.2.0.0/16 dev vti0

八、总结

8.1 部署建议

  1. 选择合适的认证方式

    • 小规模部署:PSK简单易用
    • 企业环境:使用证书认证
    • 移动用户:EAP-MSCHAPv2或EAP-TLS
  2. 加密算法选择

    • 优先使用AEAD算法(AES-GCM)
    • 确保足够的密钥长度(AES-256)
    • 使用强DH组(≥2048位MODP或ECP-256)
  3. 性能优化

    • 启用硬件加速
    • 适当配置SA生命周期
    • 优化系统参数
  4. 安全加固

    • 定期更新StrongSwan版本
    • 实施严格的防火墙规则
    • 启用详细的审计日志
    • 定期检查和更新证书

8.2 故障排除流程

  1. 检查基本连接性

    • ping测试
    • 端口连通性(UDP 500/4500)
  2. 验证配置

    • 身份和认证设置
    • 流量选择器匹配
    • 加密提议兼容性
  3. 分析日志

    • 启用详细日志
    • 查找错误模式
    • 对比成功连接日志
  4. 使用诊断工具

    • swanctl命令
    • tcpdump抓包
    • ip xfrm查看内核状态

8.3 未来展望

StrongSwan持续发展,未来版本将支持:

  • 后量子密码学算法
  • 更好的容器和云原生支持
  • 增强的自动化和编排功能
  • 改进的性能和扩展性

通过本指南的学习,系统管理员和技术人员应该能够成功部署、配置和维护基于StrongSwan的IPSec VPN解决方案,为组织提供安全、可靠的网络连接服务。

本文作者:
本文链接:https://tdh6.top/%E8%BF%90%E7%BB%B4/strongswan/
版权声明:本站文章采用 CC BY-NC-SA 3.0 CN 协议进行许可,翻译文章遵循原文协议。
图片来源:本站部分图像来源于网络,前往查看 相关说明。