需要在两个节点之间配置IPSec,由于对端A节点将IPSec命令封装了,所以本端B节点没有使用racoon自动协商生成IPsec SA,而采用setkey手工配置SA。如果两端都需要初始配置,这种方法也适用。
关键在于,1)两端的mode、加密方式、key、spi要一致 2)配置setkey.conf文件
mode分为传输模式(transport)和隧道模式(tunnel),传输模式适合end-to-end,隧道模式适合site-to-site(也支持end-to-end或者end-to-site),所以隧道模式更加灵活。下文会分别描述如何配置。
1.假设A节点已配好,现在仅需要配置B节点的setkey.conf。A节点配置信息可以通过以下两个命令查询
setkey -D, 检查配置的SAD (安全联盟数据库)
setkey -DP, 检查配置的SPD (用来存放IPSec 的规则,规则定义哪些流量需要走IPSec)
B节点要安装ipsec-tools,可以找rpm包安装,装好包后相关文件会放在/etc/racoon下,手工配置可在这个路径下新建文件setkey.conf
2.配置B节点的setkey.conf
A节点:10.166.22.22/22 B节点:10.188.11.11/22
(1)如果采用传输模式,则不需要关注子网掩码,B节点的setkey.conf类似如下配置
#!/usr/sbin/setkey -f
# Flush the SAD and SPD
flush; #效果等同于在命令行执行setkey -F, 即清除SAD信息
spdflush; #效果等同于在命令行执行setkey -FP, 即清除SPD信息
##配置SAD##
#A->B, spi: 29579, mode: transport, 加密方式: 3des, key: 0x9086d234780b898efab61237874345789885b87c076cccf9
#说明,模式默认为传输模式,所以-m transport 也可以省略
add 10.166.22.22 10.188.11.11 esp 29579 -m transport -E 3des-cbc 0x9086d234780b898efab61237874345789885b87c076cccf9;
#B->A, spi: 29578, mode: transport, 加密方式: 3des, key: 0x9086d234780b898efab61237874345789885b87c076cccf8
add 10.188.11.11 10.166.22.22 esp 29578 -m transport -E 3des-cbc 0x9086d234780b898efab61237874345789885b87c076cccf8;
##配置SPD##
#定义A->B的流量走IPSec
spdadd 10.166.22.22 10.188.11.11 any -P in ipsec esp/transport//require;
#定义B->A的流量走IPSec
spdadd 10.188.11.11 10.166.22.22 any -P out ipsec esp/transport//require;
(2)如果采用传输模式,需要关注两端子网掩码信息,B节点的setkey.conf类似如下配置
#!/usr/sbin/setkey -f
# Flush the SAD and SPD
flush; #效果等同于在命令行执行setkey -F, 即清除SAD信息
spdflush; #效果等同于在命令行执行setkey -FP, 即清除SPD信息
##配置SAD##
#A->B, spi: 29579, mode: tunnel, 加密方式: 3des, key: 0x9086d234780b898efab61237874345789885b87c076cccf9
add 10.166.22.22 10.188.11.11 esp 29579 -m tunnel -E aes-cbc 0x9086d234780b898efab61237874345789885b87c076cccf9;
#B->A, spi: 29578, mode: tunnel, 加密方式: 3des, key: 0x9086d234780b898efab61237874345789885b87c076cccf8
add 10.188.11.11 10.166.22.22 esp 29578 -m tunnel -E aes-cbc 0x9086d234780b898efab61237874345789885b87c076cccf8;
##配置SPD##
#定义A->B的流量走IPSec,10.166.22.22/22 10.188.11.11/22也可以换成节点所在安全网关
spdadd 10.166.22.22/22 10.188.11.11/22 any -P in ipsec esp/tunnel/10.166.22.22-10.188.11.11/use;
#定义B->A的流量走IPSec,10.188.11.11/22 10.166.22.22/22也可以换成节点所在安全网关
spdadd 10.188.11.11/22 10.166.22.22/22 any -P out ipsec esp/tunnel/10.188.11.11-10.166.22.22/use;
3.激活配置,B节点执行
setkey -f /etc/racoon/setkey.conf
4.检查配置
(1)检查配置的SAD
[root@server1111 ~]# setkey -D
10.188.11.11 10.166.22.22
esp mode=transport spi=29578(0x0000738a) reqid=0(0x00000000)
E: 3des-cbc 9086d234 780b898e fab61237 87434578 9885b87c 076cccf8
……
10.166.22.22 10.188.11.11
esp mode=transport spi=29579(0x0000738b) reqid=0(0x00000000)
E: 3des-cbc 9086d234 780b898e fab61237 87434578 9885b87c 076cccf9
……
(2)检查配置的SPD
[root@server1111 ~]# setkey -DP
10.188.11.11[any] 10.166.22.22[any] 255
out prio def ipsec
esp/transport//require
……
10.166.22.22[any] 10.188.11.11[any] 255
in prio def ipsec
esp/transport//require
……
5.验证IPSec
(1)互相ssh、sftp等能通
注意:如果仅一端配了IPSec,两端就不能互相ssh了,等到另一端也配好了对应的IPSec,就能恢复ssh、sftp等。
如果ssh希望看到更多信息, ssh -v 是debug模式。
(2)抓包看是否加密
tcpdump src host <ip of the other end> 抓包看信息是加密的(带ESP)。
如果需要写入文件加上选项“-w”, tcpdump src host <ip of the other end> -w somefile.pcap,可以用Wireshark查看。
注意:
没有配置IPSec可以这样抓基于udp的包 tcpdump udp port 162 and src host <some ip>,但是配置完IPSec后这样是抓不到的,因为协议是ESP(封装好的加密负载),端口也发生了变化。
参考资料:
IPSec-Tools配置 https://blog.csdn.net/zt698/article/details/4811604
使用racoon setkey搭建IPsec VPN环境 https://blog.csdn.net/rosetta/article/details/8552790
使用 ipsec-tools 设置 SAD 和 SPD https://blog.csdn.net/bytxl/article/details/42966131
IPSec VPN中隧道模式和传输模式区别 https://wenku.baidu.com/view/201cf300ff00bed5b9f31de4.html
PSec协议抓包详解和IPSec NAT穿越报文解析 https://blog.csdn.net/ever_peng/article/details/89217263