IPsec/Strongswan 配置踩坑指南

安装

strongswan 老版本和新版本不同, 老版本是基于 /etc/ipsec.conf 配置的, 而新版本是基于 /etc/swanctl/swanctl.conf, /etc/swanctl/conf.d/ 进行配置的. 配置文件语法不一样. 本文主要关注新配置的使用.

删除旧版本: sudo apt install strongswan-starter strongswan-charon (如果你不小心 sudo apt install strongswan 的话)

安装新版本: sudo apt install charon-systemd strongswan-swanctl

配置

某地的公司办公室, 通过IPsec连接到另一地区的办公室.

/etc/swanctl/conf.d/office-tunnel.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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
connections {
office-tunnel {
version = 2
encap = yes
mobike = yes # this site is behind NAT
keyingtries = 0 # this site is behind NAT

rekey_time = 86100s
rand_time = 3m
over_time = 300s
local_addrs = 192.168.1.3
remote_addrs = <RemoteIP>

proposals = aes256gcm-prfsha512-modp4096

local {
auth = psk
id = 192.168.1.3
}

remote {
auth = psk
id = <RemoteIP>
}

children {
net-net {
local_ts = 0.0.0.0/0
remote_ts = 0.0.0.0/0
esp_proposals = aes256gcm16-modp8192
start_action = trap|start
close_action = start
dpd_action = restart
mode = tunnel
if_id_in = 42
if_id_out = 42
rekey_time = 42900s
rand_time = 3m
life_time = 43200s
replay_window = 4096
}
}
}
}

secrets {
ike-psk {
id-1 = 192.168.1.3
id-2 = <RemoteIP>
secret = "..."
}
}

需要注意的点:

名字 office-tunnel, net-net, ike-psk 虽然是可以自己随意取, 但是是全局唯一的, 也就是说在本机的所有配置文件中只能出现1次. 并不存在 office-tunnel-1 下面的 net-net 和 office-tunnel-2 下面的 net-net 是不同的情况.

start_action = start 如果不配置这个, 隧道不会被自动拉起. trap 的含义是当有流量尝试走这个隧道的时候也触发一次主动握手.

close_action = start 如果不配置这个, 当对端主动发起CLOSE之后(或者断网了!!!), 隧道不会被自动拉起.

dpd_action = restart 如果不配置这个, DPD(Dead Peer Detection)检测触发掉线之后, 隧道不会被自动拉起.

(不是很懂为什么 IPsec/Strongswan 要这么设计… 非常诡异啊, 默认都是不拉起隧道…)

version = 2 表示我们在使用 IKEv2. 不写默认是 IKEv1.

mobike = yes 本端在NAT后, 启用 IKEv2 Mobility and Multihoming Protocol. 主要作用是当网络地址发生变化时尽量保持现有的IKE/IPsec SA. 当地址变化了的时候, 可以通过本协议更新对端地址. 需要双方都支持 MOBIKE.

keyingtries = 0 表示 IKE/IPsec 协商失败后无限重试, 不限制重试次数. (这也很诡异, 什么情况下会不重试啊= =)

children/net-net 里面, replay-window = 4096 配置 IPsec ESP 的抗重放窗口大小为 4096 个包. 允许最近的 4096 个包乱序但尚未收到过. 主要用于增加吞吐量, 底层网络有抖动时, 或底层网络包会乱序时重传窗口能够防止因为乱序而丢弃ipsec包.