以下是数据包的处理过程,发送方的处理过程:
(1) 源主机TCP层通过调用ip_output()函数,调用IP层, 令其发送一个数据包
给路由器;
(2) 路由器针对目的主机的数据包,查询策略引擎,根据安全策略强制加上AH或
ESP头;
(3) IKE处理,对没有SA的安全策略建立新的SA;
(4) SA处理, 增加序列号字段;
(5) 通道模式处理,通常VPN用的是通道模式,因此加上一个额外的IP头;
(6) 路由器发送这个安全的数据包。
接收方的处理过程:
(1) 另一端的路由器收到这个包,剥去额外的IP头,并利用数据包的AH或ESP
头调用 IPsec层;
(2) IPsec层从AH或ESP头摘录出SPI,从IP头中选出源和目的地址及协议;
(3) IPsec层用以上的参数从SAD中取出所需的SA,如果没找到,就丢弃这个包;
(4) SAD返回SA,IPsec将会根据AH和ESP定义的规则对这个包进行处理;
(5) 验证和这个包对应的策略,进而决定IPsec处理的应用是否正确,策略是通
过SA中的指针获得或利用选择符查询SPD得来;
(6) 如果验证正确,那么解密并把这个包转发到真正的目的主机。
Linux上安装IPsec的例子
src/linux,并编译、安装和重启内核,以测试新内核。在使IPSec正常工作之前必须保证网络工作正常。接着将IPSec for Linux源代码解压到/usr/local/src目录下,运行安装程序"make menugo",对内核进行"补丁".再运行内核的配置程序。最后就是安装IPSec工具和内核。
#cd /usr/src/
#cp /usr/src/linux-2.4.2 linux
#cd /usr/src/linux
#make menuconfig
#cd ……/
#tar zvxf freeswan-1.91-1.tar.gz
#cd freeswan-1.91
#make menugo
确保已保存好内核的配置。特别要注意本机网卡的型号,在编译内核时要把网卡的驱动程序加进去,否则,网络将不通。
现在我们需要修改LILO配置文件lilo.conf,并重新运行lilo和重新启动系统内核。
lilo.conf文件例子如下:
boot=/dev/hda
map=/boot/map
install=/boot/boot.b
prompt
timeout=100
image=/usr/src/linux/arch/i386/boot/bzImage boot/vmlinuz-2.2.10-ipsec
label=linux-ipsec
root=/dev/hda1
read-only
image=/boot/vmlinuz-2.2.10
label=linux
root=/dev/hda1
read-only
重新运行lilo,系统提示:
linux-ipsec *
linux
然后重新启动带有IPSec支持的 2.4.2内核的系统。系统重启时会出现几个错误,这主要是IPSec在缺省情况下使用了实际并不存在的eth999接口。建议你将ipsec程序的路径加入到用户环境变量中。IPSec的网络设置。首先,需要允许网关服务器的TCP-IP转发。在Orbita Linux 3.0系统中的实现方法:
直接修改/proc文件系统,执行以下命令即可:
#vi /proc/sys/net/ipv4/ip_forward
把"0"改为"1".
由于大多数人都使用了缺省的禁止IP转发安全策略,但必须允许数据从远程网络或主机传送到本地网络或主机中。而且,任何使用了IPSec的内部网络的所有伪(masquerade)规则都必须在允许IPSec的规则之后进行,否则主机将试图伪装(masquerade)数据包,而不是将它们传递给IPSec.
以下例子说明了如何在两个已使用了IP masquerading伪装的受保护网络之间通过IPSec进行安全的互联网连接:
手工(固定)密钥连接 (Manual connection keying)
先通过使用手工(固定)密钥,并编辑ipsec.conf和防火墙规则来建立安全连接。在ipsec.conf省参数中,使用随机数生成器产生一个数字,并保留其16进制前导字符0x.我们需要修改的参数如下:
conn my-tunnel
type=tunnel
left=1.2.3.4
leftnexthop=1.2.3.1
leftsubnet=10.0.0.0/24
right=5.6.7.8
rightnexthop=5.6.7.1
rightsubnet=192.168.0.0/24
spibase=0x200
esp=3des-md5-96
espenckey=0x01234567_89abcdef_02468ace_13579bdf_12345678_9abcdef0
espauthkey=0x12345678_9abcdef0_2468ace0_13579bdf


