Tunel IPIP IPsec VPN pomiędzy komputerem z systemem Linux a Mikrotik za dostawcą NAT

Linux: Ubuntu 18.04.4 LTS (GNU/Linux 4.15.0-91-ogólny x86_64)

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

Miktoik: CCR 1009, RouterOS 6.46.5

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

Utworzymy tunel IPsec na komputerze z systemem Linux za pomocą programu racoon. Nie będę opisywał szczegółów, jest jeden dobry artykuł у vvpoloskin.

Zainstaluj wymagane pakiety:

sudo install racoon ipsec-tools

Konfigurujemy racoon, będzie on warunkowo działał jako serwer 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 Linuksem, jest dynamiczny, użycie klucza wstępnego (autoryzacja hasłem) nie będzie działać, ponieważ hasło musi być dopasowane albo do adresu IP hosta łączącego lub z identyfikatorem.

Autoryzację wykorzystamy za pomocą kluczy RSA.

Demon racoon używa kluczy w formacie RSA, a mikrotik używa formatu PEM. Jeśli generujesz klucze za pomocą narzędzia zwykłyrsa-gen dołączonego do racoon, to nie będziesz w stanie za jego pomocą przekonwertować klucza publicznego Mikrotiki na format PEM - konwertuje on tylko w jednym kierunku: PEM na RSA. Ani openssl, ani ssh-keygen nie mogły odczytać wygenerowanego klucza przez zwykły rsa-gen, więc konwersja również nie będzie możliwa przy ich użyciu.

Wygenerujemy klucz PEM za pomocą openssl, a następnie przekonwertujemy go na racoon za pomocą zwykłyrsa-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 umieścimy w folderze: /etc/racoon/certs/server. Nie zapomnij ustawić właściciela użytkownika, pod którego nazwą uruchamiany jest demon racoon (zazwyczaj root), na 600 uprawnień.

Opiszę konfigurację mikrotika podczas łączenia się przez WinBox.

Prześlij klucz nazwa-serwera.pub.pem do mikrotika: Menu „Pliki” - „Prześlij”.

Otwórz sekcję „IP” - „IP sec” - zakładkę „Klucze”. Teraz generujemy klucze - przycisk „Generuj klucz”, następnie eksportujemy klucz publiczny mikrotika „Expor Pub. Key”, możesz go pobrać z sekcji „Pliki”, kliknij plik prawym przyciskiem myszy - „Pobierz”.

Importujemy klucz publiczny racoon „Importuj”, na rozwijanej liście pola „Nazwa pliku” szukamy pobranego wcześniej pliku nazwa-serwera.pub.pem.

Klucz publiczny mikrotik wymaga konwersji

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

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

konfiguracja racoon z komentarzami: /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; # Сжимать передаваемые данные, алгоритм сжатия предлагается только один.
}

konfiguracja mikrotika

Wróć do sekcji „IP” - „IPsec”

Zakładka „Profile”.
Parametr
Wartość

Imię
Według własnego uznania (domyślnie)

Algorytm skrótu
sha512

Algorytm szyfrowania
aes-128

Grupa DH
modp2048

Sprawdzenie propozycji
roszczenie

Życie
1d 00:00:00

Przechodzenie przez NAT
prawda (zaznacz pole)

DPD
120

DPD Maksymalna awaria
5

Zakładka rówieśnicy
Parametr
Wartość

Imię
Według własnego uznania (zwany dalej MyPeer)

Adres
1.1.1.1 (komputery IP Linux)

Lokalny adres
10.0.0.2 (interfejs IP WAN mikrotik)

Profil
domyślnym

Tryb wymiany
główny

Pasywny
fałszywy

Wyślij INITIAL_CONTACT
prawdziwy

Zakładka Oferta
Parametr
Wartość

Imię
Według własnego uznania (zwane dalej MyPeerProposal)

Autoryt. Algorytmy
sha512

Enkr. Algorytmy
aes-128-cbc

Życie
08:00:00

Grupa PFS
modp2048

Zakładka „Tożsamości”.
Parametr
Wartość

Peer
MójPeer

Atuh. metoda
klucz rs

Klawisz
mikrotik.privet.key

Zdalny klucz
nazwa-serwera.pub.pem

Grupa szablonów zasad
domyślnym

Łańcuch Notrack
pusty

Mój typ identyfikatora
samochód

Typ identyfikatora zdalnego
samochód

Dopasuj według
zdalny identyfikator

Konfiguracja trybu
pusty

Wygeneruj politykę
Nie

Zakładka „Zasady – Ogólne”
Parametr
Wartość

Peer
MójPeer

Tunel
prawdziwy

Src. Adres
192.168.0.0/30

Cel. Adres
192.168.0.0/30

Protokół
255 (wszystkie)

szablon
fałszywy

Zakładka „Zasady – Akcja”
Parametr
Wartość

Działania
Szyfrowanie

poziom
wymagać

Protokoły IPsec
esp

Wniosek
Moja propozycja partnerska

Najprawdopodobniej, podobnie jak ja, masz skonfigurowany snat/masquerade na swoim interfejsie WAN; tę regułę należy dostosować, aby wychodzące pakiety ipsec trafiały do ​​naszego tunelu:
Przejdź do sekcji „IP” - „Zapora sieciowa”.
Zakładka „NAT”, otwórz naszą regułę snat/masquerade.

Zakładka Zaawansowane
Parametr
Wartość

Polityka IPsec
wyjście: brak

Ponowne uruchamianie demona szopa

sudo systemctl restart racoon

Jeśli racoon nie uruchamia się po ponownym uruchomieniu, oznacza to błąd w konfiguracji; w syslog racoon wyświetla informację o numerze linii, w której wykryto błąd.

Po uruchomieniu systemu operacyjnego demon racoon uruchamia się przed wywołaniem interfejsów sieciowych, a w sekcji słuchania określiliśmy opcję strict_address; musisz dodać jednostkę racoon do pliku systemowego
/lib/systemd/system/racoon.service, w sekcji [Unit], wiersz After=network.target.

Teraz nasze tunele ipsec powinny działać, spójrz na 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 через который подключается 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

Jeśli tunele nie działają, spójrz na syslog lub journalctl -u racoon.

Teraz musisz skonfigurować interfejsy L3, aby ruch mógł być kierowany. Istnieją różne opcje, użyjemy IPIP, ponieważ mikrotik to obsługuje, użyłbym vti, ale niestety nie zostało to jeszcze zaimplementowane w mikrotik. Różni się od IPIP tym, że może dodatkowo enkapsulować multicast i umieszczać na pakietach znaczniki fw, dzięki którym można je filtrować w iptables i iproute2 (routing oparty na zasadach). Jeśli potrzebujesz maksymalnej funkcjonalności, to na przykład GRE. Ale nie zapominaj, że za dodatkową funkcjonalność płacimy dużą głowicą górną.

Możesz zobaczyć tłumaczenie dobrej recenzji interfejsów tunelowych tutaj.

W systemie 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

Teraz możesz dodawać trasy dla sieci za mikrotik

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

Aby nasz interfejs i trasy zostały podniesione po restarcie, musimy opisać interfejs w /etc/network/interfaces i dodać tam trasy w poście, lub zapisać wszystko w jednym pliku, np. /etc/ ipip-ipsec0.conf i przeciągnij go przez pocztę, nie zapomnij o właścicielu pliku, prawach i spraw, aby był wykonywalny.

Poniżej znajduje się przykładowy plik

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

W sekcji „Interfejsy” dodaj nowy interfejs „Tunel IP”:

Zakładka „Tunel IP” - „Ogólne”
Parametr
Wartość

Imię
Według własnego uznania (zwany dalej IPIP-IPsec0)

MTU
1480 (jeśli nie określono, mikrotik zaczyna zmniejszać MTU do 68)

Lokalny adres
192.168.0.2

Adres zdalny
192.168.0.1

Sekret IPsec
Dezaktywuj pole (w przeciwnym razie zostanie utworzony nowy Peer)

Utrzymać przy życiu
Dezaktywuj pole (w przeciwnym razie interfejs będzie stale się wyłączał, ponieważ mikrotika ma swój własny format dla tych pakietów i nie działa z Linuksem)

DSCP
dziedziczyć

Nie fragmentuj
Nie

Zacisk TCP MSS
prawdziwy

Zezwalaj na szybką ścieżkę
prawdziwy

Sekcja „IP” - „Adresy” dodaj adres:

Parametr
Wartość

Adres
192.168.0.2/30

Interfejs
IPIP-IPsec0

Teraz możesz dodawać trasy do sieci za komputerem z Linuksem; podczas dodawania trasy bramą będzie nasz interfejs IPIP-IPsec0.

PS

Ponieważ nasz serwer Linux jest przechodni, sensowne jest ustawienie na nim parametru Clamp TCP MSS dla interfejsów ipip:

utwórz 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

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

Mam nginx działający w sieci za mikrotik (ip 10.10.10.1), udostępnij go z Internetu, dodaj go 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
#На 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 

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

Bądź zdrowa!

Źródło: www.habr.com

Dodaj komentarz