IPSEC i Ubuntu Precise med dynamisk IP

Trots att det finns mycket skrivet om IPSEC på Linux är informationen om hur det fungerar tillsammans med dynamisk IP ganska förvirrande.

Förhoppningsvis har den ena sidan av tunneln en fast IP, då kör man racoon i passivt läge på den sidan och låter den med dynamsk IP ansluta. Största nackdelen med detta är att tunneln bara kan initieras från ena hållet, men det går att lösa med att ha ett cron-jobb som pingar något på andra sidan regelbundet.

Det är inte heller möjligt att autentisera dhcp-klienten med sin IP, här får man istället använda FQDN i kombination med aggressive mode ipsec, eller x509-certifikat i main mode. Tyvärr fungerar inte allt med alla IPSEC-implementationer, men Linux till Linux fungerar fint på båda sätten.

IPSEC-policyn som talar om vilken trafik som ska krypteras anges normalt i /etc/ipsec-tools.conf och aktiveras med /etc/init.d/setkey restart. Den passiva sidan behöver ingen policy, eftersom den genereras automatiskt när klienten ansluter. Däremot uppstår det ett problem när du ska lägga in policyn på klienten som kör DHCP. Som en del av konfigurationsdirektivet anger man endpunkterna i tunneln, normalt sett publika adressen på brandväggen. Tyvärr vet man inte vad den är, eftersom man kör DHCP.

Tidigare har det gått att lösa lite enkelt med att ange 0.0.0.0 som adress. I Ubuntu Precise får man då det här meddelandet.
Feb 11 10:30:01 fw racoon: INFO: initiate new phase 1 negotiation: 0.0.0.0[500]<=>10.1.1.1[500]
Feb 11 10:30:01 fw racoon: INFO: begin Aggressive mode.
Feb 11 10:30:01 fw racoon: ERROR: phase1 negotiation failed due to send error.
Feb 11 10:30:01 fw racoon: ERROR: failed to begin ipsec sa negotication.
Feb 11 10:30:32 fw racoon: INFO: IPsec-SA request for 10.1.1.1 queued due to no phase1 found.

Lösningen verkar vara att ange sin interna adress istället som endpunkt:
#!/usr/sbin/setkey -f


# NOTE: Do not use this file if you use racoon with racoon-tool
# utility. racoon-tool will setup SAs and SPDs automatically using
# /etc/racoon/racoon-tool.conf configuration.
#

## Flush the SAD and SPD
#
# flush;
# spdflush;

# Tunnel
spdadd 192.168.0.0/24 192.168.254.0/24 any -P out ipsec
esp/tunnel/192.168.0.1-10.1.1.1/require;

spdadd 192.168.254.0/24 192.168.0.0/24 any -P in ipsec
esp/tunnel/10.1.1.1-192.168.0.1/require;