通过 IPSec 隧道进行 Ping 会同时发送 ICMP 和 ESP 数据包

通过 IPSec 隧道进行 Ping 会同时发送 ICMP 和 ESP 数据包

我一直在使用 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 数据包。

相关内容