IPIP IPsec VPN tunel mezi Linux stroj a Mikrotik za NAT poskytovatele

Linux: Ubuntu 18.04.4 LTS (GNU/Linux 4.15.0-91-generic x86_64)

  • Eth0 1.1.1.1/32 veřejná IP
  • ipip-ipsec0 192.168.0.1/30 bude náš tunel

Miktoik: CCR 1009, RouterOS 6.46.5

  • Eth0 10.0.0.2/30 interní IP od poskytovatele. Veřejná IP NAT poskytovatele je dynamická.
  • ipip-ipsec0 192.168.0.2/30 bude náš tunel

IPsec tunel na Linux stroji zprovozníme pomocí racoon. Nebudu popisovat detaily, existuje dobrá neaktuální statistika u vvpoloskin.

Instalujeme potřebné balíčky:

sudo install racoon ipsec-tools

Nastavujeme racoon, který v tomto případě bude hrát roli ipsec serveru. Jelikož mikrotik v hlavním režimu nemůže předávat dodatečný identifikátor klienta a veřejná IP adresa, přes kterou se připojuje k Linuxu, je dynamická, nebude možné použít preshared key (autentizaci pomocí hesla), protože heslo musí odpovídat buď IP adrese připojujícího se hosta, nebo identifikátoru.

Budeme používat autentizaci podle RSA klíčů.

Démon racoon používá klíče ve formátu RSA, zatímco mikrotik v formátu PEM. Pokud generujeme klíče pomocí utility plainrsa-gen dodávané s racoonem, nelze veřejný klíč pro Mikrotik převést do formátu PEM jejich pomocí — převádí pouze jedním směrem: PEM na RSA. Vygenerovaný klíč plainrsa-gen nebyl možné přečíst ani openssl, ani ssh-keygen, takže jejich pomocí také nebude možné provést převod.

Vygenerujeme PEM klíč pomocí openssl a poté jej převedeme pro racoon pomocí plainrsa-gen:

#  Генерируем ключ
openssl genrsa -out server-name.pem 1024
# Извлекаем публичный ключ
openssl rsa -in server-name.pem -pubout > server-name.pub.pem
# Конвертируем
plainrsa-gen -i server-name.pem -f server-name.privet.key
plainrsa-gen -i server-name.pub.pem -f server-name.pub.key

Získané klíče uložíme do složky: /etc/racoon/certs/server. Nezapomeňte nastavit vlastníka na uživatele, pod kterým běží démon racoon (obvykle root), práva 600.

Nastavení mikrotiku popíšu při připojení přes WinBox.

Klíč server-name.pub.pem nahrajeme do mikrotiku: Menu „Files“ — „Upload“.

Otevřeme sekci „IP“ — „IP sec“ — záložka „Keys“. Nyní generujeme klíče — tlačítko „Generate Key“, poté exportujeme veřejný klíč mikrotika „Expor Pub. Key“, stáhnout jej lze z sekce „Files“, pravým tlačítkem na soubor — „Download“.

Importujeme veřejný klíč racoon, „Import“, v rozbalovacím seznamu pole „File name“ hledáme dříve nahraný server-name.pub.pem.

Veřejný klíč mikrotiku je potřeba převést

plainrsa-gen -i mikrotik.pub.pem -f mikrotik.pub.key

a uložit do složky /etc/racoon/certs, nezapomněli jsme na vlastníka a práva.

Konfigurace racoon s komentáři: /etc/racoon/racoon.conf

log info; # Úroveň protokolování, při ladění používáme Debug nebo Debug2.

listen {

    isakmp 1.1.1.1 [500]; # Adresa a port, na kterém bude démon poslouchat.
    isakmp_natt 1.1.1.1 [4500]; # Adresa a port, na kterém bude démon poslouchat pro klienty za NAT.
    strict_address; # Provádět povinnou kontrolu vázání na výše uvedené IP.
}

path certificate "/etc/racoon/certs"; # Cesta do složky se certifikáty.

remote anonymous { # Sekce, která určuje parametry pro práci démona s ISAKMP a dohodu režimů s připojujícími se hosty. Protože IP, ze které se připojuje Mikrotik, je dynamická, používáme anonymous, což umožňuje připojení z libovolné adresy. Pokud mají hosté statickou IP, lze uvést konkrétní adresu a port.

    passive on; # Určuje "serverový" režim práce démona, nebude se snažit inicializovat připojení.
    nat_traversal on; # Aktivuje používání režimu NAT-T pro klienty, pokud jsou za NAT.
    exchange_mode main; # Režim výměny parametry připojení, v tomto případě --- dohoda.
    my_identifier address 1.1.1.1; # Identifikujeme náš linux host podle jeho ip adresy.
    certificate_type plain_rsa "server/server-name.priv.key"; # Soukromý klíč serveru.
    peers_certfile plain_rsa "mikrotik.pub.key"; # Veřejný klíč Mikrotik.

    proposal_check claim; # Režim dohody parametrů ISAKMP tunelu. Racoon bude používat hodnoty připojujícího se hosta (iniciátora) pro dobu platnosti relace a délku klíče, pokud je jeho doba platnosti relace delší nebo délka jeho klíče kratší než u iniciátora. Pokud je doba platnosti relace kratší než u iniciátora, racoon použije vlastní hodnotu doby platnosti relace a bude odesílat zprávu RESPONDER-LIFETIME.
    proposal { # Parametry ISAKMP tunelu.

        encryption_algorithm aes; # Metoda šifrování ISAKMP tunelu.
        hash_algorithm sha512; # Algoritmus hashování používaný pro ISAKMP tunel.
        authentication_method rsasig; # Režim autentizace pro ISAKMP tunel - podle RSA klíčů.
        dh_group modp2048; # Délka klíče pro algoritmus Diffie-Hellman při dohodě ISAKMP tunelu.
        lifetime time 86400 sec; # Čas platnosti relace.
    }

    generate_policy on; # Automatické vytvoření ESP tunelů z požadavku, příchozího od připojujícího se hosta.
}

sainfo anonymous { # Parametry ESP tunelů, anonymous - zadané parametry budou použity jako výchozí. Pro různé klienty, porty, protokoly lze zadat různé parametry, přiřazení probíhá podle ip adres, portů, protokolů.

    pfs_group modp2048; # Délka klíče pro algoritmus Diffie-Hellman pro ESP tunely.
    lifetime time 28800 sec; # Doba platnosti ESP tunelů.
    encryption_algorithm aes; # Metoda šifrování ESP tunelů.
    authentication_algorithm hmac_sha512; # Algoritmus hashování používaný pro autentizaci ESP tunelů.
    compression_algorithm deflate; # Komprimovat předávaná data, algoritmus komprese je navržen pouze jeden.
}

Mikrotik konfigurace

Vracíme se do sekce "IP" — "IPsec"

Záložka "Profily"
Parameter
Hodnota

Název
Na vaši libnost (výchozí je default)

Hash Algoritmus
sha512

Šifrovací Algoritmus
aes-128

DH Skupina
modp2048

Proposhal_check
claim

Životnost
1d 00:00:00

NAT Traversal
true (zaškrtněte políčko)

DPD
120

Maximální selhání DPD
5

Záložka "Peer"
Parameter
Hodnota

Název
Na vaši libnost (dále MyPeer)

Address
1.1.1.1 (IP linux stroje)

Místní Adresa
10.0.0.2 (IP WAN rozhraní mikrotik)

Profil
default

Režim výměny
main

Pasivní
false

Odeslat INITIAL_CONTACT
true

Záložka "Návrh"
Parameter
Hodnota

Název
Na vaši libnost (dále MyPeerProposal)

Algoritmy autorizace
sha512

Algoritmy šifrování
aes-128-cbc

Životnost
08:00:00

PFS Skupina
modp2048

Záložka "Identity"
Parameter
Hodnota

Peer
MyPeer

Aut. Metoda
rsa klíč

Klíč
mikrotik.privet.key

Vzdálený Klíč
server-name.pub.pem

Šablona Politiky Skupina
default

Notrack Chain
prázdno

Můj Typ ID
auto

Typ Vzdáleného ID
auto

Shoda podle
vzdálené id

Konfigurace Mód
prázdno

Generovat Politiku
ne

Záložka "Politiky — Obecné"
Parameter
Hodnota

Peer
MyPeer

Tunel
true

Zdroj. Adresa
192.168.0.0/30

Cíl. Adresa
192.168.0.0/30

Protokol
255 (vše)

Šablona
false

Záložka "Politiky — Akce"
Parameter
Hodnota

Akce
šifrovat

Úroveň
požadavky

Protokoly IPsec
esp

Návrh
MyPeerProposal

Pravděpodobně máte, stejně jako já, nastavené snat/masquerade na WAN rozhraní; toto pravidlo je třeba upravit, aby odchozí pakety ipsec šly do našeho tunelu:
Přejdeme do sekce "IP" — "Firewall".
Záložka "NAT", otevřeme naše pravidlo snat/masquerade.

Záložka "Pokročilé"
Parameter
Hodnota

Politika IPsec
out: none

Restartujeme démon racoon

sudo systemctl restart racoon

Pokud se racoon při restartu nespustí, znamená to, že v konfiguraci je chyba; v syslogu racoon vypíše informace o čísle řádku, kde došlo k chybě.

Démon racoon při startu OS startuje dříve, než se aktivují síťové rozhraní; v sekci listen jsme nastavili možnost strict_address, je tedy třeba přidat do souboru systemd jednotky racoon
/lib/systemd/system/racoon.service, в секцию [Unit], строку After=network.target.

Nyní by měly naše ipsec tunely být aktivní, zkontrolujeme výstup:

sudo ip xfrm policy

src 192.168.255.0/30 dst 192.168.255.0/30 
	dir out priority 2147483648 
	tmpl src 1.1.1.1 dst "IP NAT, přes který se připojuje mikrotik"
		proto esp reqid 0 mode tunnel
src 192.168.255.0/30 dst 192.168.255.0/30 
	dir fwd priority 2147483648 
	tmpl src "IP NAT, přes který se připojuje mikrotik" dst 1.1.1.1
		proto esp reqid 0 mode tunnel
src 192.168.255.0/30 dst 192.168.255.0/30 
	dir in priority 2147483648 
	tmpl src "IP NAT, přes který se připojuje mikrotik" dst 1.1.1.1
		proto esp reqid 0 mode tunnel

Pokud se tunely nenastavily, podívejte se do syslogu nebo použijte journalctl -u racoon.

Nyní je třeba nastavit L3 rozhraní, aby bylo možné směrovat provoz. Existuje několik možností, my použijeme IPIP, protože ho mikrotik podporuje, já bych raději použil vti, ale bohužel, mikrotik ho dosud neimplementoval. Na rozdíl od IPIP umožňuje navíc enkapsulaci multicastu a značkování (fwmark) paketů, podle kterých je lze filtrovat v iptables a iproute2 (směrování založené na politikách). Pokud potřebujete maximální funkčnost, pak například GRE. Je však třeba nezapomínat, že za další funkčnost platíme vyššími přetíženími.

Překlad dobrého přehledu tunelových rozhraní lze vidět tady.

Na Linuxu:

# Создаем интерфейс
sudo ip tunnel add ipip-ipsec0 local 192.168.255.1 remote 192.168.255.2 mode ipip
# Активируем
sudo ip link set ipip-ipsec0 up
# Назначаем адрес
sudo ip addr add 192.168.255.1/30 dev ipip-ipsec0

Nyní můžete přidat trasy pro sítě za mikrotikem

sudo ip route add A.B.C.D/Prefix via 192.168.255.2

Aby naše rozhraní a trasy fungovaly po restartu, je třeba popsat rozhraní v /etc/network/interfaces a tam také v post-up přidávat trasy, nebo vše napsat do jednoho souboru, například /etc/ipip-ipsec0.conf a spouštět ho přes post-up, nezapomeňte na vlastníka souboru, práva a udělat ho spustitelným.

Pod odkazem příklad souboru

#!/bin/bash
ip tunnel add ipip-ipsec0 local 192.168.255.1 remote 192.168.255.2 mode ipip
ip link set ipip-ipsec0 up
ip addr add 192.168.255.1/30 dev ipip-ipsec0

ip route add A.B.C.D/Prefix via 192.168.255.2

Na Mikrotiku:

Sekce „Rozhraní“, přidáváme nové rozhraní „IP tunnel“:

Záložka „IP tunnel“ — „Obecné“
Parameter
Hodnota

Název
Podle vašeho uvážení (dále IPIP-IPsec0)

MTU
1480 (pokud není zadáno, mikrotik začne snižovat mtu na 68)

Místní Adresa
192.168.0.2

Remote Address
192.168.0.1

Ipsec Secret
Deaktivujeme pole (jinak se vytvoří nový Peer)

Keepalive
Deaktivujeme pole (jinak bude rozhraní neustále vypnuto, protože mikrotik má nějaký vlastní formát těchto paketů a s linuxem nefunguje)

DSCP
zdědit

Dont Fragment
ne

Clamp TCP MSS
true

Allow Fast Path
true

Sekce „IP“ — „Adresy“, přidáváme adresu:

Parameter
Hodnota

Address
192.168.0.2/30

Rozhraní
IPIP-IPsec0

Nyní můžete přidávat trasy do sítí za linuxovým strojem, při přidání trasy bude brána naším rozhraním IPIP-IPsec0.

PS

Jelikož náš linuxový server je tranzitní, má smysl nastavit parametr Clamp TCP MSS pro ipip rozhraní:

vytvořte soubor /etc/iptables.conf s následujícím obsahem:

*mangle
-A POSTROUTING -o ipip+ -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
COMMIT

a do /etc/network/interfaces
post-up iptables-restore < /etc/iptables.conf

V síti za mikrotikem mi funguje nginx (ip 10.10.10.1), zpřístupníme ho z internetu, přidáme do /etc/iptables.conf:

*nat
-A PREROUTING -d 1.1.1.1/32 -p tcp -m multiport --dports 80,443 -j DNAT --to-destination 10.10.10.1
#Na mikrotiku, v tabulce mangle je třeba přidat pravidlo route s adresou 192.168.0.1 pro pakety se zdrojovou adresou 10.10.10.1 a porty 80, 443.

# Také na Linuxu funguje OpenVPN server 172.16.0.1/24, pro klienty, kteří používají připojení k němu jako bránu, poskytujeme přístup na internet
-A POSTROUTING -s 172.16.0.0/24 -o eth0 -j SNAT --to-source 1.1.1.1
COMMIT 

Nezapomeňte přidat odpovídající povolení do iptables, pokud máte zapnuté filtrování paketů.

Na zdraví!

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster