4.7. 保护虚拟私用网络(VPN)

在 Red Hat Enterprise Linux 7 中,VPN可以用受到 Libreswan 应用支持的 IPsec 加密通道协议来进行配置( Virtual Private Network(VPN) )。LibreswanOpenswan 应用的一个分支,是可交换文档中的例子。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-TraversalUDP 端口 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 KeysPSK) 是最简单的证明方法。PSK 由随机字符组成,长度至少为 20 个字符。考虑到非随机和和短的 PSK 的危险,当系统在 FIPS 模式下运行时,这个方法不能使用。
  • Raw RSA 值常用于静态的主机对主机,或者子网对子网的 IPsec 配置。这些主机用彼此的公共 RSA 秘钥手动配置。当许多或者更多主机都需要彼此建立 IPsec 通道时,这个方法不能很好地扩展。
  • X.509 认证常用于有许多主机需要连接到一个常用的 IPsec 通道的大规模配置。一个中央认证中心 (certificate authorityCA))被用于为主机或者用户注册 RSA 认证。这个中央 CA 负责转播信任关系,包括取消每个主机和用户。

4.7.3. 使用 Libreswan 的主机对主机 VPN

要配置 Libreswan 创建一个主机对主机 IPsec VPN,在两个被指定为 leftright 的主机之间,以 root 身份在指定为 left 的主机上输入以下命令,创建一个新的 RSA 秘钥组:
~]# ipsec newhostkey --configdir /etc/ipsec.d \
          --output /etc/ipsec.d/www.example.com.secrets
Generated RSA key pair using the NSS database
这样产生一个用于主机的 RSA 秘钥组。产生 RSA 的过程要花上好几分钟,尤其是在带低熵的虚拟机上。
要查看公共秘钥,以 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
您可以在左右主机上使用完全相同的配置文件。系统会自动侦测 leftright。如果其中一个主机是移动主机,致使 IP 地址无法提前获取,那么就在移动主机上把 %defaultroute 用作它的 IP 地址。它能自动获取动态 IP 地址。在接受了来自接入手机的连接的静态主机上,用 %any 指定移动主机的 IP 地址。
确保 leftrsasigkey 值从 left 主机上获取,确定 rightrsasigkeyright 主机上获取。
重启 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 文档类似和 Apache htpasswd 命令可以被用来创建此文件里的条目。但是,在用户名和密码之后,要求第三列使用 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的命令行客户端的命令选项,以操作自动键入的 LibreSwan IPsec 链接。
  • ipsec_rsasigkey(8) 手册页-描述生成 RSA 签名秘钥的工具。
  • /usr/share/doc/libreswan-version/README.nss——描述用于原始 RSA 秘钥的命令及使用 Libreswan pluto 程序的加密库的证书。

4.7.9.2. 在线文档编制

https://libreswan.org
上游项目的网站。
http://www.mozilla.org/projects/security/pki/nss/
网络安全服务(Network Security Services)项目