在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