IPIP IPsec VPN-tunnel mellom Linux-maskin og Mikrotik bak NAT-leverandør

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

  • Eth0 1.1.1.1/32 ekstern IP
  • ipip-ipsec0 192.168.0.1/30 vil være vår tunnel

Miktoik: CCR 1009, RouterOS 6.46.5

  • Eth0 10.0.0.2/30 intern IP fra leverandøren. Leverandørens eksterne NAT-IP er dynamisk.
  • ipip-ipsec0 192.168.0.2/30 vil være vår tunnel

Vi vil lage en IPsec-tunnel på en Linux-maskin ved å bruke racoon. Jeg vil ikke beskrive detaljene, det er en god en artikkel у vvpoloskin.

Installer de nødvendige pakkene:

sudo install racoon ipsec-tools

Vi konfigurerer racoon, den vil betinget fungere som en ipsec-server. Siden mikrotik i hovedmodus ikke kan overføre en ekstra klientidentifikator, og den eksterne IP-adressen som den kobles til Linux er dynamisk, vil ikke bruk av en forhåndsdelt nøkkel (passordautorisasjon) fungere, siden passordet enten må samsvare med IP-adressen til den koblende verten, eller med identifikator.

Vi vil bruke autorisasjon ved hjelp av RSA-nøkler.

Racoon-demonen bruker nøkler i RSA-formatet, og mikrotik bruker PEM-formatet. Hvis du genererer nøkler ved hjelp av plainrsa-gen-verktøyet som følger med racoon, vil du ikke kunne konvertere den offentlige nøkkelen for Mikrotika til PEM-format med dens hjelp - den konverterer bare i én retning: PEM til RSA. Verken openssl eller ssh-keygen kunne lese den genererte nøkkelen av plainrsa-gen, så konverteringen vil heller ikke være mulig ved å bruke dem.

Vi vil generere en PEM-nøkkel ved å bruke openssl og deretter konvertere den til vaskebjørn ved å bruke 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

Vi vil legge de mottatte nøklene i mappen: /etc/racoon/certs/server. Ikke glem å sette eieren til brukeren hvis navn vaskebjørn-demonen lanseres (vanligvis root) til 600 tillatelser.

Jeg vil beskrive mikrotik-oppsettet når du kobler til via WinBox.

Last opp servernavn.pub.pem-nøkkelen til mikrotik: Meny "Filer" - "Last opp".

Åpne "IP"-delen - "IP sek" - "Nøkler"-fanen. Nå genererer vi nøkler - "Generer nøkkel"-knappen, og eksporter deretter den offentlige mikrotika-nøkkelen "Expor Pub. Key", kan du laste den ned fra delen "Filer", høyreklikk på filen - "Last ned".

Vi importerer den offentlige racoon-nøkkelen, "Import", i rullegardinlisten i "Filnavn"-feltet, ser vi etter servernavnet.pub.pem vi lastet ned tidligere.

Den offentlige mikrotik-nøkkelen må konverteres

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

og legg den i /etc/racoon/certs-mappen, ikke glem eieren og rettighetene.

racoon config med kommentarer: /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 konfig

Gå tilbake til "IP"-delen - "IPsec"

"Profiler"-fanen
Parameter
Verdi

Navn
Etter eget skjønn (som standard)

Hash-algoritme
sha512

Krypteringsalgoritme
aes-128

DH-gruppe
modp2048

Proposhal_check
hevder

Lifetime
1d 00:00:00

NAT Traversal
sant (merk av i boksen)

DPD
120

DPD Maksimal feil
5

Peers-fanen
Parameter
Verdi

Navn
Etter eget skjønn (heretter kalt MyPeer)

Adresse
1.1.1.1 (IP Linux-maskiner)

Lokal adresse
10.0.0.2 (IP WAN-grensesnitt mikrotik)

Profil
standard~~POS=TRUNC

Bytt modus
main

Passiv
falsk

Send INITIAL_CONTACT
sant

Fanen Forslag
Parameter
Verdi

Navn
Etter eget skjønn (heretter MyPeerProposal)

Auth. Algoritmer
sha512

Encr. Algoritmer
aes-128-cbc

Lifetime
08:00:00

PFS Group
modp2048

Fanen "Identiteter".
Parameter
Verdi

Likemann
MyPeer

Atuh. Metode
rsa nøkkel

nøkkel
mikrotik.privet.key

Fjernnøkkel
servernavn.pub.pem

Policymalgruppe
standard~~POS=TRUNC

Notrack-kjede
tømme

Min ID-type
auto

Ekstern ID-type
auto

Match By
ekstern id

Moduskonfigurasjon
tømme

Generer policy
Nei.

Fanen "Retningslinjer - Generelt"
Parameter
Verdi

Likemann
MyPeer

Tunnel
sant

Src. Adresse
192.168.0.0/30

Dest. Adresse
192.168.0.0/30

Protokoll
255 (alle)

Mal
falsk

Fanen "Retningslinjer - Handling"
Parameter
Verdi

Handling
kryptere

Nivå
rekvirenten

IPsec-protokoller
esp

Forslag
MyPeerProposal

Mest sannsynlig, som meg, har du snat/masquerade konfigurert på WAN-grensesnittet ditt; denne regelen må justeres slik at utgående ipsec-pakker går inn i tunnelen vår:
Gå til delen "IP" - "Brannmur".
"NAT"-fanen, åpne snat/maskerade-regelen vår.

Avansert-fanen
Parameter
Verdi

IPsec-policy
ut: ingen

Starter vaskebjørndemonen på nytt

sudo systemctl restart racoon

Hvis racoon ikke starter ved omstart, er det en feil i konfigurasjonen; i syslog viser racoon informasjon om linjenummeret der feilen ble oppdaget.

Når operativsystemet starter, starter vaskebjørn-demonen før nettverksgrensesnittene blir hentet frem, og vi spesifiserte alternativet strict_address i lytte-delen; du må legge til vaskebjørn-enheten i systemd-filen
/lib/systemd/system/racoon.service, i [Unit]-delen, linje After=network.target.

Nå skal ipsec-tunnelene våre være oppe, se på utgangen:

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

Hvis tunnelene ikke er oppe, se på syslog, eller journalctl -u racoon.

Nå må du konfigurere L3-grensesnitt slik at trafikk kan rutes. Det er forskjellige alternativer, vi vil bruke IPIP, siden mikrotik støtter det, ville jeg brukt vti, men dessverre har det ikke blitt implementert i mikrotik ennå. Den skiller seg fra IPIP ved at den i tillegg kan innkapsle multicast og sette fw-merker på pakker, som de kan filtreres i iptables og iproute2 (policy-basert ruting). Hvis du trenger maksimal funksjonalitet, så for eksempel GRE. Men ikke glem at vi betaler for ekstra funksjonalitet med et stort overhead.

Du kan se oversettelsen av en god anmeldelse av tunnelgrensesnitt her.

På 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

Nå kan du legge til ruter for nettverk bak mikrotik

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

For at grensesnittet og rutene våre skal heves etter en omstart, må vi beskrive grensesnittet i /etc/network/interfaces og legge til ruter der i post-up, eller skrive alt i én fil, for eksempel /etc/ ipip-ipsec0.conf og trekk den gjennom post-up, ikke glem fileieren, rettigheter og gjør den kjørbar.

Nedenfor er en eksempelfil

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

På Mikrotik:

Seksjon "Grensesnitt", legg til et nytt grensesnitt "IP-tunnel":

Fane "IP-tunnel" - "Generelt"
Parameter
Verdi

Navn
Etter eget skjønn (heretter referert til som IPIP-IPsec0)

MTU
1480 (hvis ikke spesifisert, begynner mikrotik å kutte mtu til 68)

Lokal adresse
192.168.0.2

Ekstern adresse
192.168.0.1

IPsec-hemmelighet
Deaktiver feltet (ellers vil en ny Peer bli opprettet)

Holde i live
Deaktiver feltet (ellers vil grensesnittet hele tiden slå seg av, siden mikrotika har sitt eget format for disse pakkene og ikke fungerer med Linux)

DSCP
arve

Ikke fragmenter
Nei.

Klem TCP MSS
sant

Tillat rask bane
sant

Seksjon "IP" - "Adresser", legg til adressen:

Parameter
Verdi

Adresse
192.168.0.2/30

Interface
IPIP-IPsec0

Nå kan du legge til ruter til nettverket bak en Linux-maskin; når du legger til en rute, vil gatewayen være vårt IPIP-IPsec0-grensesnitt.

PS

Siden Linux-serveren vår er transitiv, er det fornuftig å sette Clamp TCP MSS-parameteren for ipip-grensesnitt på den:

lag en fil /etc/iptables.conf med følgende innhold:

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

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

Jeg har nginx som kjører på nettverket bak mikrotik (ip 10.10.10.1), gjør det tilgjengelig fra Internett, legg det til /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 

Ikke glem å legge til de riktige tillatelsene til iptables hvis du har aktivert pakkefiltre.

Hold deg frisk!

Kilde: www.habr.com

Legg til en kommentar