IPIP IPsec VPN-Tunnel zwischen Linux-Maschine und Mikrotik hinter dem NAT-Anbieter

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 Anbieter. Die externe NAT-IP des Anbieters ist dynamisch.
  • ipip-ipsec0 192.168.0.2/30 wird unser Tunnel sein

Wir werden mit racoon einen IPsec-Tunnel auf einem Linux-Rechner erstellen. Ich werde die Details nicht beschreiben, es gibt ein gutes Beitrag у vvpoloskin.

Installieren Sie die erforderlichen Pakete:

sudo install racoon ipsec-tools

Wir konfigurieren Racoon, er fungiert bedingt als IPSec-Server. Da mikrotik im Hauptmodus keine zusätzliche Client-ID übertragen kann und die externe IP-Adresse, über die es eine Verbindung zu Linux herstellt, dynamisch ist, funktioniert die Verwendung eines vorinstallierten Schlüssels (Passwortautorisierung) nicht, da das Passwort entweder mit der IP-Adresse von abgeglichen werden muss dem verbindenden Host oder mit Kennung.

Wir verwenden die Autorisierung mithilfe von RSA-Schlüsseln.

Der Racoon-Daemon verwendet Schlüssel im RSA-Format und mikrotik das PEM-Format. Wenn Sie Schlüssel mit dem Dienstprogramm plainrsa-gen generieren, das mit racoon geliefert wird, können Sie den öffentlichen Schlüssel für Mikrotika mit seiner Hilfe nicht in das PEM-Format konvertieren – er konvertiert nur in eine Richtung: PEM in RSA. Weder openssl noch ssh-keygen konnten den von plainrsa-gen generierten Schlüssel lesen, daher ist die Konvertierung auch mit ihnen nicht möglich.

Wir werden mit OpenSSL einen PEM-Schlüssel generieren und ihn 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

Wir werden die erhaltenen Schlüssel im Ordner /etc/racoon/certs/server ablegen. Vergessen Sie nicht, den Besitzer des Benutzers, unter dessen Namen der Racoon-Daemon gestartet wird (normalerweise Root), auf 600 Berechtigungen zu setzen.

Ich werde das Mikrotik-Setup bei der Verbindung über WinBox beschreiben.

Laden Sie den server-name.pub.pem-Schlüssel auf mikrotik hoch: Menü „Dateien“ – „Hochladen“.

Öffnen Sie den Abschnitt „IP“ – „IP sec“ – Registerkarte „Schlüssel“. Jetzt generieren wir Schlüssel – die Schaltfläche „Schlüssel generieren“ und exportieren dann den öffentlichen Mikrotika-Schlüssel „Expor Pub. Schlüssel“, können Sie im Abschnitt „Dateien“ herunterladen, klicken Sie mit der rechten Maustaste auf die Datei – „Herunterladen“.

Wir importieren den öffentlichen Racoon-Schlüssel „Importieren“ und suchen in der Dropdown-Liste des Felds „Dateiname“ nach dem Servernamen.pub.pem, den wir zuvor heruntergeladen haben.

Der öffentliche Mikrotik-Schlüssel muss konvertiert werden

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

und legen Sie es im Ordner /etc/racoon/certs ab, vergessen Sie dabei nicht den Besitzer und die Rechte.

racoon config mit Kommentaren: /etc/racoon/racoon.conf

log info; # Уровень логирования, при отладке используем Debug или Debug2.

listen {

    isakmp 1.1.1.1 [500]; # Адрес и порт, на котором будет слушать демон.
    isakmp_natt 1.1.1.1 [4500]; # Адрес и порт, на котором будет слушать демон для клиентов за NAT.
    strict_address; # Выполнять обязательную проверку привязки к указанным выше IP.
}

path certificate "/etc/racoon/certs"; # Путь до папки с сертификатами.

remote anonymous { # Секция, задающая параметры для работы демона с ISAKMP и согласования режимов с подключающимися хостами. Так как IP, с которого подключается Mikrotik, динамический, то используем anonymous, что разрешает подключение с любого адреса. Если IP у хостов статический, то можно указать конкретный адрес и порт.

    passive on; # Задает "серверный" режим работы демона, он не будет пытаться инициировать подключения.
    nat_traversal on; # Включает использование режима NAT-T для клиентов, если они за NAT. 
    exchange_mode main; # Режим обмена параметрами подключения, в данном случае ---согласование.
    my_identifier address 1.1.1.1; # Идентифицируем наш linux хост по его ip адресу.
    certificate_type plain_rsa "server/server-name.priv.key"; # Приватный ключ сервера.
    peers_certfile plain_rsa "mikrotik.pub.key"; # Публичный ключ Mikrotik.

    proposal_check claim; # Режим согласования параметров ISAKMP туннеля. Racoon будет использовать значения подключающегося хоста (инициатора) для срока действия сессии                   и длины ключа, если его срок действия сессии больше, или длина его ключа короче, чем у инициатора. Если срок действия сессии короче, чем у инициатора, racoon использует собственное значение срока действия сессии и будет отправлять сообщение RESPONDER-LIFETIME.
    proposal { # Параметры ISAKMP туннеля.

        encryption_algorithm aes; # Метод шифрования ISAKMP туннеля.
        hash_algorithm sha512; # Алгоритм хеширования, используемый для ISAKMP туннеля.
        authentication_method rsasig; # Режим аутентификации для ISAKMP туннеля - по RSA ключам.
        dh_group modp2048; # Длина ключа для алгоритма Диффи-Хеллмана при согласовании ISAKMP туннеля.
        lifetime time 86400 sec; Время действия сессии.
    }

    generate_policy on; # Автоматическое создание ESP туннелей из запроса, пришедшего от подключающегося хоста.
}

sainfo anonymous { # Параметры ESP туннелей, anonymous - указанные параметры будут использованы как параметры по умолчанию. Для разных клиентов, портов, протоколов можно              задавать разные параметры, сопоставление происходит по ip адресам, портам, протоколам.

    pfs_group modp2048; # Длина ключа для алгоритма Диффи-Хеллмана для ESP туннелей.
    lifetime time 28800 sec; # Срок действия ESP туннелей.
    encryption_algorithm aes; # Метод шифрования ESP туннелей.
    authentication_algorithm hmac_sha512; # Алгоритм хеширования, используемый для аутентификации ESP туннелей.
    compression_algorithm deflate; # Сжимать передаваемые данные, алгоритм сжатия предлагается только один.
}

Mikrotik-Konfiguration

Zurück zum Abschnitt „IP“ – „IPsec“

Registerkarte „Profile“.
Parameter
Wert

Name und Vorname
Nach Ihrem Ermessen (standardmäßig)

Hash-Algorithmus
sha512

Verschlüsselungsalgorithmus
aes-128

DH-Gruppe
modp2048

Proposhal_check
Anspruch

Lebenslang
1T 00:00:00

NAT-Traversal
wahr (markieren Sie das Kästchen)

DPD
120

DPD Maximaler Fehler
5

Registerkarte „Kollegen“.
Parameter
Wert

Name und Vorname
Nach Ihrem Ermessen (im Folgenden MyPeer genannt)

Adresse
1.1.1.1 (IP-Linux-Maschinen)

Lokale Adresse
10.0.0.2 (IP-WAN-Schnittstelle mikrotik)

Profil
Standard

Austauschmodus
Haupt-

Passive Kunden
falsch

Senden Sie INITIAL_CONTACT
was immer dies auch sein sollte.

Registerkarte „Vorschlag“.
Parameter
Wert

Name und Vorname
Nach Ihrem Ermessen (im Folgenden MyPeerProposal genannt)

Auth. Algorithmen
sha512

Enkr. Algorithmen
aes-128-cbc

Lebenslang
08:00:00

PFS-Gruppe
modp2048

Registerkarte „Identitäten“.
Parameter
Wert

Peer
MeinPeer

Atuh. Methode
RSA-Schlüssel

Wesentliche
mikrotik.privet.key

Fernschlüssel
Servername.pub.pem

Richtlinienvorlagengruppe
Standard

Notrack-Kette
ist leer

Mein ID-Typ
Auto

Remote-ID-Typ
Auto

Zuordnen nach
Remote-ID

Moduskonfiguration
ist leer

Richtlinie generieren
nicht

Reiter „Richtlinien – Allgemein“
Parameter
Wert

Peer
MeinPeer

Tunnel
was immer dies auch sein sollte.

Src. Adresse
192.168.0.0/30

Ziel Adresse
192.168.0.0/30

Protokoll
255 (alle)

Template
falsch

Reiter „Richtlinien – Aktion“
Parameter
Wert

Action
verschlüsseln

Niveau
benötigen

IPsec-Protokolle
esp

Vorschlag
MyPeerProposal

Höchstwahrscheinlich haben Sie, wie ich, Snat/Masquerade auf Ihrer WAN-Schnittstelle konfiguriert; diese Regel muss angepasst werden, damit ausgehende IPSec-Pakete in unseren Tunnel gelangen:
Gehen Sie zum Abschnitt „IP“ – „Firewall“.
Öffnen Sie auf der Registerkarte „NAT“ unsere Snat/Masquerade-Regel.

Registerkarte „Erweitert“.
Parameter
Wert

IPsec-Richtlinie
aus: keine

Neustart des Waschbärdämons

sudo systemctl restart racoon

Wenn racoon beim Neustart nicht startet, liegt ein Fehler in der Konfiguration vor; im Syslog zeigt racoon Informationen über die Zeilennummer an, in der der Fehler erkannt wurde.

Wenn das Betriebssystem startet, startet der Racoon-Daemon, bevor die Netzwerkschnittstellen aufgerufen werden, und wir haben die Option strict_address im Listen-Abschnitt angegeben; Sie müssen die Racoon-Einheit zur systemd-Datei hinzufügen
/lib/systemd/system/racoon.service, im Abschnitt [Unit], Zeile 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 через который подключается 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 через который подключается 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 через который подключается mikrotik" dst 1.1.1.1
        proto esp reqid 0 mode tunnel

Wenn die Tunnel nicht aktiv sind, sehen Sie sich Syslog oder Journalctl -u Racoon an.

Jetzt müssen Sie L3-Schnittstellen konfigurieren, damit der Datenverkehr weitergeleitet werden kann. Es gibt verschiedene Möglichkeiten, wir werden IPIP verwenden, da mikrotik es unterstützt, ich würde vti verwenden, aber leider ist es in mikrotik noch nicht implementiert. Der Unterschied zu IPIP besteht darin, dass es zusätzlich Multicast kapseln und Pakete mit FW-Markierungen versehen kann, mit denen sie in iptables und iproute2 (richtlinienbasiertes Routing) gefiltert werden können. Wenn Sie maximale Funktionalität benötigen, dann zum Beispiel GRE. Aber vergessen Sie nicht, dass wir für zusätzliche Funktionalität mit einem hohen Overhead bezahlen.

Sie können die Übersetzung einer guten Übersicht über Tunnelschnittstellen sehen 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 Sie Routen für Netzwerke hinter Mikrotik hinzufügen

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

Damit unsere Schnittstelle und Routen nach einem Neustart aktiviert werden, müssen wir die Schnittstelle in /etc/network/interfaces beschreiben und dort im Postup Routen hinzufügen oder alles in eine Datei schreiben, zum Beispiel /etc/ ipip-ipsec0.conf und ziehen Sie es durch die Nachbearbeitung, vergessen Sie nicht den Dateieigentümer und die Rechte und machen Sie es ausführbar.

Unten finden Sie eine Beispieldatei

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

Fügen Sie im Abschnitt „Schnittstellen“ eine neue Schnittstelle „IP-Tunnel“ hinzu:

Reiter „IP-Tunnel“ – „Allgemein“
Parameter
Wert

Name und Vorname
Nach Ihrem Ermessen (im Folgenden als IPIP-IPsec0 bezeichnet)

MTU
1480 (falls nicht angegeben, beginnt Mikrotik mit der Reduzierung von 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)

Bleib am Leben
Deaktivieren Sie das Feld (sonst wird die Schnittstelle ständig ausgeschaltet, da Mikrotika ein eigenes Format für diese Pakete hat und nicht mit Linux funktioniert)

DSCP
erben

Nicht fragmentieren
nicht

Klemme TCP MSS
was immer dies auch sein sollte.

Schnellpfad zulassen
was immer dies auch sein sollte.

Abschnitt „IP“ – „Adressen“, fügen Sie die Adresse hinzu:

Parameter
Wert

Adresse
192.168.0.2/30

Schnittstelle
IPIP-IPsec0

Jetzt können Sie Routen zum Netzwerk hinter einem Linux-Computer hinzufügen; beim Hinzufügen einer Route ist das Gateway unsere IPIP-IPsec0-Schnittstelle.

PS

Da unser Linux-Server transitiv ist, ist es sinnvoll, den Parameter „Clamp TCP MSS“ für Ipip-Schnittstellen darauf festzulegen:

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

Ich habe Nginx im Netzwerk hinter Mikrotik laufen lassen (IP 10.10.10.1), mache es über das Internet zugänglich und füge es 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
#На mikrotik, в таблице mangle, надо добавить правило route с назначением 192.168.0.1 для пакетов с адресом источника 10.10.10.1 и портов 80, 443.

# Так же на linux работает OpenVPN сервер 172.16.0.1/24, для клиентов которые используют подключение к нему в качестве шлюза даем доступ в интернет
-A POSTROUTING -s 172.16.0.0/24 -o eth0 -j SNAT --to-source 1.1.1.1
COMMIT 

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

Gesund sein!

Source: habr.com

Kommentar hinzufügen