Linux 内使用 IPSEC 配置网络对网络和点对点的 VPN 连接
在 Linux 内使用 IPSEC 配置网络对网络和点对点的 VPN 连接
简介
目前,全球的许多组织都在使用各种可用的物理连接方法来连接各个办公室。可使用的方式有专用数字线路和虚拟专用网 (Virtual Private Networks, VPN),而后者要比物理线路便宜很多。VPN 与专线部署的方式几乎相同,但却可以将几个 LAN 组合成一个并可对流量进行加密以隐藏所传输的数据。当在 VPN 技术中部署加密时,通常会使用开放标准。这涉及到在 IP 上传输并使用数据报 (datagram) 作为传输层的流量。
从技术角度来看,VPN 可通过使用软件和硬件来实现。在 Linux® 内,经常使用安全协议 IPSEC (Internet Protocol Security) 的标准实现来部署 FreeS/Wan 技术。这些使用软硬件实现的解决方案,在 VPN 连接终端充当路由器。当数据包由客户机传输时,它会被发送到这个专用的路由器,该路由器会向其添加一个验证头 (Authentication Header, AH)。在数据被加密且解密和处理它的指令被添加后,数据包就会被传递到另一端的专用路由器。当收到此包时,终端路由器会对之进行解密,丢弃 AH 头,并将清晰的数据包传输到目的地的用户。
如果网络间使用了加密,那么 LAN 内的主机就会接收已解密的数据包并以正常的方式开始处理它。这就意味着当网络间使用了加密时,整个加密/解密的流程对网络的终端主机是透明的。
在 VPN 中会部署若干层验证和加密,这就使其足够安全和有效,能够将多个远端节点组合成一个内部网 (intranet)。
IPSEC 是 VPN 标准的一种流行实现,就将其分支或远程用户连接到它们的网络而言,它足够可靠,可满足各种客户需求。
IPSEC 总体概述
IPSEC 通常用来支持节点和网络之间通过 Internet 的安全连接。它可以在点到点的配置(一个计算机连接到另一个计算机)或网络到网络配置(一个 LAN/WAN 连接到另一个 LAN/WAN)内运行。IPSEC 使用由 Internet Engineering Task Force (IETF) 开发的用来做互连系统或网络间的相互验证和安全参数对比的 Internet Key Exchange (IKE) 协议来实现。
IPSEC 连接流程分为两个逻辑阶段。在第一个阶段,IPSEC 节点建立起与一个远端节点或网络的连接。这个远端的节点/网络验证请求节点的凭证,双方就连接中使用的验证方法达成一致。IPSEC 节点的验证通常会使用一种预共享密钥的算法。如果 IPSEC 连接使用了一个预共享密钥,那么两个节点必须使用这个相同的密钥。之后才有可能进入建立连接的第二个阶段。
在节点间建立 IPSEC 连接的第二个阶段使用 Security Association (SA) 来完成。这会涉及到配置数据,比如加密方法,会话密钥的交换手段以及导入到 SA 数据库的其他几个参数。这一阶段也管理分布于整个 WAN 的节点和网络之间的 IPSEC 连接。
现在,我们根据 CentOS Linux 分布的示例,来看看 IPSEC 的实现。要在网络内的所有机器上(在点到点配置的情况下)或路由器上(在网络到网络配置的情况下)部署 IPSEC,必须设置相关的数据包来管理 IPSEC 配置。这些数据包必须包括帮助建立 IPSEC 连接的基础库、守护程序和配置文件,包括 /lib/libipsec.so
库,该库包含了 Linux 内核和 CentOS Linux 内使用的 IPSEC 实现之间用来管理可信任密钥 PF_KEY 的接口。在本例中:
/sbin/setkey
提供了内核中的密钥管理和 IPSEC 安全属性。此程序遵守管理密钥的racoon
守护程序。有关 setkey 的更多信息可以在setkey
(8) 手册页(参见 参考资料)中找到。/sbin/racoon
守护程序的作用是管理 IKE 密钥并监管运行着 IPSEC 的计算机之间的密钥交换以及安全关联。这个守护程序可以在编辑了文件/etc/racoon/racoon.conf
之后设置。有关 racoon 的更多信息可以在racoon
(8) 手册页(参见 参考资料)中找到。/etc/racoon/racoon.conf
是一个配置文件,各种 IPSEC 连接参数在此设置,包括验证方法和加密算法。有关此主题的详细信息也可以在racoon.conf
(5) 手册页(参见 参考资料)的命令总结部分中找到。
为点到点配置设置 IPSEC
IPSEC 可基于点到点连接将一个工作站连接到另一个工作站。有了这种连接,将使用两个节点均连接到的网络来创建一个安全通道。此节点只需一个到 Internet 的永久连接或另一个经常处于运行状态的网络来建立 IPSEC 连接。
创建点到点连接需要如下数据:
- 两个节点的 IP 地址
- IPSEC 连接的惟一名称,使其有别于另一个设备或连接 (
ipsec0
) - 一个加密密钥,永久的或使用
racoon
自动创建 - 一个验证预共享密钥,用来建立连接并在连接会话期间交换加密密钥
现在,我们来看看两个主机相互建立连接的场景。其中会用到共享密钥 my_key
以及守护程序 racoon
来自动创建并交换验证密钥。连接名是 ipsec0
。
此工作站使用如 清单 1 所示的 ifcfg
文件来建立与另一个工作站的 IPSEC 点到点连接。清单 1 显示了文件 /etc/sysconfig/network-scripts/ifcfg-ipsec0
的格式。
清单 1. ifcfg-ipsec0 的格式
1 2 3 4 | DST=X.X.X.X’ TYPE=IPSEC ONBOOT=yes IKE_METHOD=PSK |
在第一个计算机上,字母 X.X.X.X 必须由第二个计算机的 IP 地址所替代,反之亦然。连接是在启动 (ONBOOT=yes
) 期间建立的并使用预共享密钥验证方法 (IKE_METHOD=PSK
)。
具有共享密钥 (/etc/sysconfig/network-scripts/keys-ipsec0
) 的文件,如 清单 2 所示,是两个计算机做相互验证所必需的。在两个计算机上,此文件的内容必须相同,而且必须只有 root 用户能够访问它:IKE_PSK=my_key
。
发出如下命令来限制对此文件的访问 keys-ipsec0
:
清单 2. 具有共享密钥的文件
1 | chmod 600 /etc/sysconfig/network-scripts/keys-ipsec0. |
为了能随时更改验证密钥,必须编辑两个计算机上的 keys-ipsec0 文件。这两个密钥必须完全一致才能建立连接。
清单 3 解释了连接到一个远端节点的第一个阶段的配置流程。这个文件名为 X.X.X.X.conf (X.X.X.X 由远端 IPSEC 路由器的 IP 地址所替代)。请注意此文件是在 IPSEC 通道激活时自动生成的,不是手动编辑的。
清单 3. X.X.X.X.conf 文件的格式
1 2 3 4 5 6 7 8 9 10 11 12 | ; 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 ; } } |
- 命令
remote X.X.X.X
表明配置文件中的后续字符串只适用于被分配到地址 X.X.X.X 的远端节点。 - 在 CentOS Linux 中,默认 IPSEC 配置内的
exchange_mode aggressive
是一种允许多个节点间具有不同 IPSEC 连接的验证方法。 my_identifier address
定义了用于节点验证的识别方法。CentOS Linux 可识别 IP 地址处的节点。encryption_algorithm 3des
定义了用于验证的加密算法。默认的方法是 Triple Data Encryption Standard (3DES)。hash_algorithm sha1
表明在连接的第一个阶段期间所使用的是散列计算算法。authentication_method pre_shared_key
定义了同步化节点时所使用的验证方法。Вdh_group 2
表明的是用来选择自动生成的会话密钥的 Diffie-Hellman 群组的数量。默认使用 1024 位组。
在所有 IPSEC 节点上,/etc/racoon/racoon.conf
也必须相同,运算符 include "/etc/racoon/X.X.X.X.conf"
除外,此运算符将会有不同的 IP 地址。当 IPSEC 通道激活时,操作和文件都会生成。清单 4 显示了当 IPSEC 连接建立时所生成的典型的 racoon.conf
:
清单 4. racoon.conf 文件的格式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | # 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" |
对于配置文件内所有参数的描述不在本文的讨论范围之内。可以从相应的手册获得这些信息。
要建立此连接,可以重启计算机或在每个节点执行代表 root 的如下命令:/sbin/ifup ipsec0
。
启动实用工具 tcpdump
来检查 IPSEC 连接。当这么做时,数据包必须包含 AH 和 ESP 数据。ESP 意味着加密有效。清单 5 显示了一个示例 tcpdump:
清单 5. 样例 tcpdump
1 2 | 17:13:20.617872 pinky.example.com > ijin.example.com: \ AH(spi=0x0aaa749f,seq=0x335): ESP(spi=0x0ec0441e,seq=0x335) (DF) |
为网络到网络配置设置 IPSEC
有了 IPSEC,可以通过组织一个互联网络 (internetwork) 将全部网络连接到其他的网段。需要在每个网络上安装 IPSEC 路由器以便一个网络的节点的流量可被透明处理并到达另一个网络的节点。这些网络内必须运行着 IPSEC 路由器来进行验证,并通过一个安全通道组合这些网络,流量则通过 Internet 或其他的网络流动。如果数据包在传输期间被截获,将需要使用搜索方法来破解保护它们的代码。这可能会是一个相当长的处理过程,而且甚至可能在过程结束时都无重大作用。
建立一个互联网络 (internetwork) 连接需要如下信息:
- 专用 IPSEC 路由器的公共 IP 地址
- 将网络节点流量路由到 Internet 的那些网关接口的 IP 地址
- IPSEC 连接的惟一名称(比如,
ipsec0
) - 使用
racoon
创建的加密密钥 - 验证预共享密钥
我们来看一个网络 my_net1.com 和 network my_net2.com 之间的 IPSEC 通道的示例。第一个网络的地址是 192.168.1.0/24,第二个网络的地址是 192.168.2.0/24。第一个网络内的网关的 IP 地址是 192.168.1.254,而第二个网络内网关的 IP 地址是 192.168.2.254。路由器从网关单独实现并使用两个网络接口:eth0 具有 Internet 专用的静态公共 IP 地址,而 eth1 则能接收和处理来自 LAN 的数据包。
网络间的 IPSEC 连接使用了预共享密钥 r3dh4tl1nux
。为第一个网络内的 IPSEC 互联网络连接创建的文件 ifcfg
的内容如 清单 6 所示。在本例中,此连接具有惟一名称 ipsec1。清单 6 显示的是示例 /etc/sysconfig/network-scripts/ifcfg-ipsec1。
清单 6. 示例 ifcfg-ipsec1
1 2 3 4 5 6 7 8 | 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 |
此连接在启动 (ONBOOT=yes
) 期间建立并使用预共享密钥验证方法 (IKE_METHOD=PSK
)。
具有预共享密钥的文件内容(名为 /etc/sysconfig/network-scripts/keys-ipsecX
,其中 X 对于第一个网络为 0,对于第二个网络为 1 )如 清单 7 所示。
可以更改验证密钥,而这要求文件 keys-ipsecX
在 IPSEC 路由器上可随时被编辑。密钥必须是完全相同的。清单 7 显示了示例 /etc/racoon/racoon.conf。
清单 7. 示例 racoon.conf 文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | # 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" |
清单 8 显示了与远端网络的特定连接的配置。文件的名称是 X.X.X.X.conf
(其中 X.X.X.X 是远端 IPSEC 路由器的 IP 地址)。
清单 8. 样例 X.X.X.X.conf 文件
1 2 3 4 5 6 7 8 9 10 11 12 | ; 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 连接之前,可通过编辑文件 /etc/sysctl.conf 并设置正向等于 1 的 net.ipv4.ip_
,从而在内核内激活 IP 路由。
为了确保修改得以实现,可发出此命令:sysctl -p /etc/sysctl.conf
。
要建立连接,可以重启路由器或在路由器上运行代表 root 的如下命令:/sbin/ifup ipsec0
。
路由器会自动生成初始化场景,场景由命令 ifup
在 IPSEC 连接建立时激活。
用如下命令检查网络路由器列表:/sbin/ip route list
。
运行实用工具 tcpdump 来检查 IPSEC 连接,比如:tcpdump -n -i eth0 host my_net1.com
数据包必须包含 AH 和 ESP 数据。在本例中,ESP 的存在表明加密有效。清单 9 显示了在一个来自已建立连接的数据包上执行检查的示例:
清单 9. 带加密的样例数据包
1 2 3 | 12:24:26.155529 my_net2.com > my_net1.com: AH(spi=0x021c9834,seq=0x358): \ my_net2.com > my_net1.com: ESP(spi=0x00c887ad,seq=0x358) (DF) \ (ipip-proto-4) |
结束语
本文细述了设计原理、部署 VPN 的基础知识,以及 IPSEC 协议概念,介绍了 IPSEC 基本特性及其实现所需的机制。
本文还探讨了有关使用 IPSEC 协议设计受保护连接方法的安排。除了真实示例外,我们还提供了有关于这两个连接模式(节点到节点以及网络到网络)的详细描述。
目录 返回
首页