Table of Contents

Ipsec su Openwert 14.07

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.

Ipsec in user space

Ipsec in kernal 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.

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 

Limitazioni

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.

Debug e controllo dello stato delle connessioni

Qualche comando utile:

Esempi di configurazione

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