IPsec tunel: GRE, Linux a Mikrotik

12.11.2016

Intro

Následující návod popisuje způsob, jak snadno a rychle nastavit síťový tunel založený na IPsecu mezi Linuxem (Debian) a Mikrotikem. Podobných návodů je na Internetu hodně, nicméně nikde jsem nenašel ucelenou variantu týkající se právě uvedené kombinace s Mikrotikem a situací, kdy na obou stranách tunelu existuje více subnetů.

Doposud jsem si při spojování různých lokalit vystačil s OpenVPN. Je to velmi jednoduchá a snadno fungující VPN, která má širokou podporu napříč různými zařízeními a operačními systémy. Jenže v podání Mikrotiku je trochu potíž v tom, že podporuje autentizaci pouze SHA1 (MD5 nepočítám) a maximální přenosová rychlost končí na 30-40Mbitech (CloudCore board). Tato rychlost roky bohatě stačila a naráželo se spíše na limity internetové konektivity. IPsec je na tom řádově lépe, neboť díky HW podpoře šifrování u některých router boardů je dosažitelná rychlost mezi dvěma body 470-480Mbit - a to při použití hashovací funkce SHA256 + šifrování AES-256-CBC.

Upozornění

Problematika IPsecu je poměrně obsáhlá a v rámci tohoto návodu jsou některé věci záměrně zjednodušeny nebo zamlčeny. Ostatně cílem je IPsec tunel rozjet, teorii si každý může nastudovat sám :-)

Fakta

* Fáze slouží k autentizaci, vyjednání parametrů pro šifrování kanálu a výměnu klíčů. Parametry pro fázi 1 a šifrování kanálu mohou být různé (jak v Linuxu, tak v Mikrotiku se nastavují na dvou místech), avšak pro větší blbuvzornost doporučuji vše stejné.

** Některé Routerboardy mají hardwarovou podporu SHA1, SHA256 a AES-CBC. Čili šifrování a dešifrování je poté rychlé bez zátěže CPU.

*** Velikost DH (i robustnost hashovací funkce) má zásadní vliv na dobu spojení ipsec tunelu. Linux a Mikrotik musí počítat šifrovací klíče a to docela trvá. Při použití uvedených parametrů je to ještě snesitelných 6-15 sekund. V případě DH mod8192 stoupne tato doba na 20-40 sekund dle výkonu routerboardu.

Prakticky

Co se týče adres 172.30.255.x, tak smysl dělení do /30 je ten, že se jedná o servisní IP a snahou je minimalizovat možnost kolize s IP adresami provozních podsítí.

Adresy pro IPsec:

  Subnet Linux Mikrotik
Klient1 172.30.255.0/30 172.30.255.1 172.30.255.2
Klient2 172.30.255.4/30 172.30.255.5 172.30.255.6
Klient3 172.30.255.8/30 172.30.255.9 172.30.255.10

Adresy pro GRE:

  Subnet Linux Mikrotik
Klient1 172.30.255.128/30 172.30.255.129 172.30.255.130
Klient2 172.30.255.132/30 172.30.255.133 172.30.255.134
Klient3 172.30.255.136/30 172.30.255.137 172.30.255.138

Tímto systémem lze do jednoho C-čka (172.30.255.0/24) umístit 32 IPsec a GRE tunelů.

Linux

Předpokladem je nainstalovaný Debian, funkční SSH a přístup jako root. Instalace strongSwanu:

apt-get install strongswan openssl

StrongSwan má následující konfigurační soubory:

/etc/ipsec.conf
/etc/ipsec.secrets
/etc/ipsec.d/

Vytvoření RSA klíčů

# Vytvoreni privatniho klice
openssl genrsa -out LINUX_private.pem 4096

# Vytvoreni verejneho klice
openssl rsa -in LINUX_private.pem -pubout > LINUX_public.pem
Místo openssl lze využíty příkaz ipsec pki --get a --pub. Více v dokumentaci k strongSwanu.

Nastavení strongSwanu

Obsah souboru /etc/ipsec.conf:

# Spolecne nastaveni pro vsechna pripojeni
conn %default
        type=tunnel
        esp=aes256-sha256-modp4096!
        ike=aes256-sha256-modp4096!
        ikelifetime=12h
        keylife=1h
        rekeymargin=9m
        keyingtries=%forever
        keyexchange=ikev1
        authby=pubkey
        left=1.1.1.1
        leftsigkey=LINUX_public.pem

# Spojeni na Mikrotik1
conn klient1
        right=2.2.2.2
        rightsigkey=CLIENT1_public.pem
        leftsubnet=172.30.255.1/32
        rightsubnet=172.30.255.2/32
        auto=start

Soubor obsahuje sekci společnou pro všechna spojení %default a sekce pro jednotlivé peery. Ve společné sekci je uveden typ tunelu, šifrování a hashovací funkce, způsob autentizace, veřejná IP adresa Linuxu a jeho veřejný klíč. Reference na klíč soukromý je v souboru níže. V klientské sekci je veřejná IP adresa Mikrotiku, název souboru s veřejným klíčem (ten se musí teprve dodat) a policy. Klientská sekce se pak může kopírovat dle počtu klientů. Soubory s klíči se hledají v /etc/ipsec.d/certs/.

Obsah souboru /etc/ipsec.secret:

# Jmeno souboru s privatnim klicem pro vsechna odchozi autentizacni spojeni 
# Pozor: dvojtecka na zacatku radku je spravne
: RSA LINUX_private.pem

Soubor s klíčem se hledá v /etc/ipsec.d/private/.

Nastavení sítě

# Vytvoření dummy rozhraní 
ip link add name dmIPsec type dummy
ip link set dev dmIPsec up

# Pridani IP do dummy rozhrani - klient1
ip addr add 172.30.255.1/30 dev dmIPsec

# Vytvoreni a spusteni GRE tunelu - klient1
ip tunnel add greClient1 mode gre local 172.30.255.1 remote 172.30.255.2
ip link set dev greClient1 up 
ip address add 172.30.255.129/30 dev greClient1 



Mikrotik

Vytvoření RSA klíčů

Proposals

V IP/IPsec/Proposals se změní defaultní záznam a upraví se varianty algoritmů.

/ip ipsec proposal
set [ find default=yes ] auth-algorithms=sha256 disabled=no enc-algorithms=aes-256-cbc lifetime=1h \
    name=default pfs-group=modp4096

Peers

V IP/IPsec/Peers se přidá nový záznam:

/ip ipsec peer
add address=1.1.1.1/32 auth-method=rsa-key dh-group=modp4096 disabled=no dpd-interval=2m \
    dpd-maximum-failures=5 enc-algorithm=aes-256 exchange-mode=main generate-policy=no \
    hash-algorithm=sha256 key=CLIENT1 lifebytes=0 lifetime=1d local-address=:: nat-traversal=no \
    passive=no policy-template-group=default port=500 proposal-check=obey remote-key=LINUX_public \
    send-initial-contact=yes

Policies

V IP/IPsec/Policies se přidá nový záznam:

/ip ipsec policy
add action=encrypt disabled=no dst-address=172.30.255.1/32 dst-port=any ipsec-protocols=esp level=\
    require priority=0 proposal=default protocol=all sa-dst-address=1.1.1.1 sa-src-address=0.0.0.0 \
    src-address=172.30.255.2/32 src-port=any tunnel=yes

Bridge brIPsec

V Interfaces se přidá nové rozhraní typu bridge:

/interface bridge
add admin-mac=00:00:00:00:00:00 ageing-time=5m arp=enabled arp-timeout=auto auto-mac=yes disabled=\
    no forward-delay=15s max-message-age=20s mtu=auto name=brIPsec priority=0x8000 protocol-mode=\
    none transmit-hold-count=6

V IP/Addresses se pro brigde nastaví IP adresa.

/ip address
add address=172.30.255.2/30 comment="Subnet pro komunikaci pres IPSec" disabled=no interface=brIPsec \
    network=172.30.255.0

GRE tunel

V Interfaces/GRE Tunnel se přidá nový záznam:

/interface gre
add allow-fast-path=no clamp-tcp-mss=yes disabled=no dont-fragment=no dscp=inherit !ipsec-secret \
    !keepalive local-address=172.30.255.2 mtu=auto name=greClient1 remote-address=172.30.255.1

V IP/Addresses se pro GRE tunel nastaví IP adresa.

/ip address
add address=172.30.255.130/30 disabled=no interface=greClient1 network=172.30.255.128

Provoz

Mikrotik

V IP/IPsec/Remote Peers se zobrazuje seznam navázaných spojení. Pokud je potřeba spojení resetovat, tak stačí kliknout na Kill Connections. Mikrotik poté začne navazovat spojení nové. Obecně však sestavení IPsec tunelu trvá nějakou dobu - záleží na rychlosti Routerboardu a na zvolených algoritmech a DH(PFS) skupinách. Např. u RB1100AHx2 je to cca 7 sekund, RB850Gx2 cca 14.

V IP/IPsec/Installed SA se zobrazuje seznam tzv. Security Associations, tedy záznamů s klíči a použitými algoritmy, kterými se šifruje přenos dat skrz tunel. Kliknutím na Flush lze vynutit výpočet a výměnu nových klíčů.

Linux

StrongSwan běží jako klasický daemon, takže start a stop lze realizovat běžnými init skripty (/etc/init.d/ipsec) nebo zrůdností systemd. Stav tunelu jde zobrazit příkazem ipsec status, výstup je následující:

linux:~# ipsec status
Security Associations (3 up, 0 connecting):
  klient1[30]: ESTABLISHED 18 minutes ago, 1.1.1.1[1.1.1.1]...2.2.2.2[2.2.2.2]
  klient1{23}:  INSTALLED, TUNNEL, ESP SPIs: cb80dd7c_i 0ef1c34b_o
  rklient1{23}:   172.30.255.1/32 === 172.30.255.2/32

Maximum segment size

Doporučuji přečíst článek na Root.cz Tuneluji, tuneluješ, tunelujeme: jak a k čemu, kde je pěkně vysvětlena vhodnost vynucení změny MSS (Maximum Segment Size).