1. 理解 IPsec
IPsec 是一种建立在 Internet 协议 (IP) 层之上的协议。 它能够让两个或更多主机以安全的方式来通讯 (并因此而得名)。
IPsec 包括了两个子协议:
*Encapsulated Security Payload (ESP) , 保护 IP 包数据不被第三方介入, 通过使用对称加密算法 (例如 Blowfish、 3DES)。
* Authentication Header (AH) , 保护 IP 包头不被第三方介入和伪造, 通过计算校验和以及对 IP 包头的字段进行安全散列来实现。随后是一个包含了散列值的附加头, 以便能够验证包。
ESP 和 AH 可以根据环境的不同, 分别或者一同使用。
IPsec 既可以用来直接加密主机之间的网络通讯 (也就是 传输模式 ); 也可以用来在两个子网之间建造 “虚拟隧道” 用于两个网络之间的安全通讯 (也就是 隧道模式 )。 后一种更多的被称为是 虚拟专用网 (VPN) 。
2. Linux 下测试
我们这里需要下载ipsec-tools 来测试,主页:
http://ipsec-tools.sourceforge.net/
kernel 的配置选项:
Networking support (NET) [Y/n/?] y
*
* Networking options
*
PF_KEY sockets (NET_KEY) [Y/n/m/?] y
IP: AH transformation (INET_AH) [Y/n/m/?] y
IP: ESP transformation (INET_ESP) [Y/n/m/?] y
IP: IPsec user configuration interface (XFRM_USER) [Y/n/m/?] y
Cryptographic API (CRYPTO) [Y/n/?] y
HMAC support (CRYPTO_HMAC) [Y/n/?] y
Null algorithms (CRYPTO_NULL) [Y/n/m/?] y
MD5 digest algorithm (CRYPTO_MD5) [Y/n/m/?] y
SHA1 digest algorithm (CRYPTO_SHA1) [Y/n/m/?] y
DES and Triple DES EDE cipher algorithms (CRYPTO_DES) [Y/n/m/?] y
AES cipher algorithms (CRYPTO_AES) [Y/n/m/?] y
我们测试用例,假设有两台主机:
28.224.158.202 和 128.224.165.156
通过ipsec 来建立通讯通道。
在128.224.158.202 主机上:
创建/etc/setkey.conf配置文件,其内容如下:
#!/sbin/setkey -f
flush;
spdflush;
# AH
add 128.224.165.156 128.224.158.202 ah 15700 -A hmac-md5 "1234567890123456";
add 128.224.158.202 128.224.165.156 ah 24500 -A hmac-md5 "1234567890123456";
# ESP
add 128.224.165.156 128.224.158.202 esp 15701 -E 3des-cbc "123456789012123456789012";
add 128.224.158.202 128.224.165.156 esp 24501 -E 3des-cbc "123456789012123456789012";
spdadd 128.224.158.202 128.224.165.156 any -P out ipsec
esp/transport//require
ah/transport//require;
spdadd 128.224.165.156 128.224.158.202 any -P in ipsec
esp/transport//require
ah/transport//require;
执行以下命令:
1. setkey -f /etc/setkey.conf
2. setkey -D
3. setkey -DP
在128.224.165.156 主机上:
创建/etc/setkey.conf配置文件,其内容如下:
#!/sbin/setkey -f
flush;
spdflush;
# AH
add 128.224.165.156 128.224.158.202 ah 15700 -A hmac-md5 "1234567890123456";
add 128.224.158.202 128.224.165.156 ah 24500 -A hmac-md5 "1234567890123456";
# ESP
add 128.224.165.156 128.224.158.202 esp 15701 -E 3des-cbc "123456789012123456789012";
add 128.224.158.202 128.224.165.156 esp 24501 -E 3des-cbc "123456789012123456789012";
spdadd 128.224.165.156 128.224.158.202 any -P out ipsec
esp/transport//require
ah/transport//require;
spdadd 128.224.158.202 128.224.165.156 any -P in ipsec
esp/transport//require
ah/transport//require;
执行以下命令:
1. setkey -f /etc/setkey.conf
2. setkey -D
3. setkey -DP
在128.224.165.156 主机上执行:
1. ping 128.224.158.202&
2. tcpdump | grep 128.224.158.202
可以看到如下结果:
01:30:06.384668 IP octeon > 128.224.158.202:
AH(spi=0x00003d54,seq=0x399): ESP(spi=0x00003d55,seq=0x399), length 88
01:30:06.385113 IP 128.224.158.202 > octeon:
AH(spi=0x00005fb4,seq=0x1e7): ESP(spi=0x00005fb5,seq=0x1e7), length 88
01:30:07.389619 IP octeon > 128.224.158.202:
AH(spi=0x00003d54,seq=0x39a): ESP(spi=0x00003d55,seq=0x39a), length 88
01:30:07.394661 IP 128.224.158.202 > octeon:
AH(spi=0x00005fb4,seq=0x1e8): ESP(spi=0x00005fb5,seq=0x1e8), length 88
01:30:08.393231 IP octeon > 128.224.158.202:
IP octeon 的ip 就是128.224.165.156。
由tcpdump 抓的包可以看出:128.224.165.156
发给128.224.158.202的包全部在IP pakcet 头加了 AH 和 ESP 加密信息,而且两者之间可以正常通讯。
另外如果执行:setkey -f /etc/setkey.conf 时,碰到这样的错误提示:pfkey_open: Address family not supported by protocol
一般就是由于没有加载Kernel IPsec 相关的modlue.如果IPsec相关的代码被编译成module 形式,用需要手动加载相关ipsec module:
modprobe af_key
参考:
1. http://www.ipsec-howto.org/
2. http://www.shorewall.net/IPSEC-2.6.html
3. http://zh.wikipedia.org/wiki/IPsec