3.3.7.2. 手动 IPsec 网络到网络配置
假设 LAN A (lana.example.com) 和 LAN B (lanb.example.com) 要通过 IPsec 隧道进行相互的连接。LAN A 的网络地址是 192.168.1.0/24 区间,而 LAN B 使用 192.168.2.0/24 区间。LAN A 的网关 IP 地址为 192.168.1.254,LAN B 的网关 IP 地址为192.168.2.254。IPsec 各个路由器由 LAN 网关使用两个网络设备(eth0 和 eth1)隔开:eth0 被指派给一个可以公开访问的静态 IP 地址,可以连接因特网;而 eth1 则被用作一个选路点(routing point)来处理和传输从一个网络节点到各远程网络节点的 LAN 数据包。
各网络之间的 IPsec 连接使用事先选好的共享密钥 r3dh4tl1nux,而且系统管理员 A 和 B 同意让 racoon 自动生成并共享每个 IPsec 路由器之间的验证密码。 LAN A 管理员决定命名该 IPsec 连接为 ipsec0,而 LAN B 管理员命名该 IPsec 连接为 ipsec1。
下面的例子显示 LAN A 的网络到网络 IPsec 连接的 ifcfg 文件的内容。本例中识别该连接的独特名称为ipsec0,所以合成的文件叫作 /etc/sysconfig/network-scripts/ifcfg-ipsec0。
TYPE=IPSEC ONBOOT=yes IKE_METHOD=PSK SRCGW=192.168.1.254 DSTGW=192.168.2.254 SRCNET=192.168.1.0/24 DSTNET=192.168.2.0/24 DST=X.X.X.X
下面的列表描述该文件的内容:
指定连接类型。
指定电脑启动时便激活这个连接。
指定该连接使用事先选好的共享密钥来进行身份验证。
源网关的 IP 地址。对 LAN A 来说是 LAN A 网关,对 LAN B 来说是 LAN B 网关。
目的地网关的 IP 地址。对 LAN A 来说是 LAN B 网关,对 LAN B 来说是 LAN A 网关。
为 IPsec 连接指定源网络,在这个例子中则是 LAN A 的网络区间。
为 IPsec 连接指定目的地网络,在这个例子中则是 LAN B 的网络区间。
LAN B 的可以公开访问的 IP 地址。
下面的例子是事先选好的共享密钥文件的内容,该文件叫 /etc/sysconfig/network-scripts/keys-ipsecX (其中 X 对 LAN A 来说是 0, 对 LAN B 来说是 1)。A 和 B 两个网络都用这个密钥来相互验证,而且这个文件的内容在 A 和 B 处应该完全一致,只有根用户才有读取和写入的权限。
IKE_PSK=r3dh4tl1nux
文件 keys-ipsecX 创建之后,要修改该文件以保证只有根用户才能读取或编辑这个文件,那么请运行下面的命令:
chmod 600 /etc/sysconfig/network-scripts/keys-ipsec1
任何时候需要修改验证密码,请在 IPsec 的两个路由器上编辑 keys-ipsecX 文件,要使连接正常运转,两个密钥必须完全一致。
下面的例子显示 IPsec 连接的 /etc/racoon/racoon.conf 配置文件内容。注意该文件的最下面一行即 include 是自动生成的,而且只有在 IPsec 隧道运行时才显示。
# 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"
下面是连接到远程网络的具体配置,该文件叫作 X.X.X.X.conf (其中 X.X.X.X 是远程 IPsec 路由器的 IP 地址)。注意该文件是 IPsec 隧道被激活时自动生成的,而且无法直接对其进行编辑。
remote X.X.X.X
{
exchange_mode aggressive, main;
my_identifier address;
proposal {
encryption_algorithm 3des;
hash_algorithm sha1;
authentication_method pre_shared_key;
dh_group 2 ;
}
}
在启动 IPsec 连接之前,内核中 IP 转发功能应该被启动。要启动 IP 转发功能,请:
编辑 /etc/sysctl.conf 并设定 net.ipv4.ip_forward 为 1。
用下面的命令使这一改变生效:
[root@myServer ~] # sysctl -p /etc/sysctl.conf
要启动 IPsec 连接,请在各个路由器上使用下面的命令:
[root@myServer ~] # /sbin/ifup ipsec0
连接被激活,LAN A 和 LAN B 便可以相互交流了,因为在 IPsec 连接上运行 ifup 时路径就通过初始化脚本被自动生成。要想显示该网络的路径列表,请用下面的命令:
[root@myServer ~] # /sbin/ip route list
要测试 IPsec 连接,在外选路(externally-routable )设备(这个例子里即 eth0)上运行 tcpdump 程序来查看网络数据包在主机(网络)之间的传输,以及验证其传输是通过 IPsec 加密的。例如,要检查 LAN A 的 IPsec 连通性,使用下面的命令:
[root@myServer ~] # tcpdump -n -i eth0 host lana.example.com
这个数据包应该包括一个 AH 主题,并显示为 ESP 数据包,其中,ESP 意味着是加密的。例如,(/表示一行的继续):
12:24:26.155529 lanb.example.com > lana.example.com: AH(spi=0x021c9834,seq=0x358): \
lanb.example.com > lana.example.com: ESP(spi=0x00c887ad,seq=0x358) (DF) \
(ipip-proto-4)