Ipsec (strongswan 5.2.2 su openwrt 14.07) puo` essere configurato per lavorare in due modi: usando un helper in userspace che effettua le operazioni crittografiche, o facendole fare al kernel. La soluzione con l'helper funziona bene e presenta all'utente una interfaccia ipsec0 attraverso la quale passa il traffico (cosa per me molto comoda) ma consente di lavorare soltanto con ESP incapsulato in UDP (il modo tipico in cui si effettua il NAT traversal in IPSEC). Se l'altro endpoint non gradisce questo comportamento, questo metodo non funzionera` e occorrera` usare quello in kernel space.
Questo e` l'esempio piu` bastardo possibile, perche` richiede che noi ci presentiamo al remoto con degli indirizzi (interni al tunnel) che non sono quelli della nostra LAN, e quindi dobbiamo usare alias e NAT per ottenere questo risultato. Se non avessimo bisogno di fare cio`, il nostro lavoro sarebbe leggermente piu` facile.
modprobe authenc
prima dello start della vpn altrimenti si incorre in errori come questo: received netlink error: No such file or directory (2) - unable to add SAD entry with SPI 4a40a580
ifconfig eth1:0 172.21.34.1 netmask 255.255.255.0
al file /etc/init.d/ipsec in modo che prima dello start venga creato l'alias sulla interfaccia pubblica.iptables -t nat -A postrouting_wan_rule -j SNAT -s 172.16.30.0/24 -d 192.168.216.0/24 --to 172.21.34.1 iptables -t nat -A postrouting_wan_rule -j SNAT -s 172.16.30.0/24 -d 192.168.238.0/24 --to 172.21.34.1
iptables -t nat -A postrouting_wan_rule -j ACCEPT -s 172.21.34.1 -d 192.168.216.0/24 iptables -t nat -A postrouting_wan_rule -j ACCEPT -s 172.21.34.1 -d 192.168.238.0/24
Il caso del NAT degli indirizzi della LAN presentato nell' esempio in kernel space potrebbe essere affrontato in modo piu` intelligente se non fosse che openwrt ha delle limitazioni. Ad esempio non riesco a fare funzionare (non capisco perche`) il target "NETMAP" che mi verrebbe molto utile per nattare tutta la mia LAN (ad esempio 10.0.0.0/24) sulla rete che vuole vedere il remoto (ad esempio 172.21.34.0/24). Sarebbe sufficiente inserire due regole di NETMAP, cosi`:
iptables -t nat -A postrouting_wan_rule -j NETMAP -s 10.0.0.0/24 -d 192.168.216.0/24 --to 172.21.34.0/24 iptables -t nat -A pretrouting_wan_rule -j NETMAP -s 192.168.216.0/24 -d 172.21.34.0/24 --to 10.0.0.0/24
Ma non funziona. iptables si rifiuta di inserire le regole nella catena. Su una macchina Linux Debian "normale" funziona senza problemi.
Se la connessione cade dopo qualche tempo, probabilmente e` dovuto a un bug che fa cadere tutto nel momento in cui dovrebbe avvenire un rekeying. Questo problema puo` essere risolto impostando uno (o tutti e due) di questi parametri in ipsec.conf, nella descrizione della connessione:
dpdaction=restart closeaction=restart
Il primo dovrebbe riavviare la connessione nel caso in cui scatti il meccanismo di Dead Peer Detection. Il secondo invece dovrebbe riavviare la connessione nel caso in cui per qualsiasi motivo (dipendente dal remoto) la connessione venga chiusa.
Qualche comando utile:
Ecco un esempio di una connessione lan to lan verso un router remoto proprietario con chiave PSK:
# strongswan.conf - strongSwan configuration file # # Refer to the strongswan.conf(5) manpage for details # # Configuration changes should be made in the included files charon { load_modular = yes plugins { include strongswan.d/charon/*.conf } syslog { daemon { ike = 1 knl = 1 net = 0 enc = 0 } } }
# <leftid> <rightid> : PSK "<chiave>" 192.168.1.254 46.100.4.10 : PSK "tarapia tapioca come se fosse antani per due a sinistra"
version 2 conn nostrarete-lororete keyexchange=ikev1 left=192.168.1.254 (la mia interfaccia pubblica) right=46.100.4.10 (la loro interfaccia pubblica) leftsubnet=192.168.90.0/24 (la mia rete LAN) leftauth=psk rightauth=psk rightsubnet=172.20.0.0/16 (la rete LAN remota che va routata via il tunnel) auto=start leftid=80.10.9.1 (un "nome" con cui si identifica il mio endpoint, usato per esempio nel file ipsec.secrets. Deve coincidere con quello impostato dall'altro lato) rightid=46.100.4.10 (il nome dell'altro endpoint, come sopra. Usare gli indirizzi ip pubblici come nomi e` pratica comune) # esp=3des-sha1-modp2048 ike=3des-sha1-modp1024 type=tunnel dpdaction=restart closeaction=restart
# ipsec.conf - strongSwan IPsec configuration file version 2 conn noi-loro keyexchange=ikev1 left=192.168.1.5 right=13.4.6.2 leftsubnet=172.21.34.0/24 leftauth=psk rightauth=psk rightsubnet=192.168.238.96/28 auto=start leftid=8.7.6.5 rightid=193.13.99.20 ike=3des-sha1-modp1024 type=tunnel dpdaction=restart closeaction=restart conn noi-loro2 keyexchange=ikev1 left=192.168.1.5 right=13.4.6.2 leftsubnet=172.21.34.0/24 leftauth=psk rightauth=psk rightsubnet=192.168.238.0/28 auto=start leftid=8.7.6.5 rightid=193.13.99.20 ike=3des-sha1-modp1024 type=tunnel dpdaction=restart closeaction=restart conn noi-loro3 keyexchange=ikev1 left=192.168.1.5 right=13.4.6.2 leftsubnet=172.21.34.0/24 leftauth=psk rightauth=psk rightsubnet=192.168.238.16/28 auto=start leftid=8.7.6.5 rightid=193.13.99.20 ike=3des-sha1-modp1024 type=tunnel dpdaction=restart closeaction=restart