4.6. 使用 Libreswan 保护虚拟专用网络(VPN)
在 Red Hat Enterprise Linux 7 中,可以使用 Libreswan 应用程序支持的
IPsec
协议配置 虚拟专用网络 (VPN)。Libreswan 是 Openswan 应用程序的延续,Openswan 文档中的许多示例可以通过 Libreswan 交换。NetworkManager IPsec
插件称为 NetworkManager-libreswan。GNOME Shell 的用户应该安装 NetworkManager-libreswan-gnome 软件包,该软件包具有 NetworkManager-libreswan 作为依赖项。请注意,NetworkManager-libreswan-gnome 软件包只包括在 Optional 频道中。请参阅启用补充和可选存储库。
VPN 的
IPsec
协议本身使用 互联网密钥交换 (IKE)协议进行配置。术语 IPsec 和 IKE 可互换使用。IPsec VPN 也称为 IKE VPN、IKEv2 VPN、XAUTH VPN、Cisco VPN 或 IKE/IPsec VPN。IPsec VPN 变体,它使用 Level 2 Tunneling Protocol (L2TP),它通常被称为 L2TP/IPsec VPN,它需要 Optional 频道 xl2tpd 应用程序。
Libreswan 是 Red Hat Enterprise Linux 7 中提供的开源用户空间
IKE
实现。IKE
版本 1 和 2 作为用户级别的守护进程实现。IKE 协议本身也加密。IPsec
协议由 Linux 内核实现,Libreswan 配置内核以添加和删除 VPN 隧道配置。
IKE
协议使用 UDP 端口 500 和 4500。IPsec
协议由两个不同的协议组成,即 Encapsulated Security Payload (ESP),其协议号为 50,以及协议号 51 的 Authenticated Header (AH)。不建议使用 AH
协议。建议 AH
用户迁移到使用 null 加密的 ESP
。
IPsec
协议有两种不同的操作模式,即 Tunnel 模式
(默认)和 传输模式
。可以使用没有 IKE 的 IPsec 配置内核。这称为 手动密钥
。可以使用 ip xfrm 命令手动配置密钥,但为了安全起见,强烈建议您这样做。Libreswan 使用 netlink 与 Linux 内核连接。在 Linux 内核中进行数据包加密和解密。
Libreswan 使用 网络安全服务 (NSS)加密库。libreswan 和 NSS 均通过了 联邦信息处理标准(FIPS )出版物 140-2 的认证。
重要
由 Libreswan 和 Linux 内核实现的
IKE
/IPsec
VPN 是 Red Hat Enterprise Linux 7 中推荐的唯一 VPN 技术。在不了解这样做风险的情况下不要使用任何其他 VPN 技术。
4.6.1. 安装 Libreswan
要安装 Libreswan,请以
root
用户身份输入以下命令:
~]# yum install libreswan
检查是否安装了 Libreswan :
~]$ yum info libreswan
在一个新的 Libreswan 安装后,应初始化 NSS 数据库作为安装过程的一部分。在启动新的数据库前,请按如下所示删除旧数据库:
~]# systemctl stop ipsec ~]# rm /etc/ipsec.d/*db
然后,要初始化新的 NSS 数据库,请以
root
用户身份输入以下命令:
~]# ipsec initnss
Initializing NSS database
仅在 FIPS 模式下运行时,需要使用密码保护 NSS 数据库。要为 FIPS 模式初始化数据库,而不是上一个命令,请使用:
~]# certutil -N -d sql:/etc/ipsec.d
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:
要启动 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; vendor preset: disabled)
Active: active (running) since Sun 2018-03-18 18:44:43 EDT; 3s ago
Docs: man:ipsec(8)
man:pluto(8)
man:ipsec.conf(5)
Process: 20358 ExecStopPost=/usr/sbin/ipsec --stopnflog (code=exited, status=0/SUCCESS)
Process: 20355 ExecStopPost=/sbin/ip xfrm state flush (code=exited, status=0/SUCCESS)
Process: 20352 ExecStopPost=/sbin/ip xfrm policy flush (code=exited, status=0/SUCCESS)
Process: 20347 ExecStop=/usr/libexec/ipsec/whack --shutdown (code=exited, status=0/SUCCESS)
Process: 20634 ExecStartPre=/usr/sbin/ipsec --checknflog (code=exited, status=0/SUCCESS)
Process: 20631 ExecStartPre=/usr/sbin/ipsec --checknss (code=exited, status=0/SUCCESS)
Process: 20369 ExecStartPre=/usr/libexec/ipsec/_stackmanager start (code=exited, status=0/SUCCESS)
Process: 20366 ExecStartPre=/usr/libexec/ipsec/addconn --config /etc/ipsec.conf --checkconfig (code=exited, status=0/SUCCESS)
Main PID: 20646 (pluto)
Status: "Startup completed."
CGroup: /system.slice/ipsec.service
└─20646 /usr/libexec/ipsec/pluto --leak-detective --config /etc/ipsec.conf --nofork
要确保 Libreswan 在系统启动时启动,以
root
用户身份运行以下命令:
~]# systemctl enable ipsec
- 用于
互联网密钥交换
(IKE)协议的UDP
端口 500 和 4500 - 用于
封装安全负载
(ESP)IPsec
数据包的协议 50 - 协议 51 用于
Authenticated Header
(AH)IPsec
数据包(uncommon)
我们提供了使用 Libreswan 设置
IPsec
VPN 的三个示例。第一个示例是将两个主机连接在一起,以便它们可以安全地通信。第二个示例将两个站点连接在一起以组成一个网络。第三个示例支持远程用户,在此上下文中称为 road warriors。
4.6.2. 使用 Libreswan 创建 VPN 配置
Libreswan 不使用术语 “ ‘源和目的地’ 或 ‘ “服务器和客户端” ’ ”,因为 IKE/IPsec 是对等协议。而是使用 “左侧的” 术语 “来指代” 端点(主机)。这也允许大多数情况下在两个端点上使用相同的配置,尽管许多管理员选择始终为本地主机使用,并 “适合” 远程主机。“”
身份验证端点有四个常用的方法:
- 预共享密钥 (PSK)是最简单的验证方法。PSK 应该由随机字符组成,长度至少为 20 个字符。在 FIPS 模式中,PSK 需要根据所使用的完整性算法满足最低强度要求。建议您不要使用小于 64 个随机字符的 PSK。
- 原始 RSA 密钥通常用于静态主机到主机或子网到子网
IPsec
配置。主机使用其他的公共 RSA 密钥手动配置。当几十个或更多主机都需要相互设置IPsec
隧道时,此方法无法很好地扩展。 - X.509 证书通常用于大型部署,其中有很多主机需要连接到一个通用的
IPsec
网关。中央 证书颁发机构 (CA)用于为主机或用户签名 RSA 证书。此中央 CA 负责中继信任,包括单个主机或用户的撤销。 - NULL 身份验证用于在不进行身份验证的情况下获取网格加密。它可防止被动攻击,但不会防止主动攻击。但是,由于
IKEv2
允许非对称身份验证方法,因此 NULL 身份验证也可用于互联网扩展 Opportunistic IPsec,其中客户端验证服务器,但服务器不验证客户端。此模型与使用TLS
(也称为 https:// 网站)的安全网站类似。
除了这些身份验证方法外,还可以添加额外的身份验证,以防止量子计算机可能的攻击。这个额外的验证方法称为 Postquantum Preshared Keys (PPK。单个客户端或客户端组可以通过指定与带外配置的预共享密钥对应的PPKID 来使用它们自己的 PPK。请参阅 第 4.6.9 节 “对 Quantum 计算机使用保护”。
4.6.3. 使用 Libreswan 创建主机到主机 VPN
要将 Libreswan 配置为在称为“ ‘left’ ” 和 “ ‘right’ ”的两个主机之间创建主机到主机的
IPsec
VPN,请在两个主机(左和右侧 )上以 root
身份输入以下命令来创建新的原始 RSA 密钥对:
~]# ipsec newhostkey --output /etc/ipsec.d/hostkey.secrets
Generated RSA key pair with CKAID 14936e48e756eb107fa1438e25a345b46d80433f was stored in the NSS database
这会为主机生成 RSA 密钥对。生成 RSA 密钥的过程可能需要很长时间,特别是在具有低熵的虚拟机中。
要查看主机密钥,以便可以在配置中指定它,作为
root
用户添加到新主机密钥的主机上,使用 “newhostkey” 命令返回的 CKAID : “”
~]# ipsec showhostkey --left --ckaid 14936e48e756eb107fa1438e25a345b46d80433f
# rsakey AQPFKElpV
leftrsasigkey=0sAQPFKElpV2GdCF0Ux9Kqhcap53Kaa+uCgduoT2I3x6LkRK8N+GiVGkRH4Xg+WMrzRb94kDDD8m/BO/Md+A30u0NjDk724jWuUU215rnpwvbdAob8pxYc4ReSgjQ/DkqQvsemoeF4kimMU1OBPNU7lBw4hTBFzu+iVUYMELwQSXpremLXHBNIamUbe5R1+ibgxO19l/PAbZwxyGX/ueBMBvSQ+H0UqdGKbq7UgSEQTFa4/gqdYZDDzx55tpZk2Z3es+EWdURwJOgGiiiIFuBagasHFpeu9Teb1VzRyytnyNiJCBVhWVqsB4h6eaQ9RpAMmqBdBeNHfXwb6/hg+JIKJgjidXvGtgWBYNDpG40fEFh9USaFlSdiHO+dmGyZQ74Rg9sWLtiVdlH1YEBUtQb8f8FVry9wSn6AZqPlpGgUdtkTYUCaaifsYH4hoIA0nku4Fy/Ugej89ZdrSN7Lt+igns4FysMmBOl9Wi9+LWnfl+dm4Nc6UNgLE8kZc+8vMJGkLi4SYjk2/MFYgqGX/COxSCPBFUZFiNK7Wda0kWea/FqE1heem7rvKAPIiqMymjSmytZI9hhkCD16pCdgrO3fJXsfAUChYYSPyPQClkavvBL/wNK9zlaOwssTaKTj4Xn90SrZaxTEjpqUeQ==
您需要此密钥来添加到两个主机上的配置文件中,如下所示。如果您忘记了 CKAID,您可以使用以下方法获取机器上所有主机密钥的列表:
~]# ipsec showhostkey --list
< 1 > RSA keyid: AQPFKElpV ckaid: 14936e48e756eb107fa1438e25a345b46d80433f
密钥对的 secret 部分存储在 “NSS 数据库中”,该数据库位于
/etc/ipsec.d8:0:1::.db
中。
要使此主机到主机的隧道的配置文件,上面的行
leftrsasigkey=
和 rightrsasigkey=
将添加到位于 /etc/ipsec.d/
目录中的自定义配置文件中。
以
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
公钥也可以由其 CKAID 而不是其 RSAID 配置。在这种情况下,使用 “leftckaid=” 而不是 “leftrsasigkey=”
您可以在左侧和右侧主机上使用相同的配置文件。Libreswan 根据指定的 IP 地址或主机名自动检测它是否 “保留” 或 “右侧”。如果其中一个主机是移动主机,这表示之前不知道
IP
地址,那么在移动客户端上,移动客户端将使用 %defaultroute
作为其 IP
地址。这将自动获取动态 IP
地址。在接受来自传入移动主机的静态服务器主机上,使用 %any
指定其 IP
地址的移动主机。
确保
leftrsasigkey
值 “从左侧” 主机获取,并且从右侧主机获取 “ right
rsasigkey” 值。使用 leftckaid
和 rightckaid
时也是如此。
重启
ipsec
以确保它读取新配置,如果配置为在引导时启动,确认隧道已建立:
~]# systemctl restart ipsec
使用
auto=start
选项时,应在几秒钟内建立 IPsec
隧道。您可以以 root
用户身份输入以下命令来手动加载和启动隧道:
~]# ipsec auto --add mytunnel ~]# ipsec auto --up mytunnel
4.6.3.1. 使用 Libreswan 验证主机到主机 VPN
IKE
协商在 UDP
端口 500 和 4500 上发生。IPsec
数据包显示为 封装安全 Payload
(ESP)数据包。ESP
协议没有端口。当 VPN 连接需要通过 NAT 路由器时,ESP
数据包会封装在端口 4500 的 UDP
数据包中。
要验证数据包是否通过 VPN 隧道发送,请以
root
用户身份以 root 用户身份运行以下命令:
~]# tcpdump -n -i interface esp or udp port 500 or 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,而不是在其中一个端点本身上运行。当使用虚拟 Tunnel 接口(VTI)时,物理接口的 tcpdump 会显示 ESP
数据包,而 VTI 接口上的 tcpdump 会显示明文流量。
要检查隧道已完全建立,另外查看通过隧道有多少流量,请以
root
用户身份输入以下命令:
~]# ipsec whack --trafficstatus
006 #2: "mytunnel", type=ESP, add_time=1234567890, inBytes=336, outBytes=336, id='@east'
4.6.4. 使用 Libreswan 配置站点到站点 VPN
为了让 Libreswan 创建站点到站点的
IPsec
VPN,请将两个网络连接在一起,会在两个主机间创建一个 IPsec
隧道,该端点配置为允许来自一个或多个子网的流量来传递。因此,它们可以被视为网络远程部分的网关。站点到站点 VPN 的配置只能与主机到主机 VPN 不同,同时必须在配置文件中指定一个或多个网络或子网。
要将 Libreswan 配置为创建站点到站点的
IPsec
VPN,首先配置主机到主机的 IPsec
VPN,如 第 4.6.3 节 “使用 Libreswan 创建主机到主机 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 auto=start conn mysubnet6 also=mytunnel connaddrfamily=ipv6 leftsubnet=2001:db8:0:1::/64 rightsubnet=2001:db8:0:2::/64 auto=start 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
要启动隧道,重启 Libreswan 或手动加载并启动所有连接,以
root
用户身份启动所有连接:
~]# ipsec auto --add mysubnet
~]# ipsec auto --add mysubnet6
~]# 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}
4.6.4.1. 使用 Libreswan 验证站点到站点 VPN
验证数据包是否通过 VPN 隧道发送,与 第 4.6.3.1 节 “使用 Libreswan 验证主机到主机 VPN” 中所述的步骤相同。
4.6.5. 使用 Libreswan 配置站点到站点的单一 Tunnel VPN
通常,当构建站点到站点隧道时,网关需要使用其内部 IP 地址而不是其公共
IP
地址相互通信。这可以通过一个隧道来完成。如果左侧主机(主机名为 west
)具有内部 IP
地址 192.0.1.254
和正确的主机(主机名 east
)具有内部 IP
地址 192.0.2.254
,请使用单一隧道将以下配置存储在两个服务器上的 /etc/ipsec.d/myvpn.conf
文件中:
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.6.6. 使用 Libreswan 配置子网扩展
IPsec
通常部署在 hub 和 spoke 架构中。每个叶节点都有一个 IP
范围,它是更大的范围。通过 hub 相互沟通。这称为 子网入侵。
例 4.2. 配置简单子网扩展设置
在以下示例中,我们使用
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 rightsubnet=10.0.1.0/24 rightrsasigkey=0sAXXXX[...] # auto=start authby=rsasig conn branch2 left=1.2.3.4 leftid=@headoffice leftsubnet=0.0.0.0/0 leftrsasigkey=0sA[...] # right=10.11.12.13 rightid=@branch2 rightsubnet=10.0.2.0/24 rightrsasigkey=0sAYYYY[...] # auto=start authby=rsasig
在 “分支1” 办公室中,我们使用相同的连接。另外,我们使用直通连接来排除通过隧道发送的本地 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 rightsubnet=10.0.1.0/24 rightrsasigkey=0sAYYYY[...] # auto=start authby=rsasig 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.6.7. 配置 IKEv2 远程访问 VPN Libreswan
road warriors 是带动态分配
IP
地址(如笔记本电脑)的移动客户端的旅行用户。它们使用证书进行身份验证。为了避免需要使用旧的 IKEv1 XAUTH 协议,在以下示例中使用 IKEv2:
在服务器中:
conn roadwarriors ikev2=insist # Support (roaming) MOBIKE clients (RFC 4555) mobike=yes fragmentation=yes left=1.2.3.4 # if access to the LAN is given, enable this, otherwise use 0.0.0.0/0 # leftsubnet=10.10.0.0/16 leftsubnet=0.0.0.0/0 leftcert=vpn-server.example.com leftid=%fromcert leftxauthserver=yes leftmodecfgserver=yes right=%any # trust our own Certificate Agency rightca=%same # pick an IP address pool to assign to remote users # 100.64.0.0/16 prevents RFC1918 clashes when remote users are behind NAT rightaddresspool=100.64.13.100-100.64.13.254 # if you want remote clients to use some local DNS zones and servers modecfgdns="1.2.3.4, 5.6.7.8" modecfgdomains="internal.company.com, corp" rightxauthclient=yes rightmodecfgclient=yes authby=rsasig # optionally, run the client X.509 ID through pam to allow/deny client # pam-authorize=yes # load connection, don't initiate auto=add # kill vanished roadwarriors dpddelay=1m dpdtimeout=5m dpdaction=%clear
其中:
left=1.2.3.4
- 1.2.3.4 值指定服务器的实际 IP 地址或主机名。
leftcert=vpn-server.example.com
- 这个选项指定引用用于导入证书的友好名称或 nickname 的证书。通常,该名称作为 PKCSRG 证书捆绑包的一部分生成,格式为
.p12
文件。如需更多信息,请参阅pkcs12 (1)
和pk12util (1)
手册页。
在移动客户端上,road warrior 的设备使用之前配置的稍微变化:
conn to-vpn-server ikev2=insist # pick up our dynamic IP left=%defaultroute leftsubnet=0.0.0.0/0 leftcert=myname.example.com leftid=%fromcert leftmodecfgclient=yes # right can also be a DNS hostname right=1.2.3.4 # if access to the remote LAN is required, enable this, otherwise use 0.0.0.0/0 # rightsubnet=10.10.0.0/16 rightsubnet=0.0.0.0/0 # trust our own Certificate Agency rightca=%same authby=rsasig # allow narrowing to the server’s suggested assigned IP and remote subnet narrowing=yes # Support (roaming) MOBIKE clients (RFC 4555) mobike=yes # Initiate connection auto=start
其中:
auto=start
- 这个选项允许用户在
ipsec
系统服务启动时连接到 VPN。如果要稍后建立连接,请使用auto=add
替换它。
4.6.8. 使用 X.509 配置 IKEv1 远程访问 VPN Libreswan 和 XAUTH
Libreswan 提供了一种将
IP
地址和 DNS 信息原生分配给 roaming VPN 客户端的方法,因为使用 XAUTH IPsec
扩展建立连接。可以使用 PSK 或 X.509 证书部署扩展身份验证(XAUTH)。使用 X.509 部署更安全。客户端证书可以通过证书撤销列表或 在线证书状态协议 (OCSP)吊销。使用 X.509 证书时,单个客户端无法模拟服务器。使用 PSK (也称为组密码)是理论上可能的。
XAUTH 要求 VPN 客户端额外使用用户名和密码识别其自身。对于一次性密码(OTP),如 Google Authenticator 或 RSA SecureID 令牌,一次性令牌会附加到用户密码中。
XAUTH 有三个可能的后端:
xauthby=pam
- 这使用
/etc/pam.d/pluto
中的配置来验证用户。可插拔验证模块(PAM)可以自行配置为使用各种后端。它可以使用系统帐户 user-password 方案、LDAP 目录、RADIUS 服务器或自定义密码身份验证模块。如需更多信息,请参阅使用可插拔验证模块(PAM) 章节。 xauthby=file
- 这使用
/etc/ipsec.d/passwd
配置文件(不应与/etc/ipsec.d/nsspassword
文件混淆)。此文件的格式与 Apache.htpasswd
文件类似,可以使用 Apache htpasswd 命令在此文件中创建条目。但是,在用户名和密码后,使用使用的IPsec
连接名称需要第三列,例如使用conn remoteusers
来提供 VPN 来删除用户,密码文件条目应如下所示:user1:$apr1$MIwQ3DHb$1I69LzTnZhnCT2DPQmAOK.:remoteusers
注意在使用 htpasswd 命令时,必须在每行的 user:password 部分之后手动添加连接名称。 xauthby=alwaysok
- 服务器始终假定 XAUTH 用户和密码组合是正确的。客户端仍然需要指定用户名和密码,尽管服务器会忽略它们。只有在用户已经通过 X.509 证书标识时,或者测试 VPN 时,才应使用此选项,而无需 XAUTH 后端。
使用 X.509 证书的服务器配置示例:
conn xauth-rsa ikev2=never 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 modecfgdns="1.2.3.4,8.8.8.8" modecfgdomains=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 会像正确验证一样设置。自定义 updown 脚本可用于检查环境变量 XAUTH_FAILED
。然后可以将此类用户重定向到一个 “walled garden”,例如,他们可以联系管理员或续订该服务的付费订阅。
VPN 客户端使用
modecfgdomain
值和 DNS 条目将对指定域的查询重定向到这些指定的名称服务器。这允许用户使用内部 DNS 名称访问内部资源。请注意,虽然 IKEv2 支持使用 modecfgdomains
和 modecfgdns
的域名和名称服务器 IP 地址的逗号分隔列表,但 IKEv1 协议只支持一个域名,libreswan 最多只支持两个名称服务器 IP 地址。另外,要将横幅文本发送到 VPN cliens,请使用 modecfgbanner
选项。
如果
leftsubnet
不是 0.0.0.0/0
,则分割配置请求将自动发送到客户端。例如:在使用 leftsubnet=10.0.0.0/8
时,VPN 客户端只通过 VPN 为 10.0.0.0/8
发送流量。
在客户端上,用户必须输入用户密码,这取决于所使用的后端。例如:
xauthby=file
- 管理员生成密码并将其存储在
/etc/ipsec.d/passwd
文件中。 xauthby=pam
- 密码在
/etc/pam.d/pluto
文件的 PAM 配置中指定的位置获得。 xauthby=alwaysok
- 未检查密码,并且始终接受该密码。使用这个选项用于测试目的,或者要确保仅 xauth-only 客户端的兼容性。
其它资源
有关 XAUTH 的更多信息,请参阅 ISAKMP/Oakley (XAUTH) Internet-Draft 文档中的扩展身份验证。
4.6.9. 对 Quantum 计算机使用保护
使用带有预共享密钥的 IKEv1 可以防止量子攻击者。重新设计 IKEv2 不会原生提供这种保护。Libreswan 提供使用 Postquantum Preshared Keys (PPK)来保护 IKEv2 连接免受量子攻击。
要启用可选的 PPK 支持,请在连接定义中添加
ppk=yes
。如需要 PPK,请添加 ppk=insist
。然后,可为每个客户端分配一个带有一个 secret 值的 PPK ID,其 secret 值会被传递到带外(最好是使用半字节安全)。PPK 的随机性应该非常强大,且不能基于字典的单词。PPK ID 和 PPK 数据本身存储在 ipsec.secrets
中,例如:
@west @east : PPKS "user1" "thestringismeanttobearandomstr"
PPKS
选项指的是静态 PPK。有一个实验性功能,可以使用基于一次性平板的 Dynamic PPK。在每个连接中,一次性平板的一个新部分用作 PPK。当使用时,文件中的该部分动态 PPK 被零覆盖,以防止重复使用。如果没有剩余一次性材料,连接会失败。详情请查看 ipsec.secrets(5)
手册页。
警告
动态 PPK 的实现是作为技术预览提供的,这个功能应该小心使用。如需更多信息,请参阅 Red Hat Enterprise Linux 7.5 发行注记。
4.6.10. 其它资源
以下信息源提供有关 Libreswan 和
ipsec
守护进程的其他资源。
4.6.10.1. 安装的文档
IPsec (8)
手册页 - 描述ipsec
的命令选项。IPsec.conf (5)
手册页 - 包含配置ipsec
的信息。IPsec.secrets (5)
手册页 - 描述ipsec.secrets
文件的格式。ipsec_ auto (8)
手册页 - 描述使用自动命令行客户端来处理使用自动交换密钥建立的 LibreswanIPsec
连接。ipsec_rsasigkey (8)
手册页 - 描述用于生成 RSA 签名密钥的工具。/usr/share/doc/libreswan-version/
4.6.10.2. 在线文档
- https://libreswan.org
- 上游项目的网站。
- https://libreswan.org/wiki
- Libreswan Project Wiki。
- https://libreswan.org/man/
- 所有 Libreswan man page。
- NIST Special Publication 800-77: Guide to IPsec VPNs
- 在根据 IPsec 部署安全服务时为机构提供实际指导。