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 u .
Instalujemy niezbędne pakiety:
sudo install racoon ipsec-toolsKonfigurujemy 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.keyOtrzymane 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.keyi 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 racoonJeś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 tunnelJeś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 .
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-ipsec0Teraz można dodać trasy dla sieci za mikrotik
sudo ip route add A.B.C.D/Prefiks via 192.168.255.2Aby 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.2Na 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
COMMITi 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
