引言
IPsec隧道穿越NAT是IPsec应用的重要场景,也是更改IPsec功能后需要进行回归的基本功能之一。由于该场景测试至少需要三台设备(测试IPsec设备-NAT设备--对照IPsec设备),开发者设备一般比较紧缺,可能会因此忽略该场景的功能回归,留下功能隐患。
本文记录使用strongswan + iptables搭建IPsec穿越NAT场景,方便开发者验证功能问题。
1. 组网场景
简单组网场景如图1所示,CentOS上部署iptables充当NAT网关, CentOS上部署strongswan充当对照IPsec设备, NAT网关和IPsec对照设备可以部署在同一PC上的虚拟机上,因此该组网中只需要一台被测设备。当然如果被测试设备支持虚机形式,整个组网在一台PC上就可以完成,极大的简化了所需要的设备。
2. 配置信息
测试设备的IPsec配置根据设备实际情况配置,在此不做展开。
对Centos先进行相关环境配置,包括关闭防火墙、SELINUX等配置,设置iptables规则,并打开IP转发功能。
打开ip转发功能:
关闭Linux防火墙
关闭SELINUX
因为是测试环境,iptables放行所有流量。
IPsec对照设备采用开源strongswan,这个网络上介绍很多,也不做展开,我们主要说明下如何使用iptables模拟NAT网关。
通过IKE/IPsec协议可知,在穿越NAT场景下,不管是IKE协商报文还是ipsec数据报文,只会有两种形式的UDP报文,一种是源、目的端口为500,一种源、目的端口为4500,因此我们只需要在充当NAT网关设备的Centos上增加两条iptables规则就可以。
将源IP 192.168.31.44 源端口为500的UDP报文转换为IP 1.1.1.24,源端口为5000;将源IP 192.168.31.44 源端口为4500的UDP报文转换为IP 1.1.1.24,源端口为5017,有了这两条iptables规则,就产生了一个仅对IKE/IPsec协议生效的NAT网关。
通过更改这两条iptables规则,可以模拟NAT会话变化,进而观察测试设备的IPsec功能是否正常。我们可以更改转换后的端口,也可以更改转换后的IP地址。下图示例是更新了转换后的UDP端口。
需要注意的是,如果有ipsec报文匹配了iptables规则并产生了会话后,更改规则并不会立刻更新会话,也就是说更改后的iptables规则不会立即生效。这两条UDP会话存在默认的老化时间,当没有相关报文且会话到达老化时间后,新的规则才会生效。
如果想要规则立即生效,可以使用conntrack -D命令删除相关udp会话。
我们也可以更改iptables规则,让被测设备处于NAT外侧,非常灵活。