IPIP IPsec VPN-Tunnel zwischen einer Linux-Maschine und Mikrotik hinter dem NAT des Anbieters

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

  • Eth0 1.1.1.1/32 externe IP
  • ipip-ipsec0 192.168.0.1/30 wird unser Tunnel sein

Miktoik: CCR 1009, RouterOS 6.46.5

  • Eth0 10.0.0.2/30 interne IP vom Provider. Externe IP des Providers ist dynamisch.
  • ipip-ipsec0 192.168.0.2/30 wird unser Tunnel sein

Wir werden den IPsec-Tunnel auf der Linux-Maschine mit racoon einrichten. Ich werde die Details nicht beschreiben, es gibt eine gute Artikel arbeiten vvpoloskin.

Wir installieren die benötigten Pakete:

sudo install racoon ipsec-tools

Wir konfigurieren racoon, das im Wesentlichen als IPsec-Server fungiert. Da Mikrotik im Hauptmodus keine zusätzliche Client-ID übertragen kann und die externe IP-Adresse, über die es sich mit Linux verbindet, dynamisch ist, ist die Nutzung eines Preshared Keys (Passwortauthentifizierung) nicht möglich, da das Passwort entweder mit der IP-Adresse des verbindenden Hosts oder mit der ID übereinstimmen muss.

Wir werden die Authentifizierung mittels RSA-Schlüsseln verwenden.

Der Daemon racoon verwendet Schlüssel im RSA-Format, während Mikrotik das PEM-Format verwendet. Wenn Schlüssel mit dem plainrsa-gen-Tool generiert werden, das mit racoon geliefert wird, ist es nicht möglich, den öffentlichen Schlüssel für Mikrotik mit diesem Tool in das PEM-Format zu konvertieren – es konvertiert nur in eine Richtung: PEM in RSA. Der mit plainrsa-gen generierte Schlüssel konnte weder von openssl noch von ssh-keygen gelesen werden, weshalb auch diese Tools keine Konvertierung durchführen können.

Wir werden einen PEM-Schlüssel mit openssl generieren und dann mit plainrsa-gen für racoon konvertieren:

#  Генерируем ключ
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

Die erhaltenen Schlüssel legen wir in den Ordner: /etc/racoon/certs/server. Wir vergessen nicht, den Besitzer auf den Benutzer festzulegen, unter dessen Namen der Daemon racoon läuft (normalerweise root) und die Berechtigungen auf 600 zu setzen.

Die Mikrotik-Konfiguration werde ich beim Verbinden über WinBox beschreiben.

Den Schlüssel server-name.pub.pem laden wir in Mikrotik hoch: Menü „Dateien“ — „Hochladen“.

Wir öffnen den Bereich „IP“ — „IPsec“ — Tab „Schlüssel“. Jetzt generieren wir die Schlüssel — Button „Schlüssel generieren“, dann exportieren wir den öffentlichen Schlüssel von Mikrotik „Export Pub. Key“, den wir aus dem Bereich „Dateien“ herunterladen können, mit der rechten Maustaste auf die Datei — „Download“.

Wir importieren den öffentlichen Schlüssel von racoon, „Import“, im Dropdown-Menü des Feldes „Dateiname“ suchen wir den zuvor hochgeladenen server-name.pub.pem.

Der öffentliche Schlüssel von Mikrotik muss konvertiert werden

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

und in den Ordner /etc/racoon/certs gelegt werden, ohne den Besitzer und die Berechtigungen zu vergessen.

Konfiguration von racoon mit Kommentaren: /etc/racoon/racoon.conf

log info; # Protokollierungsstufe, verwenden Sie Debug oder Debug2 während der Fehlersuche.

listen {

    isakmp 1.1.1.1 [500]; # Adresse und Port, an dem der Daemon hören wird.
    isakmp_natt 1.1.1.1 [4500]; # Adresse und Port, an dem der Daemon für Clients hinter NAT hören wird.
    strict_address; # Führen Sie eine obligatorische Prüfung der Bindung an die oben angegebenen IP-Adressen durch.
}

path certificate "/etc/racoon/certs"; # Pfad zum Ordner mit Zertifikaten.

remote anonymous { # Abschnitt, der die Parameter für den Betrieb des Daemons mit ISAKMP und Aushandlung von Modi mit sich verbindenden Hosts festlegt. Da die IP, von der sich Mikrotik verbindet, dynamisch ist, verwenden wir anonymous, was die Verbindung von jeder Adresse aus erlaubt. Wenn die IP der Hosts statisch ist, kann eine bestimmte Adresse und ein Port angegeben werden.

    passive on; # Setzt den "Servermodus" des Daemons, er wird keine Verbindungen initiieren.
    nat_traversal on; # Aktiviert die Verwendung des NAT-T-Mode für Clients, wenn sie hinter NAT sind.
    exchange_mode main; # Aushandlungsmodus für die Verbindung, in diesem Fall - Aushandlung.
    my_identifier address 1.1.1.1; # Identifizieren Sie unseren Linux-Host über seine IP-Adresse.
    certificate_type plain_rsa "server/server-name.priv.key"; # Privater Schlüssel des Servers.
    peers_certfile plain_rsa "mikrotik.pub.key"; # Öffentlicher Schlüssel Mikrotik.

    proposal_check claim; # Aushandlungsmodus für die ISAKMP-Tunnelparameter. Racoon verwendet die Werte des sich verbindenden Hosts (Initiators) für die Sitzungsdauer und die Schlüssellänge, wenn seine Sitzungsdauer größer ist oder die Schlüssellänge kürzer ist als die des Initiators. Wenn die Sitzungsdauer kürzer ist als die des Initiators, verwendet Racoon seinen eigenen Wert für die Sitzungsdauer und sendet die Nachricht RESPONDER-LIFETIME.
    proposal { # ISAKMP-Tunnelparameter.

        encryption_algorithm aes; # Verschlüsselungsmethode des ISAKMP-Tunnels.
        hash_algorithm sha512; # Hash-Algorithmus, der für den ISAKMP-Tunnel verwendet wird.
        authentication_method rsasig; # Authentifizierungsmethode für den ISAKMP-Tunnel - nach RSA-Schlüsseln.
        dh_group modp2048; # Schlüssellänge für den Diffie-Hellman-Algorithmus bei der Aushandlung des ISAKMP-Tunnels.
        lifetime time 86400 sec; # Sitzungsdauer.
    }

    generate_policy on; # Automatische Erstellung von ESP-Tunneln aus Anfragen des sich verbindenden Hosts.
}

sainfo anonymous { # Parameter für ESP-Tunnel, anonymous - die angegebenen Parameter werden als Standardparameter verwendet. Für verschiedene Clients, Ports und Protokolle können unterschiedliche Parameter festgelegt werden, die Zuordnung erfolgt anhand von IP-Adressen, Ports und Protokollen.

    pfs_group modp2048; # Schlüssellänge für den Diffie-Hellman-Algorithmus für ESP-Tunnel.
    lifetime time 28800 sec; # Gültigkeitsdauer der ESP-Tunnel.
    encryption_algorithm aes; # Verschlüsselungsmethode der ESP-Tunnel.
    authentication_algorithm hmac_sha512; # Hash-Algorithmus, der für die Authentifizierung der ESP-Tunnel verwendet wird.
    compression_algorithm deflate; # Komprimieren von übertragenen Daten, nur ein Kompressionsalgorithmus wird angeboten.
}

Mikrotik-Konfiguration

Gehen wir zurück zum Abschnitt "IP" — "IPsec"

Registerkarte "Profile"
Parameter
Wert

Name
Nach Belieben (Standard ist default)

Hash-Algorithmus
sha512

Verschlüsselungsalgorithmus
aes-128

DH-Gruppe
modp2048

Proposhal_check
Antrag

Lebensdauer
1d 00:00:00

NAT Traversal
true (Häkchen setzen)

DPD
120

Maximale DPD-Fehler
5

Registerkarte "Peers"
Parameter
Wert

Name
Nach Belieben (weiter MyPeer)

Adresse
1.1.1.1 (IP der Linux-Maschine)

Lokale Adresse
10.0.0.2 (IP des WAN-Interfaces von Mikrotik)

Profil
default

Austauschmodus
main

Passiv
false

INITIAL_CONTACT senden
true

Registerkarte "Vorschlag"
Parameter
Wert

Name
Nach Belieben (weiter MyPeerProposal)

Auth. Algorithmen
sha512

Verschlüsselungsalgorithmen
aes-128-cbc

Lebensdauer
08:00:00

PFS-Gruppe
modp2048

Registerkarte "Identitäten"
Parameter
Wert

Peer
MyPeer

Auth. Methode
rsa key

Schlüssel
mikrotik.privet.key

Remote Key
server-name.pub.pem

Policy-Template-Gruppe
default

Nichtverfolgen-Kette
leer

Mein ID-Typ
auto

Remote ID-Typ
auto

Übereinstimmung nach
remote id

Modus-Konfiguration
leer

Richtlinie generieren
nein

Registerkarte "Richtlinien — Allgemein"
Parameter
Wert

Peer
MyPeer

Tunnel
true

Src. Adresse
192.168.0.0/30

Dest. Adresse
192.168.0.0/30

Protokoll
255 (alle)

Vorlage
false

Registerkarte "Richtlinien — Aktion"
Parameter
Wert

Aktionen
encrypt

Level
erforderlich

IPsec-Protokolle
esp

Vorschlag
MyPeerProposal

Wahrscheinlich haben Sie, wie ich, auf dem WAN-Interface snat/masquerade konfiguriert. Diese Regel muss angepasst werden, damit die ausgehenden IPsec-Pakete in unseren Tunnel geleitet werden:
Gehen Sie zu "IP" — "Firewall".
Registerkarte "NAT", öffnen Sie unsere Regel snat/masquerade.

Registerkarte "Erweitert"
Parameter
Wert

IPsec-Richtlinie
out: none

Starten Sie den Daemon racoon neu

sudo systemctl restart racoon

Wenn racoon beim Neustart nicht startet, liegt ein Fehler in der Konfiguration vor. Im Syslog gibt racoon Informationen über die Zeilennummer aus, in der der Fehler gefunden wurde.

Der Daemon racoon wird beim Start des Betriebssystems vor dem Hochfahren der Netzwerkschnittstellen gestartet, und wir haben in der Sektion listen die Option strict_address angegeben. Es ist notwendig, dies in die Datei des systemd-Units von racoon einzufügen.
/lib/systemd/system/racoon.service, в секцию [Unit], строку After=network.target.

Jetzt sollten unsere IPsec-Tunnel aktiv sein, sehen Sie sich die Ausgabe an:

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, über den Mikrotik verbunden ist"
        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, über den Mikrotik verbunden ist" 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, über den Mikrotik verbunden ist" dst 1.1.1.1
        proto esp reqid 0 mode tunnel

Wenn die Tunnel nicht aktiv sind, schauen Sie sich das Syslog an oder verwenden Sie journalctl -u racoon.

Jetzt müssen die L3-Schnittstellen konfiguriert werden, damit der Datenverkehr geroutet werden kann. Es gibt verschiedene Optionen, wir werden IPIP verwenden, da Mikrotik dies unterstützt. Ich hätte VTI verwendet, aber leider ist es bei Mikrotik bisher nicht implementiert worden. IPIP unterscheidet sich dadurch, dass es zusätzlich Multicast kapseln und Markierungen (fwmark) auf die Pakete setzen kann, mit denen sie in iptables und iproute2 (policy-basiertes Routing) gefiltert werden können. Wenn maximale Funktionalität erforderlich ist, dann zum Beispiel GRE. Aber man sollte nicht vergessen, dass wir für die zusätzliche Funktionalität einen hohen Overhead bezahlen.

Eine Übersetzung einer guten Übersicht über Tunnel-Schnittstellen kann man sich ansehen hier.

Unter Linux:

# Создаем интерфейс
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

Jetzt können Routen für Netzwerke hinter dem Mikrotik hinzugefügt werden

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

Damit unser Schnittstelle und die Routen nach einem Neustart aktiviert werden, muss die Schnittstelle in /etc/network/interfaces beschrieben werden und dort im post-up die Routen hinzugefügt werden, oder alles in einer Datei, z.B. /etc/ipip-ipsec0.conf, geschrieben werden und diese über post-up aufgerufen werden. Vergessen Sie nicht, den Besitzer der Datei, die Berechtigungen und dass sie ausführbar gemacht wird.

Unter dem Cut ein Beispiel für eine Datei

#!/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

Auf Mikrotik:

Bereich 'Interfaces', neuen Schnittstelle 'IP tunnel' hinzufügen:

Registerkarte 'IP tunnel' - 'Allgemein'
Parameter
Wert

Name
Ihrem Ermessen überlassen (weiteres IPIP-IPsec0)

MTU
1480 (wenn nicht angegeben, verringert Mikrotik MTU auf 68)

Lokale Adresse
192.168.0.2

Remote Adresse
192.168.0.1

Ipsec Geheimnis
Deaktivieren Sie das Feld (sonst wird ein neuer Peer erstellt)

Keepalive
Deaktivieren Sie das Feld (ansonsten wird das Interface ständig abgeschaltet, da Mikrotik ein eigenes Format für diese Pakete hat und es mit Linux nicht funktioniert)

DSCP
erben

Nicht fragmentieren
nein

TCP MSS klemmen
true

Schnellen Pfad erlauben
true

Bereich 'IP' - 'Adressen', Adresse hinzufügen:

Parameter
Wert

Adresse
192.168.0.2/30

Schnittstelle
IPIP-IPsec0

Jetzt können Routen zu Netzwerken hinter der Linux-Maschine hinzugefügt werden. Bei der Hinzufügung einer Route wird der Gateway unser IPIP-IPsec0 Interface sein.

PS

Da unser Linux-Server ein Transit-Server ist, macht es Sinn, den Parameter 'TCP MSS klemmen' für IPIP-Schnittstellen festzulegen:

Wir erstellen die Datei /etc/iptables.conf mit folgendem Inhalt:

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

und in /etc/network/interfaces
post-up iptables-restore < /etc/iptables.conf

Hinter dem Mikrotik funktioniert bei mir nginx (ip 10.10.10.1), machen wir es aus dem Internet zugänglich, fügen wir zu /etc/iptables.conf hinzu:

*nat
-A PREROUTING -d 1.1.1.1/32 -p tcp -m multiport --dports 80,443 -j DNAT --to-destination 10.10.10.1
#Auf Mikrotik muss in der Mangle-Tabelle eine Route mit der Zieladresse 192.168.0.1 für Pakete mit der Quelladresse 10.10.10.1 und den Ports 80, 443 hinzugefügt werden.

# Außerdem läuft auf Linux ein OpenVPN-Server 172.16.0.1/24, für Clients, die sich mit ihm als Gateway verbinden, gewähren wir Zugang zum Internet
-A POSTROUTING -s 172.16.0.0/24 -o eth0 -j SNAT --to-source 1.1.1.1
COMMIT 

Vergessen Sie nicht, die entsprechenden Berechtigungen in iptables hinzuzufügen, wenn Sie Paketfilter aktiviert haben.

Bleiben Sie gesund!

Quelle: habr.com

60GB SSD 8Gb DDR4