Show Table of Contents
为了尽快向用户提供最新的信息,本文档可能会包括由机器自动从英文原文翻译的内容。如需更多信息,请参阅此说明。
4.7. 保护虚拟私用网络(VPN)
在 Red Hat Enterprise Linux 7 中,VPN可以用受到 Libreswan 应用支持的
IPsec
加密通道协议来进行配置( Virtual Private Network(VPN) )。Libreswan 是 Openswan 应用的一个分支,是可交换文档中的例子。NetworkManager IPsec
插件称为 NetworkManager-libreswan。GNOME Shell 的用户需要安装带有 NetworkManager-libreswan 附件的 NetworkManager-libreswan-gnome 数据包。
在 Red Hat Enterprise Linux 7中,Libreswan 是一个开放源,用户空间
IPsec
的实践项目可以从中获得 。它使用 Internet key exchange (IKE) 协议, IKE
版本 1 和版本 2 被作为用户级别的后台程序来执行。手动密钥也可以通过 ip xfrm
命令建立,但不推荐这样做。 Libreswan与 Linux 内核连接, 用网络链接来转移加密秘钥。加密包和解密包在 Linux 内核中发生。
Libreswan 使用 network security services (NSS) 加密库, 这是 Federal Information Processing Standard (FIPS) 安全合规要求的。
4.7.1. 使用 Libreswan 的 IPsec VPN
要安装 Libreswan,以
root
身份输入以下命令:
~]# yum install libreswan
检查 Libreswan是否已安装,输入以下命令:
~]$ yum info libreswan
新安装 Libreswan 之后, NSS 数据库将作为安装过程的一部分被初始化。但是,如果您要开始一个新的数据库,首先要按以下方式移除旧的数据库:
~]# rm /etc/ipsec.d/*db
然后,初始化一个新的 NSS 数据库,以 root
身份输入以下命令:
~]# ipsec initnss
Enter a password which will be used to encrypt your keys.
The password should be at least 8 characters long,
and should contain at least one non-alphabetic character.
Enter new password:
Re-enter password:
如果您不想使用 NSS 密码,那么在被提示输入密码的时候,直接按两次 Enter。如果您输入了密码,那么每次 Libreswan 启动时, 您需要再次输入密码,就像每次系统启动时一样。
检查由 Libreswan 提供的
ipsec
后台程序是否运行,输入以下命令:
~]$ systemctl status ipsec
ipsec.service - Internet Key Exchange (IKE) Protocol Daemon for IPsec
Loaded: loaded (/usr/lib/systemd/system/ipsec.service; disabled)
Active: inactive (dead)
启动由 Libreswan 提供的
ipsec
后台程序,以 root
身份输入以下命令:
~]# systemctl start ipsec
确定后台程序正在运行:
~]$ systemctl status ipsec
ipsec.service - Internet Key Exchange (IKE) Protocol Daemon for IPsec
Loaded: loaded (/usr/lib/systemd/system/ipsec.service; disabled)
Active: active (running) since Wed 2013-08-21 12:14:12 CEST; 18s ago
确定启动系统式,Libreswan 也会启动,以
root
身份输入以下命令:
~]# systemctl enable ipsec
配置媒介以及基于主机的防火墙来允许
ipsec
服务。查阅 <第 4.5 节 “使用防火墙” >得到防火墙和允许指定程序通过的有关信息。Libreswan 要求防火墙允许以下数据包通过:
- 针对
Internet Key Exchange
(IKE) 协议的UDP
端口 500 - 针对
IKE NAT-Traversal
的UDP
端口 4500 - 针对
Encapsulated Security Payload
(ESP)IPsec
数据包的端口 50 - 针对
Authenticated Header
(AH)IPsec
数据包(非常见)的端口 51
我们提供了三个例子,用 Libreswan 建立一个
IPsec
VPN。第一个例子是将两个主机连接在一起,使之可以安全通讯。第二个例子是将两个站点连接起来组成一个网络。第三个例子是支持漫游用户,在此环境里被称为 road warriors。
4.7.2. 使用 Libreswan 的 VPN 配置
Libreswan 不使用术语 “source”(来源) 或 “destination”(目的)。相反,它用术语 “left”(左边) 和 “right”(右边) 来代指终端(主机)。虽然大多数管理员用 “left” 表示本地主机,“right” 表示远程主机,但是这样可以再大多数情况下在两个终端上使用相同的配置。
有三种常用的方法为终端提供认证:
- Pre-Shared Keys (PSK) 是最简单的证明方法。PSK 由随机字符组成,长度至少为 20 个字符。考虑到非随机和和短的 PSK 的危险,当系统在 FIPS 模式下运行时,这个方法不能使用。
- Raw RSA 值常用于静态的主机对主机,或者子网对子网的
IPsec
配置。这些主机用彼此的公共 RSA 秘钥手动配置。当许多或者更多主机都需要彼此建立IPsec
通道时,这个方法不能很好地扩展。 - X.509 认证常用于有许多主机需要连接到一个常用的
IPsec
通道的大规模配置。一个中央认证中心 (certificate authority (CA))被用于为主机或者用户注册 RSA 认证。这个中央 CA 负责转播信任关系,包括取消每个主机和用户。
4.7.3. 使用 Libreswan 的主机对主机 VPN
要配置 Libreswan 创建一个主机对主机
IPsec
VPN,在两个被指定为 “left” 和 “right” 的主机之间,以 root
身份在指定为 “left” 的主机上输入以下命令,创建一个新的 RSA 秘钥组:
~]#这样产生一个用于主机的 RSA 秘钥组。产生 RSA 的过程要花上好几分钟,尤其是在带低熵的虚拟机上。ipsec newhostkey --configdir /etc/ipsec.d \
--output /etc/ipsec.d/www.example.com.secrets
Generated RSA key pair using the NSS database
要查看公共秘钥,以
root
身份在指定为 “left” 的主机上输入以下命令:
~]# ipsec showhostkey --left
# rsakey AQOrlo+hO
leftrsasigkey=0sAQOrlo+hOafUZDlCQmXFrje/oZm [...] W2n417C/4urYHQkCvuIQ==
您需要这个秘钥来增加配置文件,如下文所示:
以
root
身份在指定为 “right” 的主机上输入以下命令:
~]#要查看公共秘钥,以ipsec newhostkey --configdir /etc/ipsec.d \
--output /etc/ipsec.d/www.example.com.secrets
Generated RSA key pair using the NSS database
root
身份在指定为 “right” 的主机上输入以下命令:
~]# ipsec showhostkey --right
# rsakey AQO3fwC6n
rightrsasigkey=0sAQO3fwC6nSSGgt64DWiYZzuHbc4 [...] D/v8t5YTQ==
您将需要把这个秘钥增加到配置文件。
秘密的部分被存储在
/etc/ipsec.d/*.db
文件里,也称为 “NSS 数据库”。
要为这种主机对主机的通道建立配置文件,要把上面的行
leftrsasigkey=
和 rightrsasigkey=
增加到一个位于 /etc/ipsec.d/
目录中的自定义配置里。要让 Libreswan 读出用户配置文件,则以 root
身份使用编辑器来编辑主配置文件 /etc/ipsec.conf
,并通过移除 #
注释符来使用以下行,这一行看起来是这样: include /etc/ipsec.d/*.conf
以
root
身份使用编辑器,用如下格式创建一个带有合适名称的文件: /etc/ipsec.d/my_host-to-host.conf按照如下方式编辑文件:
conn mytunnel leftid=@west.example.com left=192.1.2.23 leftrsasigkey=0sAQOrlo+hOafUZDlCQmXFrje/oZm [...] W2n417C/4urYHQkCvuIQ== rightid=@east.example.com right=192.1.2.45 rightrsasigkey=0sAQO3fwC6nSSGgt64DWiYZzuHbc4 [...] D/v8t5YTQ== authby=rsasig # load and initiate automatically auto=start您可以在左右主机上使用完全相同的配置文件。系统会自动侦测 “left” 或 “right”。如果其中一个主机是移动主机,致使
IP
地址无法提前获取,那么就在移动主机上把 %defaultroute
用作它的 IP
地址。它能自动获取动态 IP
地址。在接受了来自接入手机的连接的静态主机上,用 %any
指定移动主机的 IP
地址。
确保
leftrsasigkey
值从 “left” 主机上获取,确定 rightrsasigkey
从 “right” 主机上获取。
重启
ipsec
来确保它读取新的配置:
~]# systemctl restart ipsec
以
root
输入以下命令来加载 IPsec
通道:
~]# ipsec auto --add mytunnel
要建立通道,在 left 或者 right,以 root 目录输入以下命令:
~]# ipsec auto --up mytunnel
4.7.3.1. 查证使用 Libreswan 的主机对主机 VPN
IKE
协议产生于 UDP
端口 500。 IPsec
数据包展示为 Encapsulated Security Payload
(ESP)数据包。当 VPN 连接需要通过一个 NAT 路由器时,ESP
数据包在端口 4500 上被打包在 UDP
数据包里。
要核实数据包正在通过 VPN 通道被发送,以
root
身份按照以下格式输入一条命令:
~]# tcpdump -n -i interface esp and udp port 500 and udp port 4500
00:32:32.632165 IP 192.1.2.45 > 192.1.2.23: ESP(spi=0x63ad7e17,seq=0x1a), length 132
00:32:32.632592 IP 192.1.2.23 > 192.1.2.45: ESP(spi=0x4841b647,seq=0x1a), length 132
00:32:32.632592 IP 192.0.2.254 > 192.0.1.254: ICMP echo reply, id 2489, seq 7, length 64
00:32:33.632221 IP 192.1.2.45 > 192.1.2.23: ESP(spi=0x63ad7e17,seq=0x1b), length 132
00:32:33.632731 IP 192.1.2.23 > 192.1.2.45: ESP(spi=0x4841b647,seq=0x1b), length 132
00:32:33.632731 IP 192.0.2.254 > 192.0.1.254: ICMP echo reply, id 2489, seq 8, length 64
00:32:34.632183 IP 192.1.2.45 > 192.1.2.23: ESP(spi=0x63ad7e17,seq=0x1c), length 132
00:32:34.632607 IP 192.1.2.23 > 192.1.2.45: ESP(spi=0x4841b647,seq=0x1c), length 132
00:32:34.632607 IP 192.0.2.254 > 192.0.1.254: ICMP echo reply, id 2489, seq 9, length 64
00:32:35.632233 IP 192.1.2.45 > 192.1.2.23: ESP(spi=0x63ad7e17,seq=0x1d), length 132
00:32:35.632685 IP 192.1.2.23 > 192.1.2.45: ESP(spi=0x4841b647,seq=0x1d), length 132
00:32:35.632685 IP 192.0.2.254 > 192.0.1.254: ICMP echo reply, id 2489, seq 10, length 64
其中 interface 就是用来负荷通信的接口。要停止使用 tcpdump 捕获的数据包,按下 Ctrl+C。
注意
tcpdump 命令完全无法和
IPsec
互动。它仅仅识别向外的加密程序包,而不是向外的纯文档文件程序包。它可以识别进入的加密程序包和进入的解码程序包。如果可以,在两个机器之间的路由器而非其中一个终端上运行 tcpdump。
4.7.4. 使用 Libreswan 的点对点 VPN
要为 Libreswan 创建一个点对点
IPsec
VPN,并连接两个网络,要在两个主机之间创建一个 IPsec
通道,配置终端允许一个或者更多子网通过。所以,它们可以被看作是通向网络远程部分的门户。点对点 VPN 的配置和主机对主机 VPN 仅有的不同在于,必须在配置文件中指定一个或者更多的网络或子网。
要配置 Libreswan 来创建一个点对点
IPsec
VPN,首先按照 <第 4.7.3 节 “使用 Libreswan 的主机对主机 VPN”> 所述,配置一个主机对主机 IPsec
VPN,然后拷贝或者移动文件到一个带有适当名称的文件里,例如 /etc/ipsec.d/my_site-to-site.conf
。以 root
身份使用编辑器编辑,编辑自定义配置文件 /etc/ipsec.d/my_site-to-site.conf
如下:
conn mysubnet also=mytunnel leftsubnet=192.0.1.0/24 rightsubnet=192.0.2.0/24 conn mysubnet6 also=mytunnel connaddrfamily=ipv6 leftsubnet=2001:db8:0:1::/64 rightsubnet=2001:db8:0:2::/64 conn mytunnel auto=start leftid=@west.example.com left=192.1.2.23 leftrsasigkey=0sAQOrlo+hOafUZDlCQmXFrje/oZm [...] W2n417C/4urYHQkCvuIQ== rightid=@east.example.com right=192.1.2.45 rightrsasigkey=0sAQO3fwC6nSSGgt64DWiYZzuHbc4 [...] D/v8t5YTQ== authby=rsasig
要建立通道,需重启 Libreswan 或者手动加载,并初始化所有连接,以
root
身份使用以下命令:
~]# ipsec auto --add mysubnet
~]# ipsec auto --add mysubnet6
~]# ipsec auto --add mytunnel
~]# ipsec auto --up mysubnet
104 "mysubnet" #1: STATE_MAIN_I1: initiate
003 "mysubnet" #1: received Vendor ID payload [Dead Peer Detection]
003 "mytunnel" #1: received Vendor ID payload [FRAGMENTATION]
106 "mysubnet" #1: STATE_MAIN_I2: sent MI2, expecting MR2
108 "mysubnet" #1: STATE_MAIN_I3: sent MI3, expecting MR3
003 "mysubnet" #1: received Vendor ID payload [CAN-IKEv2]
004 "mysubnet" #1: STATE_MAIN_I4: ISAKMP SA established {auth=OAKLEY_RSA_SIG cipher=aes_128 prf=oakley_sha group=modp2048}
117 "mysubnet" #2: STATE_QUICK_I1: initiate
004 "mysubnet" #2: STATE_QUICK_I2: sent QI2, IPsec SA established tunnel mode {ESP=>0x9414a615 <0x1a8eb4ef xfrm=AES_128-HMAC_SHA1 NATOA=none NATD=none DPD=none}
~]# ipsec auto --up mysubnet6
003 "mytunnel" #1: received Vendor ID payload [FRAGMENTATION]
117 "mysubnet" #2: STATE_QUICK_I1: initiate
004 "mysubnet" #2: STATE_QUICK_I2: sent QI2, IPsec SA established tunnel mode {ESP=>0x06fe2099 <0x75eaa862 xfrm=AES_128-HMAC_SHA1 NATOA=none NATD=none DPD=none}
~]# ipsec auto --up mytunnel
104 "mytunnel" #1: STATE_MAIN_I1: initiate
003 "mytunnel" #1: received Vendor ID payload [Dead Peer Detection]
003 "mytunnel" #1: received Vendor ID payload [FRAGMENTATION]
106 "mytunnel" #1: STATE_MAIN_I2: sent MI2, expecting MR2
108 "mytunnel" #1: STATE_MAIN_I3: sent MI3, expecting MR3
003 "mytunnel" #1: received Vendor ID payload [CAN-IKEv2]
004 "mytunnel" #1: STATE_MAIN_I4: ISAKMP SA established {auth=OAKLEY_RSA_SIG cipher=aes_128 prf=oakley_sha group=modp2048}
117 "mytunnel" #2: STATE_QUICK_I1: initiate
004 "mytunnel" #2: STATE_QUICK_I2: sent QI2, IPsec SA established tunnel mode {ESP=>0x9414a615 >0x1a8eb4ef xfrm=AES_128-HMAC_SHA1 NATOA=none NATD=none DPD=none}
4.7.4.1. 核实带有 Libreswan 的点对点VPN
核实数据包正在通过 VPN 通道被发送,是和 <第 4.7.3.1 节 “查证使用 Libreswan 的主机对主机 VPN” >中所解释的完全一样的过程。
4.7.5. 使用 Libreswan 的点对点单一隧道 VPN
通常,当点对点的通道创建完成,网关需要使用它们内在的
IP
地址,而不是它们公共的 IP
地址来互相联系。这使用单一隧道可以实现。如果名为 west
的 left 的主机,拥有内在的 IP
地址 192.0.1.254
,如果名为east
的 right 的主机拥有内在的 IP
地址 192.0.2.254
,可以使用单一隧道的配置可以被使用:
conn mysubnet leftid=@west.example.com leftrsasigkey=0sAQOrlo+hOafUZDlCQmXFrje/oZm [...] W2n417C/4urYHQkCvuIQ== left=192.1.2.23 leftsourceip=192.0.1.254 leftsubnet=192.0.1.0/24 rightid=@east.example.com rightrsasigkey=0sAQO3fwC6nSSGgt64DWiYZzuHbc4 [...] D/v8t5YTQ== right=192.1.2.45 rightsourceip=192.0.2.254 rightsubnet=192.0.2.0/24 auto=start authby=rsasig
4.7.6. 子网延伸使用 Libreswan
经常,
IPsec
被部署在集散体系结构。每个叶节点都有 IP
范围,它是更大范围的一部分。叶通过集线器相互联系。这被称为 “ 子网延伸”。在下列例子中,我们使用 10.0.0.0/8
配置总部及使用更小两个 /24
子网的分支。
在总部:
conn branch1 left=1.2.3.4 leftid=@headoffice leftsubnet=0.0.0.0/0 leftrsasigkey=0sA[...] # right=5.6.7.8 rightid=@branch1 righsubnet=10.0.1.0/24 rightrsasigkey=0sAXXXX[...] # auto=start authby=rsasigkey conn branch2 left=1.2.3.4 leftid=@headoffice leftsubnet=0.0.0.0/0 leftrsasigkey=0sA[...] # right=10.11.12.13 rightid=@branch2 righsubnet=10.0.2.0/24 rightrsasigkey=0sAYYYY[...] # auto=start authby=rsasigkey
在 “branch1”的办公室,我们使用相同的链接。另外我们使用传递链接来排除我们从隧道被运送的本地 LAN 流量:
conn branch1 left=1.2.3.4 leftid=@headoffice leftsubnet=0.0.0.0/0 leftrsasigkey=0sA[...] # right=10.11.12.13 rightid=@branch2 righsubnet=10.0.1.0/24 rightrsasigkey=0sAYYYY[...] # auto=start authby=rsasigkey conn passthrough left=1.2.3.4 right=0.0.0.0 leftsubnet=10.0.1.0/24 rightsubnet=10.0.1.0/24 authby=never type=passthrough auto=route
4.7.7. 使用 Libreswan 的 Road Warrior 应用
Road Warrior 是具有动态分配
IP
地址的流动客户端的旅行用户,比如说笔记本电脑。这些通过证书进行身份验证。
在服务器上:
conn roadwarriors left=1.2.3.4 # if access to the LAN is given, enable this #leftsubnet=10.10.0.0/16 leftcert=gw.example.com leftid=%fromcert right=%any # trust our own Certificate Agency rightca=%same # allow clients to be behind a NAT router rightsubnet=vhost:%priv,%no authby=rsasigkey # load connection, don't initiate auto=add # kill vanished roadwarriors dpddelay=30 dpdtimeout=120 dpdaction=%clear
在流动客户端上,也就是 Road Warrior 的设备上,我们需要稍微修改以上配置:
conn roadwarriors # pick up our dynamic IP left=%defaultroute leftcert=myname.example.com leftid=%fromcert # right can also be a DNS hostname right=1.2.3.4 # if access to the remote LAN is required, enable this #rightsubnet=10.10.0.0/16 # trust our own Certificate Agency rightca=%same authby=rsasigkey # Initiate connection auto=start
4.7.8. Road Warrior 应用使用了 Libreswan 与 X.509 的 XAUTH
当使用 XAUTH
IPsec
扩展名来建立链接时,Libreswan 本身提供了分配 IP
地址的方法以及 DNS 信息去漫游VPN客户端。也可使用 PSK 或 X.509 证书来部署 XAUTH,使用 X.509 部署更安全。客户端证书可以被证书吊销列表或 “在线证书状态协议” (OCSP) 吊销。使用 X.509 证书,个体客户端不能模拟服务器。使用 PSK,也被称为组密码,在理论上是可行的。
此外,XAUTH 要求 VPN 客户端使用用户名和密码来识别自身。用一次性密码(OTP,One time Passwords),比如谷歌验证器或 RSA 安全 ID 标记,一次性标记可被附加到用户密码之后。
对XAUTH有三种可能的后端:
xauthby=pam
- 它使用在
/etc/pam.d/pluto
的配置来验证用户。 它自身可以使用多种后端来配置 Pam。它可以使用系统账户用户密码方案在、LDAP 目录、RADIUS 服务器或自定义密码验证模块。 xauthby=file
- 它使用配置文件
/etc/ipsec.d/passwd
(不要与/etc/ipsec.d/nsspassword
混淆)。这个文件的格式与 Apache、htpasswd
文档类似和 Apachehtpasswd
命令可以被用来创建此文件里的条目。但是,在用户名和密码之后,要求第三列使用IPsec
链接名的链接,比如说当使用“链接远程用户”提供VPN来删除用户,密码文件的条目应该看起来如下:user1:$apr1$MIwQ3DHb$1I69LzTnZhnCT2DPQmAOK.:remoteusers
NOTE:当使用htpasswd
命令,链接名须被手动添加在 用户之后:每一行user:password 之后。 xauthby=alwaysok
- 服务器总是会假定 XAUTH 用户和密码的组合是正确的。尽管服务器忽略了这些,客户端也需要指定用户名和密码。这些只有当用户被 X.509 证书识别之后才能被使用,或者在不需要 XAUTH 后端时检测 VPN。
使用 X.509 证书的配置示例
conn xauth-rsa auto=add authby=rsasig pfs=no rekey=no left=ServerIP leftcert=vpn.example.com #leftid=%fromcert leftid=vpn.example.com leftsendcert=always leftsubnet=0.0.0.0/0 rightaddresspool=10.234.123.2-10.234.123.254 right=%any rightrsasigkey=%cert modecfgdns1=1.2.3.4 modecfgdns2=8.8.8.8 modecfgdomain=example.com modecfgbanner="Authorized Access is allowed" leftxauthserver=yes rightxauthclient=yes leftmodecfgserver=yes rightmodecfgclient=yes modecfgpull=yes xauthby=pam dpddelay=30 dpdtimeout=120 dpdaction=clear ike_frag=yes # for walled-garden on xauth failure # xauthfail=soft #leftupdown=/custom/_updown
当
xauthfail
被设定为“soft",而不是 "hard",验证失败便被忽略,VPN 被设定为像验证用户是成功的一样。从上至下的自定义脚本可以被用来检查环境变量 XAUTH_FAILED
。这些用户可以被重新定向,比如使用 iptables DNAT 重新定向至 “墙内的花园” ,在那里他们可以联系管理员,或者更新这项服务的付费订阅。
VPN 客户端使用
modecfgdomain
值和 DNS 条目去重新定向为指定的域查询指定的名称服务器。这使得漫游用户可以使用内部 DNS 名称,来访问仅供内部使用的资源。
如果
leftsubnet
不是 0.0.0.0/0
,拆分隧道配置请求会被自动送到客户端。比如说,当使用 leftsubnet=10.0.0.0/8
,VPN 客户端只会通过 VPN 把流量送到 10.0.0.0/8
。
4.7.9. 附加资源
接下来的信息源会提供关于 LibreSwan 以及
ipsec
后台程序的额外资源。
4.7.9.1. 已安装的文档
ipsec(8)
手册页——为ipsec
描述命令选项。ipsec.conf(5)
手册页-包含配置ipsec
的信息。ipsec.secrets(5)
手册页—包含配置ipsec
的信息。ipsec_auto(8)
man page —描述 auto的命令行客户端的命令选项,以操作自动键入的 LibreSwanIPsec
链接。ipsec_rsasigkey(8)
手册页-描述生成 RSA 签名秘钥的工具。/usr/share/doc/libreswan-version/README.nss
——描述用于原始 RSA 秘钥的命令及使用 Libreswanpluto
程序的加密库的证书。
4.7.9.2. 在线文档编制
- https://libreswan.org
- 上游项目的网站。
- http://www.mozilla.org/projects/security/pki/nss/
- 网络安全服务(Network Security Services)项目
为了尽快向用户提供最新的信息,本文档可能会包括由机器自动从英文原文翻译的内容。如需更多信息,请参阅此说明。