在CentOS 8上使用Libreswan设置IPSec VPN服务器

欢迎使用我们今天的指南,该指南介绍如何在CentOS 8上使用Libreswan设置IPSec VPN服务器。 利伯斯旺 是针对Linux的IKE / IPsec的免费实现。 IPsec是Internet协议安全性,它使用强大的加密技术来提供身份验证和加密服务,并允许您通过不受信任的网络建立安全的隧道。 ipsec网关计算机会加密通过不可信网络的所有内容,并在隧道另一端的网关将其解密。生成的隧道是虚拟专用网或VPN。

IKE管理两个通信端点之间的身份验证。它还使端点可以协商用于设置IPsec隧道的算法。

在之前的指南中,我们介绍了如何在Ubuntu 18.04上使用StrongSwan安装和配置IPSec VPN。见下面的链接;

在Ubuntu 18.04上使用StrongSwan配置IPSEC VPN

在CentOS 8上使用Libreswan设置IPSec VPN服务器

有不同 Libreswan的VPN服务器客户端实现。在本指南中,我们将学习如何为移动客户端(具有动态分配IP的客户端,例如笔记本电脑)设置IPSec VPN服务器,此处称为 road warriors,这样他们就可以从任何地方连接到本地LAN。移动客户端使用证书进行身份验证,因此使用IKEv2协议。

IKEv2 (Internet密钥交换版本2)是处理请求和响应操作的VPN加密协议。 IKE在两方之间执行相互身份验证,并建立IKE安全关联(SA),其中包括可以用于有效地建立用于封装安全有效载荷(ESP)或身份验证标头(AH)的SA的共享秘密信息,以及将要使用的一组加密算法。 SA用来保护它们承载的流量。

运行系统更新

更新服务器上的系统软件包以用作Libreswan VPN服务器。

dnf update

在CentOS 8上安装Libreswan

更新完成后,安装Libreswan。 Libreswan在CentOS 8 AppStream仓库中可用,因此,您可以使用软件包管理器进行简单安装,如下所示:

dnf install libreswan

跑步里伯斯旺

安装完成后,启动并启用Libreswan ipsec 服务以在系统启动时运行。

systemctl enable --now ipsec

初始化IPSec NSS数据库

接下来,您需要初始化网络安全服务(NSS)数据库。 NSS数据库用于存储身份验证密钥和身份证书。

ipsec initnss

如果以前有任何数据库,则可以将其删除,以便拥有新的数据库。 NSS数据库存储在 /etc/ipsec.d

要删除任何旧数据库,请停止IPsec(如果正在运行),然后通过运行以下命令来删除NSS数据库;

systemctl stop ipsec
rm -rf /etc/ipsec.d/*db

然后可以重新初始化NSS数据库。

ipsec initnss

然后启动IPSec;

systemctl start ipsec

在防火墙上打开Libreswan端口和协议

IKE 协议用途 UDP port 500 4500 而IPsec协议 Encapsulated Security Payload (ESP)和 Authenticated Header (AH)用途 protocol number 50 and 51 分别。

因此,请在您的活动防火墙区域上打开这些端口和协议。 VPN(左端点)服务器 在本指南中。

firewall-cmd --get-active-zone

打开默认防火墙区域上的端口和防火墙;

firewall-cmd --add-port={4500,500}/udp --permanent
firewall-cmd --add-protocol={50,51} --permanent

或者,您可以简单地使用IPSec服务。

firewall-cmd --add-service=ipsec --permanent

重新加载防火墙D

firewall-cmd --reload

使用Libreswan配置IPSec VPN服务器

Libreswan不使用客户端-服务器模型。但是,它使用以下术语 leftright 指涉及任何给定连接的端点。只要您在配置连接时保持使用术语的一致性,就可以任意使用左/右术语来指代每个系统。

启用IP转发

在两个 VPN server,您需要启用IP转发。

运行以下命令,检查是否启用了IP转发;

sysctl net.ipv4.ip_forward

如果输出是 net.ipv4.ip_forward = 0,则IP转发被禁用,您需要通过执行以下任一命令来启用;

只需在防火墙上启用IP伪装即可启用IP转发。

firewall-cmd --add-masquerade --permanent
firewall-cmd --reload

您可以验证IP转发;

cat /proc/sys/net/ipv4/ip_forward
1

值1表示已启用IP转发。

同样。您可以通过运行以下命令来启用IP转发;

echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf

使用新配置刷新sysctl.conf。

sysctl -p

另外,请确保禁用重定向。

less /etc/sysctl.d/50-libreswan.conf
# We disable redirects for XFRM/IPsec
net.ipv6.conf.default.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.rp_filter = 0

生成VPN服务器和客户端证书

接下来,您需要生成用于身份验证的VPN服务器和客户端证书。

创建证书生成数据库

运行以下命令以创建一个数据库,该数据库可用于生成存储私钥和CA证书,以用于生成主机证书。我们将使用 certutil 命令生成证书。

mkdir /etc/ipsec.d/certsdb
certutil -N -d sql:/etc/ipsec.d/certsdb

该命令提示您输入用于加密密钥的密码。

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: StRONgPassw0Rd
Re-enter password: StRONgPassw0Rd

生成CA证书

我们在本教程中使用自签名证书,因此,这就是我们生成本地CA证书的方式。

certutil -S -x -n "Kifarunix-demo CA" -s "O=Kifarunix-demo,CN=Kifarunix-demo CA" -k rsa -g 4096 -v 12 -d sql:/etc/ipsec.d/certsdb -t "CT,," -2

参考 man certutil 了解使用的选项。

运行该命令时,将首先提示您输入用于加密上面设置的密钥的密码。输入密码以继续。

接下来,您需要通过在键盘上键入任意键直到进度条已满,来生成用于创建键的随机种子。填满后,按Enter继续。

...
Continue typing until the progress meter is full:

|************************************************************|

Finished.  Press enter to continue: ENTER
  • 接下来,输入 ÿ 指定这是正在生成的CA证书。
  • 按ENTER键选择路径长度
  • 输入 ñ 指定这不是关键扩展。
Generating key.  This may take a few moments...

Is this a CA certificate [y/N]?
y
Enter the path length constraint, enter to skip [<0 for unlimited path]: > ENTER
Is this a critical extension [y/N]?
n

生成VPN服务器证书

接下来,生成使用上面创建的CA签名的服务器证书,并为其分配扩展名。

certutil -S -c "Kifarunix-demo CA" -n "vpn.kifarunix-demo.com" -s "O=Kifarunix-demo,CN=vpn.kifarunix-demo.com" -k rsa -g 4096 -v 12 -d sql:/etc/ipsec.d/certsdb -t ",," -1 -6 -8 "vpn.kifarunix-demo.com"

同样,输入密钥加密密码,从键盘生成种子,然后按Enter继续。

定义密钥和密钥扩展名用法。

Generating key.  This may take a few moments...

		0 - Digital Signature
		1 - Non-repudiation
		2 - Key encipherment
		3 - Data encipherment
		4 - Key agreement
		5 - Cert signing key
		6 - CRL signing key
		Other to finish
 > 0
		0 - Digital Signature
		1 - Non-repudiation
		2 - Key encipherment
		3 - Data encipherment
		4 - Key agreement
		5 - Cert signing key
		6 - CRL signing key
		Other to finish
 > 2
		0 - Digital Signature
		1 - Non-repudiation
		2 - Key encipherment
		3 - Data encipherment
		4 - Key agreement
		5 - Cert signing key
		6 - CRL signing key
		Other to finish
 > 8
Is this a critical extension [y/N]?
n
		0 - Server Auth
		1 - Client Auth
		2 - Code Signing
		3 - Email Protection
		4 - Timestamp
		5 - OCSP Responder
		6 - Step-up
		7 - Microsoft Trust List Signing
		Other to finish
 > 0
		0 - Server Auth
		1 - Client Auth
		2 - Code Signing
		3 - Email Protection
		4 - Timestamp
		5 - OCSP Responder
		6 - Step-up
		7 - Microsoft Trust List Signing
		Other to finish
 > 8
Is this a critical extension [y/N]?
N

生成VPN客户端证书

运行以下命令以生成VPN客户端证书。将证书名称(此处使用的主机名)替换为要为其生成客户端证书的主机的名称;

certutil -S -c "Kifarunix-demo CA" -n "janedoe.kifarunix-demo.com" -s "O=Kifarunix-demo,CN=janedoe.kifarunix-demo.com" -k rsa -g 4096 -v 12 -d sql:/etc/ipsec.d/certsdb -t ",," -1 -6 -8 "janedoe.kifarunix-demo.com"

同样,输入与上述相同的选项。

列出数据库中的可用证书

certutil -L -d sql:/etc/ipsec.d/certsdb
Certificate Nickname                                         Trust Attributes
                                                             SSL,S/MIME,JAR/XPI

Kifarunix-demo CA                                            CTu,u,u
vpn.kifarunix-demo.com                                       u,u,u
janedoe.kifarunix-demo.com                                   u,u,u
johndoe.kifarunix-demo.com                                   u,u,u

将网关证书导出并导入到pluto DB中。

pk12util -o vpn.kifarunix-demo.com.p12 -n "vpn.kifarunix-demo.com" -d sql:/etc/ipsec.d/certsdb

您可以跳过PKCS12密码。

ls
vpn.kifarunix-demo.com.p12

导出后,将VPN服务器证书导入数据库。

ipsec import vpn.kifarunix-demo.com.p12

导出客户端主机证书,私钥和CA证书。所有这些都将存储在.p12文件中,作为以下命令中指定的输出文件。

pk12util -o janedoe.kifarunix-demo.com.p12 -n "janedoe.kifarunix-demo.com" -d sql:/etc/ipsec.d/certsdb

同样,跳过PKCS12密码。

ls
janedoe.kifarunix-demo.com.p12 vpn.kifarunix-demo.com.p12

如果您已经为其他客户端主机生成了证书,则也可以将其导出。

创建IPSec VPN端点配置文件

在您的IPSec VPN主机上,在 /etc/ipsec.d 您的移动客户端的目录。 /etc/ipsec.conf 是Libreswan的默认配置文件,它具有一条指令以包括在上定义的其他配置 /etc/ipsec.d 目录。

vim /etc/ipsec.d/mobile-clients.conf

将以下配置放在上面的文件中。

conn roadwarriors
    left=vpn.kifarunix-demo.com
    leftsubnet=0.0.0.0/0
    leftcert=vpn.kifarunix-demo.com
    leftid=%fromcert
    leftrsasigkey=%cert
    leftsendcert=always
    right=%any
    rightaddresspool=10.0.8.10-10.0.8.254
    rightca=%same
    rightrsasigkey=%cert
    modecfgdns="8.8.8.8,10.0.8.1"
    authby=rsasig
    auto=start
    dpddelay=60
    dpdtimeout=300
    dpdaction=clear
    mobike=yes
    ikev2=insist
    fragmentation=yes
    type=tunnel

参考 man ipsec.conf 有关上面使用的选项的全面说明。

验证配置文件中是否有任何错误;

/usr/libexec/ipsec/addconn --config /etc/ipsec.conf --checkconfig

如果没有错误,则以0状态退出命令。

echo $?

否则,任何错误都会显示在标准输出上。请先更正错误,然后再继续。

通过取消注释行来启用IPsec日志记录, #logfile=/var/log/pluto.log,在 /etc/ipsec.conf 组态。

config setup
        # Normally, pluto logs via syslog.
        logfile=/var/log/pluto.log
...

重新启动IPsec;

systemctl restart ipsec

检查状态;

systemctl status ipsec

如果ipsec无法启动,则必须存在配置语法错误。运行以下命令以查明错误。

journalctl -xe

为Libreswan禁用rp_filter并重新加载所有内核配置。

echo "net.ipv4.conf.all.rp_filter = 0" >> /etc/sysctl.d/50-libreswan.conf
sysctl --system

验证IPsec配置

要确认IPsec配置是否正确,只需运行以下命令即可;

ipsec verify
Verifying installed system and configuration files

Version check and ipsec on-path                   	[OK]
Libreswan 3.29 (netkey) on 4.18.0-193.6.3.el8_2.x86_64
Checking for IPsec support in kernel              	[OK]
 NETKEY: Testing XFRM related proc values
         ICMP default/send_redirects              	[OK]
         ICMP default/accept_redirects            	[OK]
         XFRM larval drop                         	[OK]
Pluto ipsec.conf syntax                           	[OK]
Checking rp_filter                                	[OK]
Checking that pluto is running                    	[OK]
 Pluto listening for IKE on udp 500               	[OK]
 Pluto listening for IKE/NAT-T on udp 4500        	[OK]
 Pluto ipsec.secret syntax                        	[OK]
Checking 'ip' command                             	[OK]
Checking 'iptables' command                       	[OK]
Checking 'prelink' command does not interfere with FIPS	[OK]
Checking for obsolete ipsec.conf options          	[OK]

将VPN客户端证书复制到您的移动客户端

你现在可以 将客户端证书复制到您的远程客户端 并连接到VPN服务器。

在本教程中,我们使用Ubuntu 20.04和Ubuntu 18.04系统作为远程客户端。

我们已经为两个主机生成了证书, janedoe.kifarunix-demo.comjohndoe.kifarunix-demo.com 分别适用于Ubuntu 20.04和Ubuntu 18.04客户端主机。

配置Libreswan客户端

在您的Ubuntu系统上,安装libreswan软件包。

apt update
apt install libreswan

创建Libreswan Client VPN连接配置文件

vim /etc/ipsec.d/johndoe.conf

在下面输入内容;

conn vpn.kifarunix-demo.com
	left=%defaultroute
	leftcert=johndoe.kifarunix-demo.com
	leftid=%fromcert
	leftrsasigkey=%cert
	leftsubnet=0.0.0.0/0 
	leftmodecfgclient=yes
	right=vpn.kifarunix-demo.com
	rightsubnet=0.0.0.0/0 
	[email protected]
	rightrsasigkey=%cert
	narrowing=yes
	ikev2=insist
	rekey=yes
	fragmentation=yes
	mobike=no
	auto=start

如果使用主机名,请确保它们是可解析的。

同样,在第二台主机上;

vim /etc/ipsec.d/janedoe.conf
conn vpn.kifarunix-demo.com
	left=%defaultroute
	leftcert=janedoe.kifarunix-demo.com
	leftid=%fromcert
	leftrsasigkey=%cert
	leftsubnet=0.0.0.0/0 
	leftmodecfgclient=yes
	right=vpn.kifarunix-demo.com
	rightsubnet=0.0.0.0/0 
	[email protected]
	rightrsasigkey=%cert
	narrowing=yes
	ikev2=insist
	rekey=yes
	fragmentation=yes
	mobike=no
	auto=start

检查配置语法;

/usr/lib/ipsec/addconn --config /etc/ipsec.conf --checkconfig

初始化NSS数据库;

sudo ipsec checknss

将PKCS#12 X.509证书文件导入NSS数据库;

sudo ipsec import janedoe.kifarunix-demo.com.p12

在其他客户端主机上执行相同的操作。按ENTER跳过PCKS12密码。

Enter password for PKCS12 file: ENTER
pk12util: PKCS12 IMPORT SUCCESSFUL
correcting trust bits for Kifarunix-demo CA

您可以在客户端主机上列出可用的证书。

certutil -L -d sql:/var/lib/ipsec/nss

启动IPsec并使它在系统启动时运行。

sudo ipsec setup start

检查状态;

systemctl status ipsec
● ipsec.service - Internet Key Exchange (IKE) Protocol Daemon for IPsec
     Loaded: loaded (/lib/systemd/system/ipsec.service; enabled; vendor preset: disabled)
     Active: active (running) since Sun 2020-06-21 12:28:02 EAT; 7min ago
       Docs: man:ipsec(8)
             man:pluto(8)
             man:ipsec.conf(5)
    Process: 11251 ExecStartPre=/usr/lib/ipsec/addconn --config /etc/ipsec.conf --checkconfig (code=exited, status=0/SUCCESS)
    Process: 11266 ExecStartPre=/usr/lib/ipsec/_stackmanager start (code=exited, status=0/SUCCESS)
    Process: 11742 ExecStartPre=/usr/sbin/ipsec --checknss (code=exited, status=0/SUCCESS)
    Process: 11743 ExecStartPre=/usr/sbin/ipsec --checknflog (code=exited, status=0/SUCCESS)
   Main PID: 11757 (pluto)
     Status: "Startup completed."
      Tasks: 2 (limit: 2319)
     Memory: 10.3M
     CGroup: /system.slice/ipsec.service
             └─11757 /usr/lib/ipsec/pluto --leak-detective --config /etc/ipsec.conf --nofork

Jun 21 12:28:02 koromicha pluto[11757]: "vpn.kifarunix-demo.com"[1] 192.168.56.133 #2: certificate verified OK: O=Kifarunix-demo,CN=vpn.kifarunix-demo>
Jun 21 12:28:02 koromicha pluto[11757]: "vpn.kifarunix-demo.com"[1] 192.168.56.133 #2: IKEv2 mode peer ID is ID_DER_ASN1_DN: 'CN=vpn.kifarunix-demo.co>
Jun 21 12:28:02 koromicha pluto[11757]: "vpn.kifarunix-demo.com"[1] 192.168.56.133 #2: Authenticated using RSA
Jun 21 12:28:02 koromicha pluto[11757]: "vpn.kifarunix-demo.com"[1] 192.168.56.133 #2: received INTERNAL_IP4_ADDRESS 10.0.8.10
Jun 21 12:28:02 koromicha pluto[11757]: "vpn.kifarunix-demo.com"[1] 192.168.56.133 #2: received INTERNAL_IP4_DNS 8.8.8.8
Jun 21 12:28:02 koromicha pluto[11757]: "vpn.kifarunix-demo.com"[1] 192.168.56.133 #2: received INTERNAL_IP4_DNS 10.0.8.1
Jun 21 12:28:02 koromicha pluto[11757]: "vpn.kifarunix-demo.com"[1] 192.168.56.133 #2: up-client output: updating resolvconf
Jun 21 12:28:02 koromicha pluto[11757]: "vpn.kifarunix-demo.com"[1] 192.168.56.133 #2: negotiated connection [10.0.8.10-10.0.8.10:0-65535 0] -> [0.0.0>
Jun 21 12:28:02 koromicha pluto[11757]: "vpn.kifarunix-demo.com"[1] 192.168.56.133 #2: STATE_V2_IPSEC_I: IPsec SA established tunnel mode {ESP/NAT=

检查其他远程主机上的状态。

在状态输出中,您可以检查分配的IP地址, INTERNAL_IP4_ADDRESS 10.0.8.10。在我的其他客户主机上, INTERNAL_IP4_ADDRESS 10.0.8.11

在每个客户端主机上加载连接;

sudo ipsec auto --add vpn.kifarunix-demo.com

通过建立每个主机上的连接来建立隧道;

sudo ipsec auto --up vpn.kifarunix-demo.com

从每个主机,ping另一个的VPN分配的IP地址。

ping 10.0.8.11 -c 4
PING 10.0.8.11 (10.0.8.11) 56(84) bytes of data.
64 bytes from 10.0.8.11: icmp_seq=1 ttl=63 time=2.82 ms
64 bytes from 10.0.8.11: icmp_seq=2 ttl=63 time=2.84 ms
64 bytes from 10.0.8.11: icmp_seq=3 ttl=63 time=3.06 ms
64 bytes from 10.0.8.11: icmp_seq=4 ttl=63 time=2.83 ms

--- 10.0.8.11 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3010ms
rtt min/avg/max/mdev = 2.820/2.888/3.060/0.099 ms

在另一主机上;

ping 10.0.8.10 -c 4
PING 10.0.8.10 (10.0.8.10) 56(84) bytes of data.
64 bytes from 10.0.8.10: icmp_seq=1 ttl=63 time=1.63 ms
64 bytes from 10.0.8.10: icmp_seq=2 ttl=63 time=2.38 ms
64 bytes from 10.0.8.10: icmp_seq=3 ttl=63 time=3.18 ms
64 bytes from 10.0.8.10: icmp_seq=4 ttl=63 time=2.86 ms

--- 10.0.8.10 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 1.631/2.516/3.187/0.588 ms

现在,两个远程主机可以通过IPsec VPN服务器进行通信。这使我们结束了有关如何在CentOS 8上使用Libreswan设置IPSec VPN服务器的教程的结尾。

进一步阅读/参考

Libreswan配置示例

Sidebar