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

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

  • Eth0 1.1.1.1/32 extern IP
  • 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. Externe IP-NAT van de provider is dynamisch.
  • ipip-ipsec0 192.168.0.2/30 zal onze tunnel zijn

IPsec-tunnel op Linux We tillen de auto op met behulp van een wasbeer. Ik ga niet in detail treden, er is een goede reden om dat te doen. artikel у vvpoloskin.

Installeer de vereiste pakketten:

sudo install racoon ipsec-tools

We configureren racoon, dat als IPsec-server zal fungeren. Omdat Mikrotik in de hoofdmodus geen extra client-ID kan verzenden, gebruiken we het externe IP-adres waarmee het verbinding maakt. Linux Dynamische authenticatie met een vooraf gedeelde sleutel (wachtwoordautorisatie) werkt niet, omdat het wachtwoord moet overeenkomen met het IP-adres van de verbindende host of met een identificatiecode.

Wij maken gebruik van RSA-sleutelautorisatie.

De racoon-daemon gebruikt sleutels in RSA-formaat, en mikrotik gebruikt sleutels in PEM-formaat. Als je sleutels genereert met het hulpprogramma plainrsa-gen dat bij racoon wordt geleverd, kun je de publieke sleutel voor Mikrotika niet naar PEM-formaat converteren - het converteert maar één kant op: PEM naar RSA. Noch openssl, noch ssh-keygen konden de door plainrsa-gen gegenereerde sleutel lezen, dus je kunt deze ook niet met deze tools converteren.

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

Plaats de ontvangen sleutels in de map /etc/racoon/certs/server. Vergeet niet de eigenaar in te stellen op de gebruiker namens wie de racoon-daemon wordt gestart (meestal root), met rechten 600.

Ik zal de mikrotik-opstelling beschrijven bij verbinding via WinBox.

We uploaden de sleutel server-name.pub.pem naar mikrotik: Menu “Bestanden” — “Uploaden”.

Open de sectie "IP" - "IP sec" - tabblad "Sleutels". Genereer nu sleutels - knop "Sleutel genereren" en exporteer vervolgens de publieke sleutel "Export Pub. Key". U kunt deze downloaden vanuit de sectie "Bestanden", klik met de rechtermuisknop op het bestand - "Downloaden".

We importeren de publieke sleutel racoon, “Importeren”, in de dropdown lijst van het veld “Bestandsnaam” zoeken we naar de server-name.pub.pem die we eerder hebben gedownload.

De openbare sleutel van Mikrotik moet worden omgezet

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

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

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

Terug naar de sectie "IP" - "IPsec"

Tabblad 'Profielen'
Parameter
Waarde

Naam
Naar eigen goeddunken (standaard)

Hash-algoritme
sha512

Encryptie algoritme
aes-128

DH Groep
modp2048

Voorstelcontrole
aanspraak maken op

Levensduur
1d 00:00:00

NAT-traversal
waar (vink het vakje aan)

DPD
120

DPD Maximale Storing
5

Tabblad Peers
Parameter
Waarde

Naam
Naar eigen goeddunken (hierna MyPeer)

Adres
1.1.1.1 (IP Linux-machines)

Lokaal adres
10.0.0.2 (IP WAN-interface mikrotik)

Profiel
verzuim

Uitwisselingsmodus
hoofd-

Passieve
vals

Stuur INITIAL_CONTACT
waar

Tabblad Voorstel
Parameter
Waarde

Naam
Naar eigen goeddunken (hierna MyPeerProposal)

Autorisatie-algoritmen
sha512

Encr.-algoritmen
aes-128-cbc

Levensduur
08:00:00

PFS Groep
modp2048

Tabblad Identiteiten
Parameter
Waarde

turen
MijnPeer

Atuh. Method
rsa-sleutel

sleutel
microtik.privet.key

Externe sleutel
servernaam.pub.pem

BeleidTampaGrupp
verzuim

Notrack-ketting
leeg

Mijn ID-type
auto

Type externe ID
auto

Match door
externe id

Modusconfiguratie
leeg

Beleid genereren
geen

Tabblad "Beleid — Algemeen"
Parameter
Waarde

turen
MijnPeer

Tunnel
waar

Bronadres
192.168.0.0/30

Bestem. adres
192.168.0.0/30

Protocol
255 (alle)

Sjabloon
vals

Beleid — Tabblad Actie
Parameter
Waarde

Actie
encrypt

Niveau
vereist

IPsec-protocollen
esp

Voorstel
MijnPeerProposal

Waarschijnlijk heeft u, net als ik, snat/masquerade geconfigureerd op de WAN-interface. Deze regel moet worden aangepast zodat uitgaande ipsec-pakketten onze tunnel ingaan:
Ga naar het gedeelte "IP" - "Firewall".
Klik op "NAT" en open onze snat/masquerade-regel.

Tabblad Geavanceerd
Parameter
Waarde

IPsec-beleid
uit: geen

Het opnieuw opstarten van de wasbeer-demon

sudo systemctl restart racoon

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

De racoon-daemon start voordat de netwerkinterfaces worden geactiveerd wanneer het besturingssysteem wordt opgestart. We hebben de optie strict_address opgegeven in de sectie listen. Deze moet worden toegevoegd aan het systemd-bestand van de racoon-eenheid.
/lib/systemd/system/racoon.service, in de sectie [Unit], regel After=network.target.

Onze ipsec-tunnels zouden nu actief moeten zijn. Bekijk 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 werken, kijk dan naar syslog of journalctl -u racoon.

Nu moeten we L3-interfaces configureren om verkeer te kunnen routeren. Er zijn verschillende opties. We gebruiken IPIP, aangezien Mikrotik dit ondersteunt. Ik zou vti gebruiken, maar helaas heeft Mikrotik dit nog niet geïmplementeerd. Het verschilt van IPIP doordat het multicast kan encapsuleren en markeringen (fwmark) op pakketten kan plaatsen, waardoor deze kunnen worden gefilterd in iptables en iproute2 (beleidsgebaseerde routering). Als u maximale functionaliteit nodig hebt, kies dan bijvoorbeeld voor GRE. Maar vergeet niet dat we voor extra functionaliteit betalen met een hoge overhead.

Een vertaling van een goed overzicht van tunnelinterfaces kunt u hier bekijken 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 na het opnieuw opstarten actief zijn, moeten we de interface beschrijven in /etc/network/interfaces en daar routes aan toevoegen in post-up. U kunt ook alles in één bestand zetten, bijvoorbeeld /etc/ipip-ipsec0.conf, en dat via post-up ophalen. Vergeet hierbij niet de eigenaar van het bestand en de rechten te vermelden en zorg dat het uitvoerbaar is.

Een voorbeeldbestand vindt u onder de snit.

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

Over Mikrotik:

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

"IP-tunnel" invoegen - "Algemeen"
Parameter
Waarde

Naam
Naar eigen goeddunken (hierna IPIP-IPsec0)

MTU
1480 (indien niet gespecificeerd, begint mikrotik met het snijden 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 blijft de interface constant uitgeschakeld, aangezien mikrotika een eigen formaat heeft voor deze pakketten en niet met Linux werkt)

DSCP
erven

Niet fragmenteren
geen

Klem TCP MSS
waar

Snel pad toestaan
waar

Sectie "IP" - "Adressen", voeg het adres toe:

Parameter
Waarde

Adres
192.168.0.2/30

Interface
IPIP-IPsec0

U kunt nu routes toevoegen aan het netwerk achter de Linux-machine. Wanneer u een route toevoegt, wordt de gateway onze IPIP-IPsec0-interface.

PS

Omdat onze Linux-server een transitserver is, is het zinvol om de Clamp TCP MSS-parameter voor ipip-interfaces 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 draaien op het netwerk achter mikrotik (ip 10.10.10.1). Laten we het toegankelijk maken vanaf het internet. Voeg het volgende 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 u pakketfilters hebt ingeschakeld.

Blijf gezond!

Bron: www.habr.com

Koop betrouwbare hosting voor sites met DDoS-bescherming, VPS VDS-servers 🔥 Koop betrouwbare websitehosting met DDoS-bescherming, VPS- en VDS-servers | ProHoster