IPIP IPsec VPN Tunnel zwischen einem Linux-Rechner 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

MikroTik: CCR 1009, RouterOS 6.46.5

  • Eth0 10.0.0.2/30 interne IP vom Anbieter. Externe IP ist dynamisch und NAT vom Anbieter.
  • ipip-ipsec0 192.168.0.2/30 wird unser Tunnel sein

Wir werden den IPsec Tunnel auf der Linux-Maschine mit racoon aufbauen. Ich werde die Einzelheiten nicht beschreiben, es gibt ein gutes Artikel u vvpoloskin.

Notwendige Pakete installieren:

sudo install racoon ipsec-tools

Wir konfigurieren racoon, das bedingt als ipsec Server fungieren wird. Da MikroTik im Hauptmodus keinen zusätzlichen Client-Identifikator übertragen kann und die externe IP-Adresse, über die er sich mit Linux verbindet, dynamisch ist, kann ein preshared key (Passwort-Authentifizierung) nicht verwendet werden, da das Passwort entweder mit der IP-Adresse des verbindenden Hosts oder mit dem Identifikator übereinstimmen muss.

Wir werden die Authentifizierung über RSA-Schlüssel verwenden.

Der Daemon racoon verwendet Schlüssel im RSA-Format, während Mikrotik im PEM-Format arbeitet. Wenn wir die Schlüssel mit dem mit racoon gelieferten Tool plainrsa-gen generieren, können wir den öffentlichen Schlüssel für Mikrotik nicht in das PEM-Format konvertieren – es konvertiert nur in eine Richtung: von PEM nach RSA. Der mit plainrsa-gen erzeugte Schlüssel konnte von weder openssl noch ssh-keygen gelesen werden, daher kann auch mit diesen Tools keine Konvertierung durchgeführt werden.

Wir generieren den PEM-Schlüssel mit openssl und konvertieren ihn anschließend für racoon mit 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

Die erhaltenen Schlüssel speichern wir im Ordner: /etc/racoon/certs/server. Vergessen Sie nicht, den Besitzer auf den Benutzer zu setzen, unter dessen Namen der Daemon racoon ausgeführt wird (normalerweise root), und die Berechtigungen auf 600 zu setzen.

Die Konfiguration von Mikrotik werde ich beim Anschluss über WinBox beschreiben.

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

Wir öffnen den Bereich „IP“ — „IP sec“ — Tab „Schlüssel“. Jetzt generieren wir die Schlüssel — auf die Schaltfläche „Schlüssel generieren“, dann exportieren wir den öffentlichen Schlüssel von Mikrotik mit „Öffentlichen Schlüssel exportieren“, den Sie im Bereich „Dateien“ herunterladen können, indem Sie mit der rechten Maustaste auf die Datei klicken — „Herunterladen“.

Wir importieren den öffentlichen Schlüssel von racoon, „Importieren“, im Dropdown-Menü des Feldes „Dateiname“ suchen wir die zuvor hochgeladene 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 legen, dabei Eigentümer und Berechtigungen nicht vergessen.

Racoon-Konfiguration mit Kommentaren: /etc/racoon/racoon.conf

log info; # Protokollebene, verwenden Sie Debug oder Debug2 für die Fehlersuche.

listen {

    isakmp 1.1.1.1 [500]; # Adresse und Port, an dem der Dienst lauschen wird.
    isakmp_natt 1.1.1.1 [4500]; # Adresse und Port, an dem der Dienst für Clients hinter NAT lauschen wird.
    strict_address; # Führen Sie eine verpflichtende Überprüfung der Bindung an die oben genannten IPs durch.
}

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

remote anonymous { # Abschnitt, der die Parameter für die Zusammenarbeit des Dienstes mit ISAKMP und den Modusverhandlungen mit den verbundenen Hosts festlegt. Da die IP, von der Mikrotik sich verbindet, dynamisch ist, verwenden wir anonymous, was Verbindungen von jeder Adresse erlaubt. Wenn die IP der Hosts statisch ist, kann eine bestimmte Adresse und ein bestimmter Port angegeben werden.

    passive on; # Stellt den "Server"-Modus des Dienstes ein, er wird keine Verbindungen initiieren.
    nat_traversal on; # Aktiviert die Verwendung des NAT-T-Modus für Clients, wenn sie sich hinter NAT befinden.
    exchange_mode main; # Modus für den Austausch von Verbindungsparametern, in diesem Fall - die Vereinbarung.
    my_identifier address 1.1.1.1; # Identifizieren Sie unseren Linux-Host nach seiner 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 von Mikrotik.

    proposal_check claim; # Modus zur Vereinbarung der ISAKMP-Tunnelparameter. Racoon nutzt die Werte des sich verbindenden Hosts (Initiators) für die Vertragslaufzeit und Schlüssellänge, wenn dessen Laufzeit länger oder seine Schlüssellänge kürzer ist als die des Initiators. Wenn die Laufzeit kürzer ist als die des Initiators, verwendet Racoon seine eigenen Werte für die Laufzeit und sendet die Nachricht RESPONDER-LIFETIME.
    proposal { # Parameter des ISAKMP-Tunnels.

        encryption_algorithm aes; # Verschlüsselungsmethode des ISAKMP-Tunnels.
        hash_algorithm sha512; # Hash-Algorithmus, der für den ISAKMP-Tunnel verwendet wird.
        authentication_method rsasig; # Authentifizierungsmodus für den ISAKMP-Tunnel - basierend auf RSA-Schlüsseln.
        dh_group modp2048; # Schlüssellänge für den Diffie-Hellman-Algorithmus bei der Vereinbarung des ISAKMP-Tunnels.
        lifetime time 86400 sec; # Gültigkeitsdauer der Sitzung.
    }

    generate_policy on; # Automatische Erstellung von ESP-Tunneln aus der Anfrage, die vom verbundenden Host eingegangen ist.
}

sainfo anonymous { # Parameter für ESP-Tunnel, anonymous - angegebene Parameter werden als Standardparameter verwendet. Für verschiedene Clients, Ports, Protokolle können unterschiedliche Parameter festgelegt werden, das Mapping erfolgt nach IP-Adressen, Ports, 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; # Übertragen Sie komprimierte Daten, der Komprimierungsalgorithmus Vorschlag ist nur einer.
}

Mikrotik-Konfiguration

Zurück zum Bereich "IP" — "IPsec"

Tab "Profile"
Parameter
Bedeutung

Name
Nach Ihrem Ermessen (standardmäßig default)

Hash-Algorithmus
sha512

Verschlüsselungsalgorithmus
aes-128

DH-Gruppe
modp2048

Proposal_check
beanspruchen

Lebensdauer
1d 00:00:00

NAT Traversal
true (Häkchen setzen)

DPD
120

DPD maximale Fehleranzahl
5

Tab "Peers"
Parameter
Bedeutung

Name
Nach Ihrem Ermessen (weiter als MyPeer)

Adresse
1.1.1.1 (IP der Linux-Maschine)

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

Profil
default

Austauschmodus
main

Passiv
false

INITIAL_CONTACT senden
true

Tab "Proposal"
Parameter
Bedeutung

Name
Nach Ihrem Ermessen (weiter als MyPeerProposal)

Auth. Algorithmen
sha512

Verschlüsselungsalgorithmen
aes-128-cbc

Lebensdauer
08:00:00

PFS-Gruppe
modp2048

Tab "Identitäten"
Parameter
Bedeutung

Peer
MyPeer

Auth. Methode
rsa key

Schlüssel
mikrotik.privet.key

Remote Key
server-name.pub.pem

Richtlinienvorlagen-Gruppe
default

Notrack Chain
leer

Mein ID-Typ
auto

Remote ID-Typ
auto

Übereinstimmung Nach
Remote-ID

Moduskonfiguration
leer

Richtlinie generieren
nein

Tab "Policies — General"
Parameter
Bedeutung

Peer
MyPeer

Tunnel
true

Src. Adresse
192.168.0.0/30

Zieladresse
192.168.0.0/30

Protokoll
255 (alle)

Vorlage
false

Tab "Policies — Action"
Parameter
Bedeutung

Aktionen
encrypt

Ebene
erforderlich

IPsec-Protokolle
esp

Vorschlag
MyPeerProposal

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

Tab "Erweitert"
Parameter
Bedeutung

IPsec-Richtlinie
out: none

Den Racoon-Daemon neu starten

sudo systemctl restart racoon

Wenn der 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 racoon-Dämon wird beim Starten des Betriebssystems vor dem Hochfahren der Netzwerkinterfaces aktiviert. In der Sektion listen haben wir die Option strict_address angegeben, daher muss sie in die Datei des systemd-Units racoon hinzugefügt werden.
/lib/systemd/system/racoon.service, в секцию [Unit], строку After=network.target.

Jetzt sollten unsere IPsec-Tunnel aktiv sein. Schauen wir uns 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 "NAT-IP, über das sich Mikrotik verbindet"
        proto esp reqid 0 mode tunnel
src 192.168.255.0/30 dst 192.168.255.0/30 
    dir fwd priority 2147483648 
    tmpl src "NAT-IP, über das sich Mikrotik verbindet" 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 "NAT-IP, über das sich Mikrotik verbindet" dst 1.1.1.1
        proto esp reqid 0 mode tunnel

Wenn die Tunnel nicht aktiviert sind, überprüfen Sie syslog oder verwenden Sie journalctl -u racoon.

Jetzt müssen die L3-Schnittstellen konfiguriert werden, um den Traffic zu routen. Es gibt verschiedene Optionen, wir werden IPIP verwenden, da dies von Mikrotik unterstützt wird. Ich würde VTI nutzen, aber leider wurde es von Mikrotik bisher nicht implementiert. Im Gegensatz zu IPIP kann es zusätzlich Multicast kapseln und mit fwmark-Tags versehen, um Pakete zu filtern, was in iptables und iproute2 (policy-basiertes Routing) möglich ist. Wenn maximale Funktionalität erforderlich ist, könnte beispielsweise GRE in Betracht gezogen werden. Aber man sollte nicht vergessen, dass zusätzliche Funktionalität mit höherem Overhead verbunden ist.

Eine gute Übersicht über Tunnel-Schnittstellen können Sie hier einsehen hier.

Auf 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 Mikrotik hinzugefügt werden

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

Damit unsere Schnittstelle und Routen nach einem Neustart aktiv sind, muss die Schnittstelle in /etc/network/interfaces beschrieben werden und Routen dort im post-up hinzugefügt werden. Alternativ kann alles in einer Datei, zum Beispiel /etc/ipip-ipsec0.conf, festgelegt werden und über post-up aufgerufen werden. Vergessen Sie nicht, den Dateiinhaber, die Berechtigungen zu beachten und sie ausführbar zu machen.

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:

Eintrag «IP Tunnel» — «Allgemein»
Parameter
Bedeutung

Name
Nach Ihrem Ermessen (weiterer Verlauf IPIP-IPsec0)

MTU
1480 (wenn nicht angegeben, beginnt Mikrotik, die MTU auf 68 zu reduzieren)

Lokale Adresse
192.168.0.2

Remote Adresse
192.168.0.1

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

Keepalive
Deaktivieren Sie das Feld (ansonsten wird das Interface ständig abgeschaltet, da Mikrotik ein eigenes Format dieser Pakete hat, das nicht mit Linux funktioniert)

DSCP
erben

Nicht Fragmentieren
nein

Clamp TCP MSS
true

Schneller Pfad erlauben
true

Abschnitt «IP» — «Adressen», fügen Sie die Adresse hinzu:

Parameter
Bedeutung

Adresse
192.168.0.2/30

Schnittstelle
IPIP-IPsec0

Jetzt können Routen im Netzwerk hinter dem Linux-Server hinzugefügt werden. Beim Hinzufügen der Route wird das Gateway unser IPIP-IPsec0 Interface sein.

PS

Da unser Linux-Server als Transit fungiert, macht es Sinn, den Parameter Clamp TCP MSS für IPIP-Interfaces festzulegen:

Erstellen Sie 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

Im Netzwerk hinter Mikrotik läuft bei mir nginx (IP 10.10.10.1). Um es aus dem Internet zugänglich zu machen, fügen wir in /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 für Pakete mit der Quelladresse 10.10.10.1 und den Ports 80, 443 hinzugefügt werden, mit dem Ziel 192.168.0.1.

# Ebenso funktioniert auf Linux der OpenVPN-Server 172.16.0.1/24. Den Clients, die sich darüber verbinden, gewähren wir Internetzugang.
-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.

Gesundheit!

Quelle: habr.com

Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen 🔥 Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen | ProHoster