Tunel IPIP IPsec VPN między maszyną Linux a Mikrotik za NAT dostawcy

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

  • Eth0 1.1.1.1/32 zewnętrzny IP
  • ipip-ipsec0 192.168.0.1/30 będzie naszym tunelem

Miktoik: CCR 1009, RouterOS 6.46.5

  • Eth0 10.0.0.2/30 wewnętrzny IP od dostawcy. Zewnętrzny IP dostawcy jest dynamiczny.
  • ipip-ipsec0 192.168.0.2/30 będzie naszym tunelem

Tunel IPsec na maszynie Linux będziemy konfigurować za pomocą racoon. Nie będę opisywał szczegółów, jest to dobrze udokumentowane artykuł u vvpoloskin.

Instalujemy niezbędne pakiety:

sudo install racoon ipsec-tools

Konfigurujemy racoon, który warunkowo będzie pełnił rolę serwera ipsec. Ponieważ mikrotik w trybie głównym nie może przesyłać dodatkowego identyfikatora klienta, a zewnętrzny adres IP, przez który łączy się z Linux, jest dynamiczny, użycie preshared key (autoryzacja hasłem) nie będzie możliwe, ponieważ hasło musi odpowiadać albo adresowi IP hosta łączącego się, albo identyfikatorowi.

Użyjemy autoryzacji za pomocą kluczy RSA.

Demon racoon używa kluczy w formacie RSA, podczas gdy mikrotik w formacie PEM. Jeśli generować klucze narzędziem plainrsa-gen dołączonym do racoon, to konwersja publicznego klucza dla Mikrotika do formatu PEM za jej pomocą nie będzie możliwa — konwertuje ona tylko w jedną stronę: PEM do RSA. Wygenerowany klucz plainrsa-gen nie był czytany przez openssl ani ssh-keygen, dlatego nie będzie możliwa konwersja tymi narzędziami.

Wygenerujemy klucz PEM za pomocą openssl, a następnie skonwertujemy go dla racoon za 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

Otrzymane klucze umieszczamy w folderze: /etc/racoon/certs/server. Nie zapominamy ustawić właściciela dla użytkownika, pod którym działa demon racoon (zwykle root), prawa 600.

Konfigurację mikrotika opiszę podczas łączenia przez WinBox.

Klucz server-name.pub.pem załadujemy do mikrotika: Menu „Pliki” — „Prześlij”.

Otwieramy sekcję „IP” — „IP sec” — zakładka „Klucze”. Teraz generujemy klucze — przycisk „Generuj klucz”, następnie eksportujemy publiczny klucz mikrotika „Eksportuj klucz publiczny”, można go pobrać z sekcji „Pliki”, klikając prawym przyciskiem na plik — „Pobierz”.

Importujemy publiczny klucz racoon, „Importuj”, w rozwijanym menu w polu „Nazwa pliku” szukamy wcześniej załadowanego server-name.pub.pem.

Publiczny klucz mikrotika należy skonwertować

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

i umieścić w folderze /etc/racoon/certs nie zapominając o właścicielu i prawach.

Konfiguracja racoon z komentarzami: /etc/racoon/racoon.conf

log info; # Poziom logowania, używamy Debug lub Debug2 przy debugowaniu.

listen {

    isakmp 1.1.1.1 [500]; # Adres i port, na którym będzie nasłuchiwał demon.
    isakmp_natt 1.1.1.1 [4500]; # Adres i port, na którym będzie nasłuchiwał demon dla klientów za NAT.
    strict_address; # Wykonuje obowiązkową kontrolę przypisania do podanego IP.
}

path certificate "/etc/racoon/certs"; # Ścieżka do folderu z certyfikatami.

remote anonymous { # Sekcja definiująca parametry pracy demona z ISAKMP i negocjacji trybów z podłączającymi hostami. Ponieważ IP, z którego łączy się Mikrotik, jest dynamiczne, używamy anonymous, co pozwala na połączenie z dowolnego adresu. Jeśli IP hostów jest statyczne, można określić konkretny adres i port.

    passive on; # Ustawia tryb "serwera" dla demona, nie będzie próbować inicjować połączeń.
    nat_traversal on; # Włącza użycie trybu NAT-T dla klientów, jeśli są za NAT.
    exchange_mode main; # Tryb wymiany parametrów połączenia, w tym przypadku --- negocjacja.
    my_identifier address 1.1.1.1; # Identyfikujemy nasz host linuxowy po jego adresie IP.
    certificate_type plain_rsa "server/server-name.priv.key"; # Klucz prywatny serwera.
    peers_certfile plain_rsa "mikrotik.pub.key"; # Klucz publiczny Mikrotik.

    proposal_check claim; # Tryb negocjacji parametrów tunelu ISAKMP. Racoon użyje wartości hosta łączącego się (inicjatora) dla czasu trwania sesji i długości klucza, jeśli jego czas trwania sesji jest dłuższy lub длина jego klucza krótsza niż u inicjatora. Jeśli czas trwania sesji jest krótszy niż u inicjatora, racoon użyje własnej wartości czasu trwania sesji i wyśle wiadomość RESPONDER-LIFETIME.
    proposal { # Parametry tunelu ISAKMP.

        encryption_algorithm aes; # Metoda szyfrowania tunelu ISAKMP.
        hash_algorithm sha512; # Algorytm haszowania używany do tunelu ISAKMP.
        authentication_method rsasig; # Tryb autoryzacji dla tunelu ISAKMP - za pomocą kluczy RSA.
        dh_group modp2048; # Długość klucza dla algorytmu Diffiego-Hellmana podczas negocjacji tunelu ISAKMP.
        lifetime time 86400 sec; # Czas trwania sesji.
    }

    generate_policy on; # Automatyczne tworzenie tuneli ESP z żądania, które przybyło od podłączającego się hosta.
}

sainfo anonymous { # Parametry tuneli ESP, anonymous - określone parametry będą używane jako parametry domyślne. Dla różnych klientów, portów, protokołów można ustawić różne parametry, a dopasowanie odbywa się na podstawie adresów IP, portów, protokołów.

    pfs_group modp2048; # Długość klucza dla algorytmu Diffiego-Hellmana dla tuneli ESP.
    lifetime time 28800 sec; # Czas trwania tuneli ESP.
    encryption_algorithm aes; # Metoda szyfrowania tuneli ESP.
    authentication_algorithm hmac_sha512; # Algorytm haszowania używany do autoryzacji tuneli ESP.
    compression_algorithm deflate; # Kompresować przesyłane dane, oferowany jest tylko jeden algorytm kompresji.
}

Konfiguracja mikrotik

Wracamy do sekcji "IP" — "IPsec"

Zakładka "Profiles"
Parametr
Wartość

Nazwa
Według własnego uznania (domyślnie default)

Algorytm haszujący
sha512

Algorytm szyfrowania
aes-128

Grupa DH
modp2048

Proposhal_check
claim

Czas życia
1d 00:00:00

NAT Traversal
true (zaznaczamy checkbox)

DPD
120

Maksymalna liczba błędów DPD
5

Zakładka "Peers"
Parametr
Wartość

Nazwa
Według własnego uznania (dalej MyPeer)

Address
1.1.1.1 (IP maszyny Linux)

Adres lokalny
10.0.0.2 (IP interfejsu WAN mikrotik)

Profil
default

Tryb wymiany
main

Pasywny
false

Wyślij INITIAL_CONTACT
true

Zakładka "Proposal"
Parametr
Wartość

Nazwa
Według własnego uznania (dalej MyPeerProposal)

Algorytmy autoryzacji
sha512

Algorytmy szyfrowania
aes-128-cbc

Czas życia
08:00:00

Grupa PFS
modp2048

Zakładka "Identities"
Parametr
Wartość

Peer
MyPeer

Metoda autoryzacji
rsa key

Klucz
mikrotik.privet.key

Zdalny klucz
server-name.pub.pem

Grupa szablonów polityki
default

Notrack Chain
puste

Typ mojego ID
auto

Typ zdalnego ID
auto

Dopasuj według
zdalne id

Konfiguracja trybu
puste

Generuj politykę
no

Zakładka "Policies — General"
Parametr
Wartość

Peer
MyPeer

Tunel
true

Adres źródłowy
192.168.0.0/30

Adres docelowy
192.168.0.0/30

Protokół
255 (wszystko)

Szablon
false

Zakładka "Policies — Action"
Parametr
Wartość

Akcja
szyfruj

Poziom
wymagany

Protokół IPsec
esp

Propozycja
MyPeerProposal

Najprawdopodobniej masz, tak jak ja, na interfejsie WAN skonfigurowany snat/masquerade, to reguła musi zostać skorygowana, aby wychodzące pakiety ipsec były wysyłane przez nasz tunel:
Przechodzimy do sekcji "IP" — "Firewall".
Zakładka "NAT", otwieramy naszą regułę snat/masquerade.

Zakładka "Advanced"
Parametr
Wartość

Polityka IPsec
out: none

Restartujemy demona racoon

sudo systemctl restart racoon

Jeśli przy restarcie racoon się nie uruchamia, oznacza to, że w konfiguracji jest błąd, w syslog racoon wyświetla informację o numerze linii, w której odkryto błąd.

Demon racoon podczas uruchamiania systemu startuje wcześniej niż interfejsy sieciowe, a my wskazaliśmy w sekcji listen opcję strict_address, konieczne jest dodanie do pliku jednostki systemd racoon
/lib/systemd/system/racoon.service, в секцию [Unit], строку After=network.target.

Teraz nasze tuneli IPsec powinny się włączyć, sprawdzamy wynik:

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, przez który łączy się 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, przez który łączy się 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, przez który łączy się mikrotik" dst 1.1.1.1
        proto esp reqid 0 mode tunnel

Jeśli tuneli się nie uruchomiły, sprawdź syslog lub użyj journalctl -u racoon.

Teraz należy skonfigurować interfejsy L3, aby można było routować ruch. Istnieją różne opcje, my użyjemy IPIP, ponieważ jest wspierany przez mikrotik. Użyłbym vti, ale niestety jeszcze nie został zaimplementowany w mikrotik. IPIP różni się tym, że dodatkowo może enkapsulować multicast i przypisywać etykiety (fwmark) do pakietów, dzięki którym można je filtrować w iptables i iproute2 (routing oparty na polityce). Jeśli potrzebna jest maksymalna funkcjonalność — wtedy na przykład GRE. Należy jednak pamiętać, że dodatkowa funkcjonalność wiąże się z większym obciążeniem.

Można zobaczyć tłumaczenie niezłej recenzji interfejsów tunelowych tutaj.

Na Linuxie:

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

Teraz można dodać trasy dla sieci za mikrotik

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

Aby nasz interfejs i trasy były aktywne po restarcie, należy opisać interfejs w /etc/network/interfaces i tam w post-up dodawać trasy, albo wpisać wszystko w jednym pliku, np. /etc/ipip-ipsec0.conf i wywołać go przez post-up, nie zapomnij o właścicielu pliku, prawach i uczynić go wykonywalnym.

Pod katem przykład pliku

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

Sekcja „Interfejsy”, dodajemy nowy interfejs „IP tunnel”:

Zakładka „IP tunnel” — „Ogólne”
Parametr
Wartość

Nazwa
Według uznania (dalej IPIP-IPsec0)

MTU
1480 (jeśli nie wskaźasz, mikrotik zaczyna zmniejszać mtu do 68)

Adres lokalny
192.168.0.2

Adres zdalny
192.168.0.1

Ipsec Secret
Dezaktywujemy pole (inaczej zostanie utworzony nowy Peer)

Keepalive
Dezaktywujemy pole (inaczej interfejs będzie ciągle wyłączony, ponieważ mikrotik ma jakiś swój format tych pakietów i z linuxem nie działa)

DSCP
dziedziczenie

Nie fragmentować
no

Clamp TCP MSS
true

Zezwalaj na szybkie ścieżki
true

Sekcja „IP” — „Adresy”, dodajemy adres:

Parametr
Wartość

Address
192.168.0.2/30

Interfejs
IPIP-IPsec0

Teraz można dodawać trasy w sieci za maszyną linuxową, podczas dodawania trasy bramą będzie nasz interfejs IPIP-IPsec0.

PS

Ponieważ nasz serwer linuxowy jest serwerem tranzytowym, warto ustawić parametr Clamp TCP MSS dla interfejsów ipip:

tworzymy plik /etc/iptables.conf z następującą zawartością:

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

i w /etc/network/interfaces
post-up iptables-restore < /etc/iptables.conf

W sieci za mikrotik mam nginx (ip 10.10.10.1), udostępniamy go z internetu, dodajemy 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 mikrotik, w tabeli mangle, należy dodać regułę route z adresem 192.168.0.1 dla pakietów z adresem źródłowym 10.10.10.1 i portami 80, 443.

# Na linuxie działa także serwer OpenVPN 172.16.0.1/24, dla klientów, którzy korzystają z połączenia do niego jako bramy, dajemy dostęp do internetu
-A POSTROUTING -s 172.16.0.0/24 -o eth0 -j SNAT --to-source 1.1.1.1
COMMIT 

Nie zapomnij dodać odpowiednich uprawnień w iptables, jeśli masz włączone filtry pakietów.

Na zdrowie!

Źródło: habr.com

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster