本测试中远程用户(roadwarrior)carol和网关moon为IKE连接使用加密套件:serpent256-sha512-modp4096,对IPSEC子连接使用:serpent256-sha512加密验证算法。远程用户carol建立到网关moon的连接,秘钥交换基于modp4096算法。连接成功建立之后,在主机carol上ping网关moon之后的虚拟主机alice,以验证连通性。
serpent算法为一种分组加密算法,运算时,每个块的长度为128比特,秘钥长度为:128/192/256bit可选,本测试使用256bit长度秘钥。以下启动gcrypt-ikev1/alg-serpent测试用例,注意在启动之前需要执行start-testing脚本开启测试环境。
$ cd strongswan-5.8.1/testing
$
$ sudo ./do-tests gcrypt-ikev1/alg-serpent
Guest kernel : 5.2.11
strongSwan : 5.8.1
Date : 20191029-1136-29
[ ok ] 1 gcrypt-ikev1/alg-serpent: pre..test..post
Passed : 1
Failed : 0
The results are available in /srv/strongswan-testing/testresults/20191029-1136-29
or via the link http://192.168.0.150/testresults/20191029-1136-29
Finished : 20191029-1136-34
由以上显示可知测试用例gcrypt-ikev1/alg-serpent的测试结果记录文件保存在目录:/srv/strongswan-testing/testresults/20191029-1136-29/gcrypt-ikev1/alg-serpent/中,这些文件记录了测试过程中虚拟主机carol和网关moon的各种状态信息和运行日志。测试拓扑如下:
carol配置
连接配置文件:strongswan-5.8.1/testing/tests/gcrypt-ikev1/alg-serpent/hosts/carol/etc/swanctl/swanctl.conf,内容如下。虚拟主机carol的IP地址为192.168.0.100,而moon网关的IP地址为192.168.0.1。
另外,连接home使用proposals:serpent256-sha512-modp4096,子连接home使用esp_proposals:serpent256-sha512。IKE协议使用version 1。
connections {
home {
local_addrs = 192.168.0.100
remote_addrs = 192.168.0.1
local {
auth = pubkey
certs = carolCert.pem
id = carol@strongswan.org
}
remote {
auth = pubkey
id = moon.strongswan.org
}
children {
home {
remote_ts = 10.1.0.0/16
esp_proposals = serpent256-sha512
}
}
version = 1
proposals = serpent256-sha512-modp4096
}
}
StrongSwan配置文件:strongswan-5.8.1/testing/tests/gcrypt-ikev1/alg-serpent/hosts/carol/etc/strongswan.conf,内容如下,指定需要加载的模块。
swanctl {
load = pem pkcs1 x509 revocation constraints pubkey openssl random
}
charon-systemd {
load = nonce pem pkcs1 gcrypt hmac x509 revocation curl vici kernel-netlink socket-default
send_vendor_id = yes
}
moon网关配置
配置文件:strongswan-5.8.1/testing/tests/gcrypt-ikev1/alg-serpent/hosts/moon/etc/swanctl/swanctl.conf,内容如下。注意网关moon的连接配置,连接rw(roadwarrior)的proposals使用:serpent256-sha512-modp4096。子连接net的esp_proposals使用serpent256-sha512。两个proposals与carol主机的相应proposals配置相同。
作为网关,其事先并不知晓连接对端的IP地址信息,此处只有local_addrs的配置。
connections {
rw {
local_addrs = 192.168.0.1
local {
auth = pubkey
certs = moonCert.pem
id = moon.strongswan.org
}
remote {
auth = pubkey
}
children {
net {
local_ts = 10.1.0.0/16
esp_proposals = serpent256-sha512
}
}
version = 1
proposals = serpent256-sha512-modp4096
}
}
StrongSwan配置文件:strongswan-5.8.1/testing/tests/gcrypt-ikev1/alg-serpent/hosts/moon/etc/strongswan.conf,内容如下,指定要加载的模块。
swanctl {
load = pem pkcs1 x509 revocation constraints pubkey openssl random
}
charon-systemd {
load = nonce pem pkcs1 gcrypt hmac x509 revocation vici kernel-netlink socket-default
send_vendor_id = yes
}
准备阶段
配置文件:strongswan-5.8.1/testing/tests/gcrypt-ikev1/alg-serpent/pretest.dat,内容如下。在预测试pre-test阶段,备份moon和carol主机的iptables配置。启动strongswan。使用脚本expect-connection检测名称为net的连接(carol主机上为home)是否建立,超过5秒钟检测不到,打印失败信息。在主机carol上swanctl初始化一个名称为home的子连接。
通过之前的介绍已经在carol和moon虚拟主机的配置文件(etc/swanctl/swanctl.conf)中看到了home和net的配置信息。
moon::systemctl start strongswan
carol::systemctl start strongswan
moon::expect-connection rw
carol::expect-connection home
carol::swanctl --initiate --child home 2> /dev/null
测试阶段
配置文件:strongswan-5.8.1/testing/tests/gcrypt-ikev1/alg-serpent/evaltest.dat,内容如下。在第一行中,SSH登录到carol主机执行ping命令,目的IP为alice主机的地址,检查alice返回的信息。
carol::ping -c 1 -s 120 -p deadbeef PH_IP_ALICE::128 bytes from PH_IP_ALICE: icmp_.eq=1::YES
carol::swanctl --list-sas --raw 2> /dev/null::home.*version=1 state=ESTABLISHED local-host=192.168.0.100 local-port=500 local-id=carol@strongswan.org remote-host=192.168.0.1 remote-port=500 remote-id=moon.strongswan.org initiator=yes.*encr-alg=SERPENT_CBC encr-keysize=256 integ-alg=HMAC_SHA2_512_256 prf-alg=PRF_HMAC_SHA2_512 dh-group=MODP_4096.*child-sas.*home.*state=INSTALLED mode=TUNNEL protocol=ESP.*encr-alg=SERPENT_CBC encr-keysize=256 integ-alg=HMAC_SHA2_512_256.*local-ts=\[192.168.0.100/32] remote-ts=\[10.1.0.0/16]::YES
moon::swanctl --list-sas --raw 2> /dev/null::rw.*version=1 state=ESTABLISHED local-host=192.168.0.1 local-port=500 local-id=moon.strongswan.org remote-host=192.168.0.100 remote-port=500 remote-id=carol@strongswan.org.*encr-alg=SERPENT_CBC encr-keysize=256 integ-alg=HMAC_SHA2_512_256 prf-alg=PRF_HMAC_SHA2_512 dh-group=MODP_4096.*child-sas.*net.*state=INSTALLED mode=TUNNEL protocol=ESP.*encr-alg=SERPENT_CBC encr-keysize=256 integ-alg=HMAC_SHA2_512_256.*local-ts=\[10.1.0.0/16] remote-ts=\[192.168.0.100/32]::YES
carol::ip xfrm state::enc cbc(serpent)::YES
moon:: ip xfrm state::enc cbc(serpent)::YES
moon::tcpdump::IP carol.strongswan.org > moon.strongswan.org: ESP.*length 216::YES
moon::tcpdump::IP moon.strongswan.org > carol.strongswan.org: ESP.*length 216::YES
第二行测试语句在carol主机上执行命令 swanctl --list-sas --raw,检查输出结果是否与指定内容匹配。以下为swanctl的执行结构,可见两者完全匹配。注意字段encr-alg,其指定安全关联使用的加密算法为:SERPENT_CBC-256。
home: #1, ESTABLISHED, IKEv1, 471fcbccb8bdaeb7_i* 9d923a80f6ff9e32_r
local 'carol@strongswan.org' @ 192.168.0.100[500]
remote 'moon.strongswan.org' @ 192.168.0.1[500]
SERPENT_CBC-256/HMAC_SHA2_512_256/PRF_HMAC_SHA2_512/MODP_4096
established 2s ago, rekeying in 13576s
home: #1, reqid 1, INSTALLED, TUNNEL, ESP:SERPENT_CBC-256/HMAC_SHA2_512_256
installed 2s ago, rekeying in 3347s, expires in 3958s
in c0e70669, 148 bytes, 1 packets, 2s ago
out cbbd3371, 148 bytes, 1 packets, 2s ago
local 192.168.0.100/32
remote 10.1.0.0/16
第三行测试语句为登录到moon网关,执行swanctl --list-sas --raw命令并检查输出结果,其内容与第二行类似。moon网关上执行swanctl --list-conns的结果如下显示。
rw: #1, ESTABLISHED, IKEv1, 471fcbccb8bdaeb7_i 9d923a80f6ff9e32_r*
local 'moon.strongswan.org' @ 192.168.0.1[500]
remote 'carol@strongswan.org' @ 192.168.0.100[500]
SERPENT_CBC-256/HMAC_SHA2_512_256/PRF_HMAC_SHA2_512/MODP_4096
established 0s ago, rekeying in 13759s
net: #1, reqid 1, INSTALLED, TUNNEL, ESP:SERPENT_CBC-256/HMAC_SHA2_512_256
installed 0s ago, rekeying in 3474s, expires in 3960s
in cbbd3371, 148 bytes, 1 packets, 0s ago
out c0e70669, 148 bytes, 1 packets, 0s ago
local 10.1.0.0/16
remote 192.168.0.100/32
第四和第五行测试语句分别登录到carol和moon上执行ip xfrm state命令,确认输出结果中的加密描述字符:enc cbc(serpent)。以下为carol主机上的执行结果:
src 192.168.0.100 dst 192.168.0.1
proto esp spi 0xcbbd3371(3418174321) reqid 1(0x00000001) mode tunnel
replay-window 0 seq 0x00000000 flag af-unspec (0x00100000)
auth-trunc hmac(sha512) 0x48e9aeeaa91ddd890f4370a16acd33e9386628f99bf6b19fc395830c5f3b127f35af6f240a2dede7212f4c4ea8fe1 62d22e35fa4c97cd1c834c9182ec79a8e3e (512 bits) 256
enc cbc(serpent) 0x68c53b0ab69ca4248fbeb35ca7b49983a06fe996da29973af99b3e2e8e18c43a (256 bits)
anti-replay context: seq 0x0, oseq 0x1, bitmap 0x00000000
...
src 192.168.0.1 dst 192.168.0.100
proto esp spi 0xc0e70669(3236365929) reqid 1(0x00000001) mode tunnel
replay-window 32 seq 0x00000000 flag af-unspec (0x00100000)
auth-trunc hmac(sha512) 0x7baa38cb33de86b6152c05338bd39f91cf6ae3151261d10fc534a6274f26471d26575b9a2d228dad638844ae03de1 5a9e9026f86c758a4a4ba0943b3b9a01df0 (512 bits) 256
enc cbc(serpent) 0x3b48fba83435eaba1d54ec18bff9853d60a8c7e35e52a2bf44c98e2fee6e22a2 (256 bits)
anti-replay context: seq 0x1, oseq 0x0, bitmap 0x00000001
...
最后两行测试语句都是在moon网关上执行的,这里的tcpdump命令并不执行,而是检查在以上的测试过程后台tcpdump名称输出到文件/tmp/tcpdump.log中的日志信息,确认carol与alice之间的ping报文是否经过ESP加密。
11:36:40.155920 IP carol.strongswan.org > moon.strongswan.org: ESP(spi=0xcbbd3371,seq=0x1), length 216
11:36:40.156056 IP carol.strongswan.org > alice.strongswan.org: ICMP echo request, id 6581, seq 1, length 128
11:36:40.156383 IP moon.strongswan.org > carol.strongswan.org: ESP(spi=0xc0e70669,seq=0x1), length 216
收尾阶段
配置文件:strongswan-5.8.1/testing/tests/gcrypt-ikev1/alg-serpent/posttest.dat,内容如下。终止carol和moon上的StrongSwan进程。
carol::systemctl stop strongswan
moon::systemctl stop strongswan
测试结果文件默认都保存在目录:/srv/strongswan-testing/testresults/20191029-1136-29/gcrypt-ikev1/alg-serpent下,其中文件console.log 记录了整个的测试过程。文件carol.daemon.log和moon.daemon.log文件记录了charon-systemd主进程的日志。完整的测试结果文件里边见本文开始部分。下图为IKEv2报文的交互报文。
END