IPIP IPsec VPN-tunnel mellem Linux-maskine og Mikrotik bag NAT-udbyder

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 bliver vores tunnel

Miktoik: CCR 1009, RouterOS 6.46.5

  • Eth0 10.0.0.2/30 intern IP fra udbyderen. Udbyderens eksterne NAT IP er dynamisk.
  • ipip-ipsec0 192.168.0.2/30 bliver vores tunnel

Vi vil oprette en IPsec-tunnel på en Linux-maskine ved hjælp af racoon. Jeg vil ikke beskrive detaljerne, der er en god en artiklen у vvpoloskin.

Installer de nødvendige pakker:

sudo install racoon ipsec-tools

Vi konfigurerer racoon, den vil betinget fungere som en ipsec-server. Da mikrotik i hovedtilstand ikke kan overføre en ekstra klient-id, og den eksterne IP-adresse, som den forbinder til Linux, er dynamisk, vil brug af en foruddelt nøgle (adgangskodeautorisation) ikke fungere, da adgangskoden enten skal matches med IP-adressen på den forbindende vært, eller med identifikator.

Vi vil bruge autorisation ved hjælp af RSA-nøgler.

Racoon-dæmonen bruger nøgler i RSA-formatet, og mikrotik bruger PEM-formatet. Hvis du genererer nøgler ved hjælp af plainrsa-gen-værktøjet, der følger med racoon, så vil du ikke være i stand til at konvertere den offentlige nøgle til Mikrotika til PEM-format med dens hjælp - den konverterer kun i én retning: PEM til RSA. Hverken openssl eller ssh-keygen kunne læse den genererede nøgle af plainrsa-gen, så konverteringen vil heller ikke være mulig ved brug af dem.

Vi vil generere en PEM-nøgle ved hjælp af openssl og derefter konvertere den til vaskebjørn ved hjælp af 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 lægge de modtagne nøgler i mappen: /etc/racoon/certs/server. Glem ikke at indstille ejeren af ​​brugeren, under hvis navn vaskebjørn-dæmonen lanceres (normalt root) til 600 tilladelser.

Jeg vil beskrive mikrotik-opsætningen ved tilslutning via WinBox.

Upload server-name.pub.pem nøglen til mikrotik: Menu “Filer” - “Upload”.

Åbn sektionen "IP" - "IP sek" - fanen "Nøgler". Nu genererer vi nøgler - knappen "Generer nøgle", og eksporter derefter den offentlige mikrotika-nøgle "Expor Pub. Key", kan du downloade den fra afsnittet "Filer", højreklik på filen - "Download".

Vi importerer den offentlige racoon-nøgle, "Import", i rullelisten i "Filnavn"-feltet, og vi leder efter servernavnet.pub.pem, som vi downloadede tidligere.

Den offentlige mikrotik-nøgle skal konverteres

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

og læg den i mappen /etc/racoon/certs, og glem ikke ejeren og rettighederne.

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 konfiguration

Vend tilbage til afsnittet "IP" - "IPsec"

Fanen "Profiler".
Parameter
Value

Navn
Efter eget skøn (som standard)

Hash-algoritme
sha512

Krypteringsalgoritme
aes-128

DH-Gruppen
modp2048

Proposhal_check
krav

Levetid
1d 00:00:00

NAT Traversal
sand (marker afkrydsningsfeltet)

DPD
120

DPD Maksimal fejl
5

Fanen Peers
Parameter
Value

Navn
Efter dit skøn (herefter benævnt MyPeer)

Adresse
1.1.1.1 (IP Linux-maskiner)

Lokal adresse
10.0.0.2 (IP WAN interface mikrotik)

Profil
standard

Udvekslingstilstand
main

Passiv
falsk

Send INITIAL_CONTACT
sand

Fanen Forslag
Parameter
Value

Navn
Efter dit skøn (herefter benævnt MyPeerProposal)

Auth. Algoritmer
sha512

Encr. Algoritmer
aes-128-cbc

Levetid
08:00:00

PFS Group
modp2048

Fanen "Identiteter".
Parameter
Value

Peer
MyPeer

Atuh. Metode
rsa nøgle

Nøgle
mikrotik.privet.key

Fjernnøgle
servernavn.pub.pem

Politikskabelongruppe
standard

Notrack kæde
tom

Min ID-type
auto

Fjern-ID-type
auto

Match By
fjernbetjening id

Tilstandskonfiguration
tom

Generer politik
ingen

Fanen "Politik - Generelt"
Parameter
Value

Peer
MyPeer

Tunnel
sand

Src. Adresse
192.168.0.0/30

Dest. Adresse
192.168.0.0/30

protokol
255 (alle)

Skabelon
falsk

Fanen "Politik - Handling"
Parameter
Value

Handling
kryptere

Niveau
kræve

IPsec-protokoller
esp

Forslag
MyPeerProposal

Mest sandsynligt, ligesom jeg, har du snat/masquerade konfigureret på din WAN-grænseflade; denne regel skal justeres, så udgående ipsec-pakker går ind i vores tunnel:
Gå til afsnittet "IP" - "Firewall".
"NAT"-fanen, åbn vores snat/masquerade-regel.

Avanceret fane
Parameter
Value

IPsec-politik
ud: ingen

Genstart af vaskebjørn-dæmonen

sudo systemctl restart racoon

Hvis racoon ikke starter ved genstart, er der en fejl i konfigurationen; i syslog viser racoon information om linjenummeret, hvor fejlen blev opdaget.

Når operativsystemet starter, starter vaskebjørn-dæmonen, før netværksgrænsefladerne bliver hentet frem, og vi specificerede strict_address-indstillingen i lyttesektionen; du skal tilføje vaskebjørnenheden til systemd-filen
/lib/systemd/system/racoon.service, i [Unit]-sektionen, linje After=network.target.

Nu skulle vores ipsec-tunneler være oppe, se på outputtet:

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 tunnelerne ikke er oppe, så se på syslog eller journalctl -u racoon.

Nu skal du konfigurere L3-grænseflader, så trafikken kan dirigeres. Der er forskellige muligheder, vi vil bruge IPIP, da mikrotik understøtter det, ville jeg bruge vti, men det er desværre endnu ikke blevet implementeret i mikrotik. Den adskiller sig fra IPIP ved, at den desuden kan indkapsle multicast og sætte fwmarks på pakker, hvorved de kan filtreres i iptables og iproute2 (politikbaseret routing). Har du brug for maksimal funktionalitet, så er det for eksempel GRE. Men glem ikke, at vi betaler for yderligere funktionalitet med et stort overhead.

Du kan se oversættelsen af ​​et godt overblik over tunnelgrænseflader 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

Nu kan du tilføje ruter til netværk bag mikrotik

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

For at vores grænseflade og ruter kan hæves efter en genstart, skal vi beskrive grænsefladen i /etc/network/interfaces og tilføje ruter der i post-up, eller skrive alt i én fil, for eksempel /etc/ ipip-ipsec0.conf og træk det gennem post-up, glem ikke filejeren, rettigheder og gør det eksekverbart.

Nedenfor er et eksempel på en fil

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

Afsnit "Grænseflader", tilføje en ny grænseflade "IP-tunnel":

Fanen "IP-tunnel" - "Generelt"
Parameter
Value

Navn
Efter eget skøn (i det følgende benævnt IPIP-IPsec0)

MTU
1480 (hvis ikke specificeret, begynder mikrotik at skære mtu til 68)

Lokal adresse
192.168.0.2

Fjernadresse
192.168.0.1

IPsec-hemmelighed
Deaktiver feltet (ellers oprettes en ny Peer)

Holde i live
Deaktiver feltet (ellers vil grænsefladen konstant slukke, da mikrotika har sit eget format til disse pakker og ikke fungerer med Linux)

DSCP
arve

Fragmentér ikke
ingen

Klem TCP MSS
sand

Tillad hurtig sti
sand

Afsnit "IP" - "Adresser", tilføj adressen:

Parameter
Value

Adresse
192.168.0.2/30

grænseflade
IPIP-IPsec0

Nu kan du tilføje ruter til netværket bag en Linux-maskine; når du tilføjer en rute, vil gateway være vores IPIP-IPsec0-interface.

PS

Da vores Linux-server er transitiv, giver det mening at indstille Clamp TCP MSS-parameteren for ipip-grænseflader på den:

opret en fil /etc/iptables.conf med følgende indhold:

*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 kørende på netværket bag mikrotik (ip 10.10.10.1), gør det tilgængeligt fra internettet, tilføj 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 

Glem ikke at tilføje de relevante tilladelser til iptables, hvis du har aktiveret pakkefiltre.

Forblive sunde!

Kilde: www.habr.com

Tilføj en kommentar