我一直在使用 Strongswan 在两个单元之间设置 IPSec 隧道。隧道 SA 可以顺利设置,并且流量可以通过连接。
每当我通过隧道 ping 时,ping 请求都会以 ESP 和 ICMP 数据包的形式发送。ping 响应始终只是一个 ESP 数据包。使用 Wireshark 查看这些数据包,似乎 ping 请求发送了两个数据包,一个是封装的,一个不是。响应只是一个封装的 ICMP 回显响应。因此,每次 ping 都会导致交换 3 个数据包,而不是 2 个。
这些设备可以在没有 IPSec 隧道的情况下进行通信,但是当 IPSec 连接通过 GRE 隧道时也会发生同样的问题。
如何诊断/解决这个问题?
示例 tcpdump
tcpdump -vv host yyy.yyy.yyy.yyy
tcpdump: listening on enp4s0, link-type EN10MB (Ethernet), capture size 262144 bytes
10:18:33.302502 IP (tos 0x0, ttl 64, id 11718, offset 0, flags [DF], proto ESP (50), length 156)
unit1 > unit2: ESP(spi=0xc3e93e85,seq=0x1), length 136
10:18:33.302762 IP (tos 0x0, ttl 64, id 5550, offset 0, flags [DF], proto ICMP (1), length 84)
unit1 > unit2: ICMP echo request, id 30684, seq 1, length 64
10:18:33.303033 IP (tos 0x0, ttl 64, id 1623, offset 0, flags [none], proto ESP (50), length 156)
unit2 > unit1: ESP(spi=0xcc947f6d,seq=0x1), length 136
IPSec 状态
ipsec status
Security Associations (1 up, 0 connecting):
unit-to-unit[2]: ESTABLISHED 11 minutes ago, yyy.yyy.yyy.yyy[yyy.yyy.yyy.yyy]...zzz.zzz.zzz.zzz[zzz.zzz.zzz.zzz]
unit-to-unit{1}: INSTALLED, TUNNEL, reqid 1, ESP SPIs: cc947f6d_i c3e93e85_o
unit-to-unit{1}: yyy.yyy.yyy.yyy/32 === zzz.zzz.zzz.zzz/32
/etc/ipsec.conf
config setup
#strictcrlpolicy=yes
#uniqueids = no
#nat_traversal=yes
conn unit-to-unit
authby=secret
auto=start
keyexchange=ikev2
ike=aes256-sha2_256-modp1024!
left=yyy.yyy.yyy.yyy
right=zzz.zzz.zzz.zzz
type=tunnel
esp=aes256-sha2_256
答案1
我相信这是 IPsec 和数据包捕获在 Linux 上的工作方式的产物,数据包在发送方被捕获两次。
如果您检查另一台主机,则会看到请求作为单个 ESP 数据包传入,并且答复被捕获两次,一次作为 ICMP,一次作为 ESP。
在中间系统上,您只能看到 ESP 数据包。