====== IPsec VPN Strongswan su Debian 10 Buster ======
Pacchetti da installare:
* **strongswan** - Metapacchetto: serve a installare i pacchetti realmente necessari grazie al meccanismo delle dipendenze.
* **strongswan-starter** - Interpreta i file di configurazione ''/etc/ipsec.conf'' e avvia il demone ''charon'', installato per dipendenza diretta da ''strongswan'' e ''strongswan-charon''.
* **strongswan-charon** - Demone [[wp>Internet_Key_Exchange|Internet Key Exchange]], installato per dipendenza diretta da ''strongswan''.
La soluzione Debian supporta le connessioni **IKEv1** e **IKEv2**.
In alternativa al pacchetto **strongswan** è possibile installare **[[#alternativa_charon-systemd|charon-systemd]]**, che offre alcuni vantaggi in termini di semplicità di integrazione con **systemd**, ma non utilizza il tradizionale file di configurazione **/etc/ipsec.conf** né i tradizionali processi **/usr/lib/ipsec/starter** e **/usr/lib/ipsec/charon**.
===== File di configurazione =====
Qesti gli indirizzi IP coinvolti:
* **Lato Left (host locale)**
* IP pubblico: **132.82.168.98**
* Classe IP privata: **172.17.48.96/29** (broadcast 172.17.48.103)
* **Lato Right (host remoto)**
* IP pubblico: **134.191.21.5**
* Classe IP privata: **172.17.48.80/28** (broadcast 172.17.48.95)
**/etc/ipsec.conf**
config setup
# strictcrlpolicy=yes
# uniqueids = no
charondebug="all"
# More control on Charon debug. Default level is 1 "control",
# level 2 is "controlmore".
#charondebug="ike 2, knl 2, cfg 2, net 2, esp 2, dmn 2, mgr 2"
uniqueids = yes
include /etc/ipsec.d/office1-office2.conf
**/etc/ipsec.secrets**
include /etc/ipsec.d/office1-office2.secrets.inc
**/etc/ipsec.d/office1-office2.conf**
conn office1-office2
type=tunnel
auto=start
keyexchange=ikev2
authby=secret
left=132.82.168.98
leftsubnet=172.17.48.97/29
right=134.191.21.5
rightsubnet=172.17.48.81/28
ike=aes256-sha256-modp1536
esp=aes256-sha256-modp1536
aggressive=no
keyingtries=%forever
ikelifetime=86400s
lifetime=28800s
dpddelay=30s
dpdtimeout=120s
dpdaction=restart
closeaction=restart
L'opzione ''closeaction=restart'' dovrebbe servire a far ripartire la connessione nel caso in cui il remote invii un segnale **DELETE**, altrimenti si rischia che la connessione termini con questo log e non riparta più:
charon: 07[IKE] received DELETE for IKE_SA office1-office2[5]
charon: 07[IKE] deleting IKE_SA office1-office2[5]
between 132.82.168.98[213.182.68.98]...134.191.21.5[134.191.21.5]
ipsec[30830]: 07[IKE] received DELETE for IKE_SA office1-office2[5]
ipsec[30830]: 07[IKE] deleting IKE_SA office1-office2[5]
between 132.82.168.98[213.182.68.98]...134.191.21.5[134.191.21.5]
**/etc/ipsec.d/office1-office2.secrets.inc** (impostare **mode 0600**):
# ------- Site 1 Gateway (office1-office2) -------
132.82.168.98 134.191.21.5 : PSK "de66979eaa77587d6b0e74d5bf871565"
# ------- Site 2 Gateway (office2-office1) -------
134.191.21.5 132.82.168.98 : PSK "de66979eaa77587d6b0e74d5bf871565"
===== Host remoto (right) dietro NAT =====
Se l'host remoto è dietro NAT è necessario cambiare la configurazione, altrimenti la SA non si stabilisce e nei log si trova qualcosa del genere:
ipsec[21090]: 05[NET] received packet: from 134.191.21.5[4500] to 213.182.68.98[4500] (224 bytes)
ipsec[21090]: 05[ENC] parsed IKE_AUTH response 1 [ IDr AUTH N(MSG_ID_SYN_SUP) SA TSi TSr ]
ipsec[21090]: 05[IKE] authentication of '10.151.252.18' with pre-shared key successful
ipsec[21090]: 05[CFG] constraint check failed: identity '134.191.21.5' required
ipsec[21090]: 05[CFG] selected peer config 'office1-office2' unacceptable: constraint checking failed
ipsec[21090]: 05[CFG] no alternative config found
Si vede che l'host remoto ha indirizzo IP 10.151.252.18, ma si presenta dietro NAT dall'IP 134.191.21.5. Nonostante la pre-shared key sia corretta, il controllo di identità dell'host remoto viene considerato fallito.
Anche questo messaggio è esplicativo: il match dell'host remoto con **IP_pubblico[IP_privato]** fallisce:
ipsec[21090]: 09[CFG] looking for peer configs matching 132.82.168.98[%any]...134.191.21.5[10.151.252.18]
ipsec[21090]: 09[CFG] no matching peer config found
Nel file di configurazione **office1-office2.conf** va aggiunta l'opzione **rightid** per identificare l'host remoto con il suo IP privato:
...
right=134.191.21.5
rightid=10.151.252.18
...
e quindi nel file delle PSK si deve identificare l'host remoto con il suo IP privato:
# ------- Site 1 Gateway (office1-office2) -------
132.82.168.98 10.151.252.18 : PSK "de66979eaa77587d6b0e74d5bf871565"
# ------- Site 2 Gateway (office2-office1) -------
10.151.252.18 132.82.168.98 : PSK "de66979eaa77587d6b0e74d5bf871565"5"
In alternativa si dovrebbe poter specificare **%%rightid=%any%%** in modo che un qualunque IP privato venga accettato. La PSK dovrebbe potersi selezionare in quel caso tramite l'IP pubblico.
===== Configurazione Shorewall =====
**/etc/shorewall/rules**
ACCEPT net:134.191.21.5 $FW esp
ACCEPT net:134.191.21.5 $FW udp 500
ACCEPT net:134.191.21.5 $FW udp 4500
**ATTENZIONE**: In effetti la porta **4500/UDP** viene usata solo se il traffico IPsec deve attraversare qualche apparato che fa **NAT** e che non potrebbe trasportare il protocollo ESP (che non ha porte). In tal caso il traffico ESP viene incapsulato in pacchetti UDP con la porta 4500.
**/etc/shorewall/tunnels**
ipsec net 134.191.21.5 # Remote IPSEC gateway
**/etc/shorewall/zones**
sec ipv4
**/etc/shorewall/hosts**
sec eth0:172.17.48.80/28,134.191.21.5 ipsec
===== Abilitare e avviare il servizio =====
In Debian 10 i servizi sono gestiti da **systemd**: ricordarsi di abilitare il servizio e se necessario avviarlo:
systemctl is-enabled strongswan.service
systemctl enable strongswan.service
systemctl start strongswan.service
===== Verifica =====
==== Avvio della connessione ====
Per avviare la VPN si può utilizzare il comando **ipsec start** (attenzione, perché questo comando avvia il demone fuori dal controllo di **systemd**).
ipsec start
Starting strongSwan 5.7.2 IPsec [starter]...
In **syslog** si trovano le seguenti righe:
charon: 00[DMN] Starting IKE charon daemon (strongSwan 5.7.2, Linux 4.19.0-12-amd64, x86_64)
charon: 07[IKE] initiating IKE_SA office1-office2[1] to 134.191.21.5
charon: 07[NET] sending packet: from 132.82.168.98[500] to 134.191.21.5[500] (932 bytes)
charon: 09[NET] received packet: from 134.191.21.5[500] to 132.82.168.98[500] (360 bytes)
charon: 09[IKE] authentication of '132.82.168.98' (myself) with pre-shared key
charon: 09[IKE] establishing CHILD_SA office1-office2{1}
charon: 10[IKE] CHILD_SA office1-office2{1} established with SPIs cdd18e01_i ...
In Debian 10, che utilizza systemd, è opportuno utilizzare **systemctl** invece di invocare direttamente **ipsec** (che supporta gli eventuali parametri ''stop'', ''restart'', ''status'', ''statusall''). Vedere sopra come [[#abilitare_e_avviare_il_servizio|abilitare e avviare il servizio]].
==== Tracciato tcpdump ====
Con tcpdump è possibile vedere l'inizio della connessione:
18:10:58.636146 IP 134.191.21.5.500 > 132.82.168.98.500: isakmp: parent_sa ikev2_init[I]
18:10:58.650161 IP 132.82.168.98.500 > 134.191.21.5.500: isakmp: parent_sa ikev2_init[R]
18:10:58.713248 IP 134.191.21.5.4500 > 132.82.168.98.4500: NONESP-encap: isakmp: child_sa ikev2_auth[I]
18:10:58.714463 IP 132.82.168.98.4500 > 134.191.21.5.4500: NONESP-encap: isakmp: child_sa ikev2_auth[R]
18:10:59.773185 IP 134.191.21.5.500 > 132.82.168.98.500: isakmp: parent_sa ikev2_init[I]
18:10:59.786532 IP 132.82.168.98.500 > 134.191.21.5.500: isakmp: parent_sa ikev2_init[R]
18:10:59.851299 IP 134.191.21.5.4500 > 132.82.168.98.4500: NONESP-encap: isakmp: child_sa ikev2_auth[I]
18:10:59.852578 IP 132.82.168.98.4500 > 134.191.21.5.4500: NONESP-encap: isakmp: child_sa ikev2_auth[R]
==== Verifica stato della connessione ====
Per verificare lo stato della VPN si utilizza il comando **ipsec statusall**, ecco un esempio di output per una connessione funzionante:
ipsec statusall
Status of IKE charon daemon (strongSwan 5.7.2, Linux 4.19.0-12-amd64, x86_64):
uptime: 31 seconds, since Feb 04 09:53:12 2021
malloc: sbrk 2437120, mmap 0, used 601632, free 1835488
worker threads: 11 of 16 idle, 5/0/0/0 working, job queue: 0/0/0/0, scheduled: 3
loaded plugins: charon aes rc2 sha2 sha1 md5 mgf1 random nonce x509 ....
Listening IP addresses:
132.82.168.98
192.168.1.2
Connections:
office1-office2: 132.82.168.98...134.191.21.5 IKEv2, dpddelay=30s
office1-office2: local: [132.82.168.98] uses pre-shared key authentication
office1-office2: remote: [134.191.21.5] uses pre-shared key authentication
office1-office2: child: 172.17.48.96/29 === 172.17.48.80/28 TUNNEL, dpdaction=restart
Security Associations (1 up, 0 connecting):
office1-office2[1]: ESTABLISHED 31 seconds ago, 132.82.168.98[132.82.168.98]...134.191.21.5[134.191.21.5]
office1-office2[1]: IKEv2 SPIs: 16a74d9307ac7ef5_i* 40fc0fa3a279e9f9_r,
pre-shared key reauthentication in 23 hours
office1-office2[1]: IKE proposal: AES_CBC_256/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/MODP_1536
office1-office2{1}: INSTALLED, TUNNEL, reqid 1, ESP in UDP SPIs: cdd18e01_i 866f2f1a_o
office1-office2{1}: AES_CBC_256/HMAC_SHA2_256_128, 578 bytes_i (10 pkts, 21s ago), ...
office1-office2{1}: 172.17.48.96/29 === 172.17.48.80/28
Se la VPN non è attiva, l'output è vuoto.
==== Connessione PSK fallita ====
Ecco cosa appare in syslog quando una connessione fallisce per via della chiave condivisa PSK:
charon: 13[NET] received packet: from 134.191.21.5[500] to 132.82.168.98[500] (376 bytes)
charon: 13[IKE] 134.191.21.5 is initiating an IKE_SA
charon: 13[CFG] selected proposal: IKE:AES_CBC_256/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/MODP_1536
charon: 13[IKE] remote host is behind NAT
charon: 14[CFG] looking for peer configs matching 132.82.168.98[%any]...134.191.21.5[134.191.21.5]
charon: 14[CFG] selected peer config 'office1-office2'
charon: 14[IKE] no shared key found for '%any' - '134.191.21.5'
charon: 14[ENC] generating IKE_AUTH response 1 [ N(AUTH_FAILED) ]
===== Servizi systemd =====
* **strongswan.service** - Installato dal pacchetto ''strongswan-starter'', è responsabile dell'avvio del processo ''/usr/lib/ipsec/starter''.
* **ipsec.service** - Installato dal pacchetto ''strongswan-starter''. Questo servizio viene abilitato, disabilitato, avviato o fermato automaticamente quando si agisce su ''strongswan.service''.
===== Processi in esecuzione =====
* **/usr/lib/ipsec/starter** - Installato dal pacchetto ''strongswan-starter'', è un processo invocato dal servizio ''strongswan.service'' che provvede a leggere ''/etc/ipsec.conf''.
* **/usr/lib/ipsec/charon** - Installato dal pacchetto ''strongswan-charon'', è il demone che provvede alla gestione di **[[wp>Internet_Key_Exchange|IKE]]** (il protocollo per lo scambio delle chiavi).
===== Tool da riga di comando =====
* **/usr/sbin/ipsec** - Installato dal pacchetto ''strongswan-starter'', viene utilizzato per invocare vari tool per la gestione di IPsec. A seconda del parametro passato interagisce con il processo **starter** oppure **charon**.
===== Alternativa charon-systemd =====
Questo demone, fornito dal pacchetto Debian **charon-systemd**, è alternativo al pacchetto **strongswan**; non utilizza le configurazioni di **/etc/ipsec.conf** né fa affidamento a **/usr/lib/ipsec/starter**. Il programma **charon-systemd** si interfaccia direttamente con **systemd** e utilizza il tool da riga di comando **swanctl** per configurare e comandare IPsec.
Il vantaggio di ''charon-systemd'' rispetto a ''strongswan'' è una maggiore integrazione con ''systemd'', per cui il servizio relativo ha una implementazione più semplice.
==== Pacchetti da installare per charon-systemd ====
* **charon-systemd** - Supporto systemd per IPsec client. Svolge funzioni analoghe al pacchetto ''strongswan-charon''.
* **strongswan-swanctl** - Viene installato per dipendenza diretta da ''charon-systemd''. Contiene l'eseguibile ''swanctl'' che è il tool da riga di comando per configurare, comandare e monitorare la VPN IPsec.
==== Servizi systemd per charon-systemd ====
* **strongswan-swanctl.service** - Installato dal pacchetto ''charon-systemd'', il nome indica che il servizio basa il suo funzionamento sul tool ''swanctl''.
==== Processi in esecuzione per charon-systemd ====
* **/usr/sbin/charon-systemd** - Installato dal pacchetto ''charon-systemd'', viene avviato dal ''strongswan-swanctl.service''.
==== Debug charon-system ====
Nel caso in cui si sia fatta una configurazione tradizionale con **/etc/ipsec.conf**, ma si avvia il servizio **charon-systemd**, questo è il syslog con gli errori (il demone rileva lo scambio IKE, ma fallisce perché **manca la configurazione**):
charon-systemd[851]: received packet: from 134.191.21.5[500] to 132.82.168.98[500] (376 bytes)
charon-systemd[851]: parsed IKE_SA_INIT request 0 [ SA KE No N(NATD_S_IP) N(NATD_D_IP) N(FRAG_SUP) ]
charon-systemd[851]: no IKE config found for 132.82.168.98...134.191.21.5, sending NO_PROPOSAL_CHOSEN
charon-systemd[851]: generating IKE_SA_INIT response 0 [ N(NO_PROP) ]
charon-systemd[851]: sending packet: from 132.82.168.98[500] to 134.191.21.5[500] (36 bytes)
====== Web Referencese ======
* **[[https://www.tecmint.com/setup-ipsec-vpn-with-strongswan-on-debian-ubuntu/|How to Set Up IPsec-based VPN with Strongswan on Debian and Ubuntu]]**
* **[[https://wiki.strongswan.org/projects/strongswan/wiki/Charon-systemd|charon-systemd]]**
* **[[https://www.juniper.net/documentation/en_US/junos/topics/reference/configuration-statement/security-edit-dh-group.html|dh-group (Security IKE)]]**
* **[[https://tools.ietf.org/html/rfc3526|More Modular Exponential (MODP) Diffie-Hellman groups for Internet Key Exchange (IKE)]]**
* **[[https://shorewall.org/IPSEC.htm|Shorewall IPSEC Tunnels]]**