strongswan -- IKEv2如何检测到经过了nat设备
拓扑如下:
其中NAT设备将来自DUTA的报文源IP 101.0.0.2转换为102.0.0.2。DUTA发起IPSec连接。
1. DUTA计算natd_chunk和natd_hash
DUTA先用自己的SPI,对等体的SPI(为0),IP和端口号做SHA1处理。如下图:
代码位于ike_natd.c的函数generate_natd_hash。
针对源IP和目的IP都生成natd_chunk,并计算哈希值。
2. DUTA经过NAT设备后,源IP做了转换。
3. DUTB判断是否经过了NAT设备
当DUTB收到IKE_SA_INIT报文后,解析得到转换后的源IP和目的IP。然后按照DUTA同样的方式组装natd_chunk,计算natd_hash哈希。
从图中可以看出,收到的报文计算出的源IP chunk对应的哈希值precalculated_src_hash与接收到的DUTA计算的哈希值received_src_hash不一致。
说明DUTA在NAT后面。