当涉及异地办公的组网互联等应用场景时,VPN技术变得非常有用。特别是IPSec,即Internet Protocol Security,提供公用和专用网络的端对端加密和验证服务。
VPN建立了一个虚拟的隧道。当客户要传递一个数据包时,该数据包会首先交给VPN路由器或网关,它会为其增加一个Authentication Header(AH)用于路由和认证。然后该数据包会通过Encapsulating Security Payload(ESP,封装安全负载)协议进行加密。
而接收该数据包的路由器和网关则会负责剥去AH头部并将数据包解密,最后将其路由到指定的目的地。
IPSec连接的建立
IPSec的连接拆分为两个阶段。在第一阶段中,一个双向的SA在IPsec对等节点之间建立。这里还可执行对等节点认证来有效的确认IPsec端点。有两个模式用来建立双向的SA,即main模式和aggressive模式。第二阶段则使用在第二阶段中确认的参数组在节点之间创建安全关联(Security Association, SA),该阶段使用IKE quick模式建立每个单向SA。它管理远程节点和网络间的实际IPsec连接。
Red Hat下的IPSec:ipsec-tools
在Red Hat下,ipsec-tools包提供了建立IPSec所需的组件和配置文件,包括:
/sbin/setkey:管理密钥及操作内核中的IPSec安全属性;
/sbin/racoon:IKE密钥管理的守护进程;
/etc/racoon/racoon.conf:racoon守护进程的配置文件。
建立Host-to-Host的IPSec连接
连接配置文件
确立一个唯一的名称,如ipsec0。该名称用于识别IPSec连接并与其他的设备和连接区别开来。然后建立配置文件,如/etc/sysconfig/network-scripts/ifcfg-ipsec0,其中应包含如下内容:
DST=X.X.X.X # 远程节点的IP地址
TYPE=IPSEC # 指定类型为IPSEC连接
ONBOOT=yes # 在启动时初始化
IKE_METHOD=PSK # 认证模式
PSK密钥文件
新建对应的PSK密钥文件,如/etc/sysconfig/network-scripts/keys-ipsec0,其中包含如下内容:
IKE_PSK=Key_Value00
值得注意的是,为保证安全,该文件应确保只有root用户具有读写权限,即600。
第一阶段配置文件
该配置文件位于/etc/racoon下,其名称为X.X.X.X.conf,其中X.X.X.X为上面远程节点的IP地址。该文件会在IPSec隧道激活时自动生成,因此不应直接修改其中的内容。让我们来看看配置文件:
remote 117.185.7.6 { exchange_mode aggressive, main; my_identifier address; proposal { encryption_algorithm 3des; hash_algorithm sha1; authentication_method pre_shared_key; dh_group 2; } }
remote X.X.X.X
指明随后的配置文件实例只应用于被 X.X.X.X IP地址所识别的远程节点。
exchange_mode aggressive
在红帽企业Linux中,IPsec的默认配置使用强硬的验证模式。这种模式减少连接费用,同时允许到多个主机的多个IPsec配置。
my_identifier address
定义验证节点时要使用的身份识别方法。红帽企业Linux使用IP地址来识别节点。
encryption_algorithm 3des
定义验证时使用的加密术。默认使用“三次数据加密标准”(Triple Data Encryption Standard,3DES)。
hash_algorithm sha1;
指定在节点商谈过程的第一阶段中使用的散列算式。默认使用安全散列算式(Secure Hash Algorithm)版本 1。
authentication_method pre_shared_key
定义节点商谈中使用的验证方法。红帽企业Linux默认使用预共享钥匙。
dh_group 2
指定建立动态生成的会话钥匙所用的Diffie-Hellman组号。默认使用1024位组 。
racoon配置文件
# Racoon IKE daemon configuration file. # See 'man racoon.conf' for a description of the format and entries. path include "/etc/racoon"; path pre_shared_key "/etc/racoon/psk.txt"; path certificate "/etc/racoon/certs"; sainfo anonymous { pfs_group 2; lifetime time 1 hour ; encryption_algorithm 3des, blowfish 448, rijndael ; authentication_algorithm hmac_sha1, hmac_md5 ; compression_algorithm deflate ; } include "/etc/racoon/X.X.X.X.conf"
默认的racoon.conf文件包含IPsec配置的指定路径,预共享钥匙和证书。sainfo anonymous中的字段描述IPsec节点安全验证的第二阶段 — IPsec 连接的性质(包括所用的被支持加密算式)和交换钥匙的方法。以下列表定义了第二阶段的字段:
sainfo anonymous
意思是只要IPsec证件匹配,SA能够不具名地引发和任何对端的连接。
pfs_group 2
定义Diffie-Hellman钥匙交换协议。该协议会决定IPsec节点为IPsec连接的第二阶段建立彼此使用的临时会话钥匙的方法。红帽企业Linux中实现的IPsec默认使用Diffie-Hellman加密术钥匙交换的组2(或modp1024)。组2使用1024位模块化取幂。这种方法在密钥被窃取时也能够防止攻击者解密前一次IPsec传输。
lifetime time 1 hour
这个参数表明SA的整个过程可以使用时间或数据字节数量来衡量。红帽企业Linux实现的IPsec指定了SA的生存期为1小时。
encryption_algorithm 3des, blowfish 448, rijndael
指定第二阶段中所用的被支持的加密术。红帽企业Linux支持3DES、448位Blowfish、以及Rijndael(用于“高级加密标准”(Advanced Encryption Standard,AES)中的加密术。
authentication_algorithm hmac_sha1, hmac_md5
列举被支持的用来验证的散列算式。被支持的模式是sha1和md5散列消息验证代码(hashed message authentication codes,HMAC)。
compression_algorithm deflate
定义用于IP载量压缩(IPCOMP)支持的压缩算式。它具备在较慢的连接中较快地传输IP数据报的潜在能力。
搞定配置后,即可以激活IPSec连接了:
ifup ipsec0
建立Network-to-Network的IPSec连接
相比Host-to-Host,这里在基本的连接配置文件中还会加入对子网等相关信息的定义。以下是一个配置文件示例,我们将其命名为ipsec1,即/etc/sysconfig/network-scripts/ifcfg-ipsec1。
TYPE=IPSEC ONBOOT=yes IKE_METHOD=PSK # 验证方法 SRCGW=192.168.1.254 # 源网关,即本地子网的网关IP DSTGW=192.168.2.254 # 目的网关,即远程子网的网关IP SRCNET=192.168.1.0/24 # 源网络,即本地子网 DSTNET=192.168.2.0/24 # 目的网络,即远程子网 DST=X.X.X.X # 远程节点的IP地址
另外在激活IPSec前,还需开启内核中的IP转发:
· 编辑/etc/sysctl.conf,把net.ipv4.ip_forward设置为1。
· 执行以下命令来启用改变:sysctl -p /etc/sysctl.conf
最后,激活IPSec:
ifup ipsec1
连接测试
要测试IPsec连接,运行tcpdump工具来查看在主机(或网络)间传输的网络分组,并校验它们是否通过IPsec被加密了。分组应该包括AH头,而且应该被显示为ESP分组,即表示已被加密。
参考资料: