IPIP IPsec VPN-tunnel tussen een Linux-machine en Mikrotik achter de NAT-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 wordt onze tunnel

Miktoik: CCR 1009, RouterOS 6.46.5

  • Eth0 10.0.0.2/30 intern IP van de provider. Extern IP NAT van de provider is dynamisch.
  • ipip-ipsec0 192.168.0.2/30 wordt onze tunnel

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

We installeren de benodigde pakketten:

sudo install racoon ipsec-tools

We configureren racoon, het zal voor de ipsec-server fungeren. Aangezien mikrotik in de hoofdmodus geen extra client-identificatie kan doorgeven, en het externe IP-adres waarmee het verbinding maakt met Linux dynamisch is, is het niet mogelijk om een pre-shared key (wachtwoordauthenticatie) te gebruiken, omdat het wachtwoord moet overeenkomen met ofwel het IP-adres van de host die verbinding maakt, of met de identificatie.

We zullen autorisatie op basis van RSA-sleutels gebruiken.

De daemon racoon gebruikt sleutels in RSA-formaat, terwijl mikrotik in PEM-formaat werkt. Als we sleutels genereren met de utility plainrsa-gen die samen met racoon komt, is het niet mogelijk om de publieke sleutel voor Mikrotik naar het PEM-formaat te converteren met behulp daarvan — het converteert alleen in één richting: PEM naar RSA. De gegenereerde plainrsa-gen sleutel kon niet door openssl of ssh-keygen worden gelezen, dus kon de conversie hiermee ook niet worden uitgevoerd.

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

De verkregen sleutels plaatsen we in de map: /etc/racoon/certs/server. Vergeet niet de eigenaar in te stellen op de gebruiker onder wiens naam de racoon-daemon draait (meestal root), rechten 600.

Ik zal de configuratie van mikrotik beschrijven wanneer we verbinding maken via WinBox.

We uploaden de sleutel server-name.pub.pem naar mikrotik: Menu 'Files' — 'Upload'.

We openen het gedeelte 'IP' — 'IP sec' — tabblad 'Keys'. Nu genereren we sleutels — knop 'Generate Key', en exporteren vervolgens de publieke sleutel van mikrotik 'Export Pub. Key', deze kan worden gedownload uit het gedeelte 'Files', rechter muisklik op het bestand — 'Download'.

We importeren de publieke sleutel van racoon, 'Import', in de uitklaplijst van het veld 'File name' zoeken we de eerder door ons geüploade server-name.pub.pem.

De publieke sleutel van mikrotik moet worden geconverteerd

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

en moet in de map /etc/racoon/certs worden geplaatst, vergeet niet de eigenaar en rechten.

Config racoon met opmerkingen: /etc/racoon/racoon.conf

log info; # Logniveau, gebruik Debug of Debug2 voor debugging.

listen {

    isakmp 1.1.1.1 [500]; # Adres en poort waarop de daemon zal luisteren.
    isakmp_natt 1.1.1.1 [4500]; # Adres en poort waarop de daemon zal luisteren voor NAT-klanten.
    strict_address; # Voer een strikte controle uit op de binding aan de hierboven opgegeven IP-adressen.
}

path certificate "/etc/racoon/certs"; # Pad naar de map met certificaten.

remote anonymous { # Sectie die parameters instelt voor de daemon voor ISAKMP en het onderhandelen van modi met verbindende hosts. Omdat het IP-adres waarmee Mikrotik verbinding maakt dynamisch is, gebruiken we anoniem, wat verbinding vanaf elk adres toestaat. Als de IP-adressen van de hosts statisch zijn, kan een specifiek adres en poort worden opgegeven.

    passive on; # Stelt de "server" modus van de daemon in, deze zal geen verbindingen proberen te initiëren.
    nat_traversal on; # Zet het gebruik van NAT-T modus in voor klanten die achter NAT zitten.
    exchange_mode main; # Uitwisselingsmodus voor verbindingsparameters, in dit geval - onderhandelen.
    my_identifier address 1.1.1.1; # Identificeer onze Linux-host via zijn IP-adres.
    certificate_type plain_rsa "server/server-name.priv.key"; # Privésleutel van de server.
    peers_certfile plain_rsa "mikrotik.pub.key"; # Publieke sleutel van Mikrotik.

    proposal_check claim; # Onderhandelingsmodus voor ISAKMP-tunnelparameters. Racoon gebruikt de waarden van de verbindende host (initiatiefnemer) voor de sessieduur en sleutelgrootte, als zijn sessieduur langer is of de sleutel kleiner dan die van de initiatiefnemer. Als de sessieduur korter is dan die van de initiatiefnemer, gebruikt racoon zijn eigen sessieduurwaarde en zal een RESPONDER-LIFETIME bericht verzenden.
    proposal { # ISAKMP tunnelparameters.

        encryption_algorithm aes; # Versleutelingsmethode voor ISAKMP tunnel.
        hash_algorithm sha512; # Hash-algoritme dat wordt gebruikt voor ISAKMP tunnel.
        authentication_method rsasig; # Authenticatiemethode voor ISAKMP tunnel - op RSA-sleutels.
        dh_group modp2048; # Sleutelgrootte voor het Diffie-Hellman-algoritme bij het onderhandelen van ISAKMP tunnel.
        lifetime time 86400 sec; # Sessieduur.
    }

    generate_policy on; # Automatische creatie van ESP-tunnels vanuit het verzoek dat van de verbindende host komt.
}

sainfo anonymous { # ESP tunnelparameters, anoniem - de gespecificeerde parameters worden als standaardparameters gebruikt. Voor verschillende klanten, poorten en protocollen kunnen verschillende parameters worden ingesteld, waarbij de koppeling plaatsvindt op basis van IP-adressen, poorten en protocollen.

    pfs_group modp2048; # Sleutelgrootte voor het Diffie-Hellman-algoritme voor ESP-tunnels.
    lifetime time 28800 sec; # Geldigheidsduur van ESP-tunnels.
    encryption_algorithm aes; # Versleutelingsmethode voor ESP-tunnels.
    authentication_algorithm hmac_sha512; # Hash-algoritme dat wordt gebruikt voor de authenticatie van ESP-tunnels.
    compression_algorithm deflate; # Gegevens comprimeren, er wordt slechts één compressiemethode aangeboden.
}

Mikrotik-configuratie

We gaan terug naar het gedeelte "IP" — "IPsec"

Tabblad "Profielen"
Parameter
Waarde

Naam
Uw keuze (standaard default)

Hash-algoritme
sha512

Encryption Algorithm
aes-128

DH-Groep
modp2048

Voorstelcontrole
claim

Levensduur
1d 00:00:00

NAT Traversal
waar (vinkje zetten)

DPD
120

DPD Maximale fout
5

Tabblad "Peers"
Parameter
Waarde

Naam
Uw keuze (verder MyPeer)

Address
1.1.1.1 (IP van de Linux-machine)

Lokaal adres
10.0.0.2 (IP van de WAN-interface van Mikrotik)

Profiel
default

Uitwisselingsmodus
main

Passief
false

Stuur INITIALE_CONTACT
true

Tabblad "Voorstel"
Parameter
Waarde

Naam
Uw keuze (verder MyPeerProposal)

Authenticatie-algoritmes
sha512

Versleuteling-algoritmes
aes-128-cbc

Levensduur
08:00:00

PFS-groep
modp2048

Tabblad "Identiteiten"
Parameter
Waarde

Peer
MyPeer

Authenticatiemethode
rsa-sleutel

Key
mikrotik.privet.key

Externe sleutel
server-name.pub.pem

Beleid Sjabloongroep
default

Notrack-keten
leeg

Mijn ID-type
auto

Externe ID-type
auto

Matchen op
externe id

Modusconfiguratie
leeg

Beleid genereren
no

Tabblad "Beleidslijnen — Algemeen"
Parameter
Waarde

Peer
MyPeer

Tunnel
true

Bronadres
192.168.0.0/30

Bestemmingsadres
192.168.0.0/30

Protocol
255 (alle)

Sjabloon
false

Tabblad "Beleidslijnen — Actie"
Parameter
Waarde

Actie
encrypt

Level
vereist

IPsec-protocollen
esp

Voorstel
MyPeerProposal

Waarschijnlijk heeft u, net als ik, op de WAN-interface snat/masquerade ingesteld, deze regel moet worden gecorrigeerd zodat de uitgaande IPsec-pakketten door onze tunnel gaan:
We gaan naar het gedeelte "IP" — "Firewall".
Tabblad "NAT", open onze snat/masquerade regel.

Tabblad "Geavanceerd"
Parameter
Waarde

IPsec-beleid
uit: geen

Herstart de racoon-daemon

sudo systemctl restart racoon

Als racoon niet opnieuw opstart, betekent dit dat er een fout in de configuratie zit. In syslog geeft racoon informatie over het regelnummer waar de fout is aangetroffen.

De daemon racoon start bij het opstarten van het besturingssysteem eerder op dan dat de netwerkinterfaces zijn opgestart, en we hebben in de sectie listen de optie strict_address opgegeven. Het is nodig om dit toe te voegen aan het bestand van de systemd-eenheid racoon.
/lib/systemd/system/racoon.service, в секцию [Unit], строку After=network.target.

Onze IPsec-tunnels zouden nu moeten opstarten, we kijken naar de output:

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 via welke Mikrotik verbinding maakt"
        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 via welke Mikrotik verbinding maakt" 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 via welke Mikrotik verbinding maakt" dst 1.1.1.1
        proto esp reqid 0 mode tunnel

Als de tunnels niet zijn opgestart, kijk dan in syslog of gebruik journalctl -u racoon.

Nu moeten we de L3-interfaces configureren, zodat we verkeer kunnen routeren. Er zijn verschillende opties, we zullen IPIP gebruiken, omdat dit ondersteund wordt door mikrotik. Ik zou vti gebruiken, maar helaas is dit nog niet geïmplementeerd in mikrotik. IPIP verschilt doordat het daarnaast multicast kan encapsuleren en labels (fwmark) aan pakketten kan toevoegen, waarmee ze gefilterd kunnen worden in iptables en iproute2 (op basis van beleid routering). Voor maximale functionaliteit zou je bijvoorbeeld GRE kunnen gebruiken. Maar vergeet niet dat extra functionaliteit een hogere overhead met zich meebrengt.

Je kunt een goede vertaling van een overzicht van tunnelinterfaces bekijken here.

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 kunnen we 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 een herstart worden opgestart, moet je de interface beschrijven in /etc/network/interfaces en daar ook in post-up de routes toevoegen, of alles in één bestand schrijven, bijvoorbeeld /etc/ipip-ipsec0.conf en het aanroepen via post-up. Vergeet niet de eigenaar van het bestand, de rechten in te stellen en het uitvoerbaar te maken.

Hieronder 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
Aan uw beoordeling (verder IPIP-IPsec0)

MTU
1480 (als je dit niet opgeeft, begint mikrotik de mtu te verkleinen tot 68)

Lokaal adres
192.168.0.2

Remote Address
192.168.0.1

Ipsec Secret
Deactiveer dit veld (anders wordt er een nieuwe Peer aangemaakt)

Keepalive
Deactiveer dit veld (anders zal de interface voortdurend uitgeschakeld worden, omdat mikrotik een eigen formaat voor deze pakketten heeft en het niet werkt met linux)

DSCP
inherit

Dont Fragment
no

Clamp TCP MSS
true

Allow Fast Path
true

Sectie 'IP' — 'Addresses', voeg een adres toe:

Parameter
Waarde

Address
192.168.0.2/30

Interface
IPIP-IPsec0

Nu kunnen we routes toevoegen naar netwerken achter de linux-machine. Bij het toevoegen van een route, zal de gateway onze interface IPIP-IPsec0 zijn.

PS

Aangezien onze linux server transitief is, is het zinvol om de parameter Clamp TCP MSS voor ipip interfaces in te stellen:

maak een bestand aan /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

In het netwerk achter mikrotik heb ik nginx draaien (ip 10.10.10.1), laten we het beschikbaar maken vanuit het internet, voeg 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
#Op Mikrotik, moet je een route regel toevoegen met bestemming 192.168.0.1 voor pakketten met het bron adres 10.10.10.1 en poorten 80, 443.

# Ook draait op Linux de OpenVPN server 172.16.0.1/24, voor clients die verbinding maken als gateway geven we toegang tot internet
-A POSTROUTING -s 172.16.0.0/24 -o eth0 -j SNAT --to-source 1.1.1.1
COMMIT 

Vergeet niet om de juiste toestemmingen in iptables toe te voegen als je pakketfilters hebt ingeschakeld.

Gezondheid!

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers 🔥 Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster