IPIP IPsec VPN-tunnel tussen Linux-machine en Mikrotik achter NAT-provider

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

  • Eth0 1.1.1.1/32 extern IP-adres
  • ipip-ipsec0 192.168.0.1/30 zal onze tunnel zijn

Miktoik: CCR 1009, RouterOS 6.46.5

  • Eth0 10.0.0.2/30 intern IP-adres van de provider. Het externe NAT IP-adres van de provider is dynamisch.
  • ipip-ipsec0 192.168.0.2/30 zal onze tunnel zijn

We zullen een IPsec-tunnel maken op een Linux-machine met behulp van racoon. Ik zal de details niet beschrijven, er is een goede artikel у vvpoloskin.

Installeer de vereiste pakketten:

sudo install racoon ipsec-tools

We configureren racoon, deze zal voorwaardelijk fungeren als een ipsec-server. Omdat mikrotik in de hoofdmodus geen extra client-ID kan verzenden en het externe IP-adres waarmee het verbinding maakt met Linux dynamisch is, zal het gebruik van een vooraf gedeelde sleutel (wachtwoordautorisatie) niet werken, omdat het wachtwoord moet worden gekoppeld aan het IP-adres van de verbindende host, of met identificatie.

We gebruiken autorisatie met behulp van RSA-sleutels.

De racoon-daemon gebruikt sleutels in het RSA-formaat en mikrotik gebruikt het PEM-formaat. Als u sleutels genereert met behulp van het plainrsa-gen-hulpprogramma dat bij racoon wordt geleverd, kunt u met zijn hulp de openbare sleutel voor Mikrotika niet naar PEM-formaat converteren - het converteert slechts in één richting: PEM naar RSA. Noch openssl, noch ssh-keygen kunnen de gegenereerde sleutel door plainrsa-gen lezen, dus de conversie zal ook niet mogelijk zijn als ze deze gebruiken.

We zullen een PEM-sleutel genereren met behulp van openssl en deze vervolgens converteren naar racoon met behulp van 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

We plaatsen de ontvangen sleutels in de map: /etc/racoon/certs/server. Vergeet niet om de eigenaar van de gebruiker onder wiens naam de racoon-daemon wordt gestart (meestal root) in te stellen op 600 rechten.

Ik zal de mikrotik-installatie beschrijven bij het verbinden via WinBox.

Upload de sleutel servernaam.pub.pem naar mikrotik: Menu “Bestanden” - “Uploaden”.

Open het gedeelte “IP” - “IP sec” - tabblad “Sleutels”. Nu genereren we sleutels - de knop "Sleutel genereren" en exporteren vervolgens de openbare sleutel van mikrotika "Expor Pub. Key", u kunt het downloaden via de sectie "Bestanden", klik met de rechtermuisknop op het bestand - "Downloaden".

We importeren de openbare sleutel van racoon, “Importeren”, in de vervolgkeuzelijst van het veld “Bestandsnaam” zoeken we naar de servernaam.pub.pem die we eerder hebben gedownload.

De openbare sleutel van mikrotik moet worden geconverteerd

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

en plaats het in de map /etc/racoon/certs, en vergeet de eigenaar en rechten niet.

racoon-configuratie met commentaar: /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-config

Keer terug naar de sectie "IP" - "IPsec"

Tabblad "Profielen".
Parameter
Waarde

Naam
Naar eigen goeddunken (standaard standaard)

Hash-algoritme
sha512

Encryptie algoritme
aes-128

DH-Groep
modp2048

Voorstel_check
aanspraak maken op

Levensduur
1d 00:00:00

NAT-traversal
waar (vink het vakje aan)

DPD
120

DPD Maximale mislukking
5

Tabblad Peers
Parameter
Waarde

Naam
Naar eigen inzicht (hierna MyPeer genoemd)

Adres
1.1.1.1 (IP Linux-machines)

Lokaal adres
10.0.0.2 (IP WAN-interface mikrotik)

Profiel
verzuim

Exchange-modus
hoofd-

Passieve
vals

INITIAL_CONTACT verzenden
waar

Tabblad Voorstel
Parameter
Waarde

Naam
Naar eigen inzicht (hierna MyPeerProposal genoemd)

Aut. Algoritmen
sha512

Encr. Algoritmen
aes-128-cbc

Levensduur
08:00:00

PFS-groep
modp2048

Tabblad "Identiteiten".
Parameter
Waarde

turen
MijnPeer

Atuh. Methode
rsa-sleutel

sleutel
mikrotik.privet.key

Externe sleutel
servernaam.pub.pem

Beleidssjabloongroep
verzuim

Geen track-keten
leeg

Mijn ID-type
auto

ID-type op afstand
auto

Match door
externe id

Mode Configuratie
leeg

Beleid genereren
geen

Tabblad "Beleid - Algemeen"
Parameter
Waarde

turen
MijnPeer

Tunnel
waar

Src. Adres
192.168.0.0/30

Bestem. Adres
192.168.0.0/30

Protocol
255 (alle)

Sjabloon
vals

Tabblad "Beleid - Actie"
Parameter
Waarde

Actie
encrypt

Niveau
vereisen

IPsec-protocollen
esp

Voorstel
MijnPeerVoorstel

Hoogstwaarschijnlijk heb je, net als ik, snat/masquerade geconfigureerd op je WAN-interface; deze regel moet worden aangepast zodat uitgaande ipsec-pakketten onze tunnel binnenkomen:
Ga naar het gedeelte "IP" - "Firewall".
"NAT" tabblad, open onze snat/masquerade-regel.

Tabblad Geavanceerd
Parameter
Waarde

IPsec-beleid
uit: geen

De wasbeerdemon opnieuw opstarten

sudo systemctl restart racoon

Als racoon niet start bij het opnieuw opstarten, is er een fout in de configuratie; in syslog geeft racoon informatie weer over het regelnummer waarin de fout is gedetecteerd.

Wanneer het besturingssysteem opstart, start de racoon-daemon voordat de netwerkinterfaces worden geopend, en we hebben de optie strict_address gespecificeerd in de luistersectie; je moet de racoon-eenheid toevoegen aan het systemd-bestand
/lib/systemd/system/racoon.service, in de sectie [Unit], regel After=network.target.

Nu zouden onze ipsec-tunnels actief moeten zijn, kijk naar de uitvoer:

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

Als de tunnels niet actief zijn, kijk dan naar syslog of journalctl -u racoon.

Nu moet u L3-interfaces configureren zodat verkeer kan worden gerouteerd. Er zijn verschillende opties, we zullen IPIP gebruiken, aangezien mikrotik het ondersteunt, zou ik vti gebruiken, maar helaas is het nog niet geïmplementeerd in mikrotik. Het verschilt van IPIP doordat het bovendien multicast kan inkapselen en fwmarks op pakketten kan zetten, waardoor ze kunnen worden gefilterd in iptables en iproute2 (policy-based routing). Als u maximale functionaliteit nodig heeft, dan is bijvoorbeeld GRE. Maar vergeet niet dat we voor extra functionaliteit betalen met een grote overhead.

Je ziet de vertaling van een goed overzicht van tunnelinterfaces hier.

Op 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 kunt u routes toevoegen voor netwerken achter mikrotik

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

Om ervoor te zorgen dat onze interface en routes worden weergegeven na een herstart, moeten we de interface beschrijven in /etc/network/interfaces en daar routes toevoegen in de post-up, of alles in één bestand schrijven, bijvoorbeeld /etc/ ipip-ipsec0.conf en haal het door de post-up, vergeet de bestandseigenaar en rechten niet en maak het uitvoerbaar.

Hieronder vindt u een voorbeeldbestand

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

Op Mikrotik:

Sectie “Interfaces”, voeg een nieuwe interface “IP-tunnel” toe:

Tabblad “IP-tunnel” - “Algemeen”
Parameter
Waarde

Naam
Naar eigen goeddunken (hierna IPIP-IPsec0 genoemd)

MTU
1480 (indien niet gespecificeerd, begint Mikrotik met het terugbrengen van mtu naar 68)

Lokaal adres
192.168.0.2

Extern adres
192.168.0.1

IPsec-geheim
Deactiveer het veld (anders wordt er een nieuwe Peer aangemaakt)

In leven houden
Deactiveer het veld (anders wordt de interface voortdurend uitgeschakeld, aangezien mikrotika een eigen formaat heeft voor deze pakketten en niet werkt met Linux)

DSCP
erven

Niet fragmenteren
geen

Klem TCP MSS vast
waar

Snel pad toestaan
waar

Sectie “IP” - “Adressen”, voeg het adres toe:

Parameter
Waarde

Adres
192.168.0.2/30

Interface
IPIP-IPsec0

Nu kunt u routes toevoegen aan het netwerk achter een Linux-machine; bij het toevoegen van een route zal de gateway onze IPIP-IPsec0-interface zijn.

PS

Omdat onze Linux-server transitief is, is het zinvol om de Clamp TCP MSS-parameter voor ipip-interfaces erop in te stellen:

maak een bestand /etc/iptables.conf met de volgende inhoud:

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

en in /etc/network/interfaces
post-up iptables-restore < /etc/iptables.conf

Ik heb nginx draaiend op het netwerk achter mikrotik (ip 10.10.10.1), maak het toegankelijk vanaf internet, voeg het toe aan /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 

Vergeet niet de juiste machtigingen aan iptables toe te voegen als pakketfilters zijn ingeschakeld.

Blijf gezond!

Bron: www.habr.com

Voeg een reactie