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

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

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

Miktoik: CCR 1009, RouterOS 6.46.5

  • Eth0 10.0.0.2/30 intern IP fra udbyderen. Den eksterne IP fra udbyderen er dynamisk.
  • ipip-ipsec0 192.168.0.2/30 vil være vores tunnel

IPsec tunnelen på Linux maskinen vil vi oprette med racoon. Jeg vil ikke beskrive detaljer, der er en god artikel af vvpoloskin.

Installerer nødvendige pakker:

sudo install racoon ipsec-tools

Vi konfigurerer racoon, som vil fungere som IPsec server. Da Mikrotik i hovedtilstand ikke kan overføre en ekstra klientidentifier, og den eksterne IP-adresse, som den forbinder til Linux, er dynamisk, vil brugen af preshared key (godkendelse via adgangskode) ikke fungere, da passwordet skal matche enten med IP-adressen på den tilsluttede værtsmaskine eller med identifikatoren.

Vi vil bruge godkendelse via RSA nøgler.

Racoon demon bruger nøgler i RSA-format, mens Mikrotik bruger PEM-format. Hvis man genererer nøgler med værktøjet plainrsa-gen, som følger med racoon, vil det ikke være muligt at konvertere den offentlige nøgle til Mikrotik i PEM-format med det, da det kun konverterer én vej: fra PEM til RSA. Den genererede plainrsa-gen nøgle kunne hverken læses af openssl eller ssh-keygen, så dette vil heller ikke kunne udføre konverteringen.

Vi genererer en PEM-nøgle ved hjælp af openssl og konverterer den til racoon med 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 opnåede nøgler placeres i mappen: /etc/racoon/certs/server. Husk at sætte ejerrettigheder til den bruger, som racoon demon kører under (normalt root), med rettigheder 600.

Jeg vil beskrive konfigurationen af Mikrotik, når vi tilslutter via WinBox.

Nøglen server-name.pub.pem uploades til Mikrotik: Menuen "Files" — "Upload".

Vi åbner afsnittet "IP" — "IP sec" — fanen "Keys". Nu genererer vi nøgler — knappen "Generate Key", derefter eksporterer vi Mikrotiks offentlige nøgle "Export Pub. Key", den kan downloades fra afsnittet "Files", højreklik på filen — "Download".

Vi importerer den offentlige nøgle fra racoon, "Import", og i dropdown-listen i feltet "File name" søger vi efter den tidligere uploadede server-name.pub.pem.

Den offentlige nøgle fra Mikrotik skal konverteres

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

og placeres i mappen /etc/racoon/certs uden at glemme ejerrettigheder og tilladelser.

Konfigurationen af racoon med kommentarer: /etc/racoon/racoon.conf

log info; # Logniveau, brug Debug eller Debug2 under fejlfinding.

listen {

    isakmp 1.1.1.1 [500]; # Adressen og porten, hvor de monteringstjenesterne vil lytte.
    isakmp_natt 1.1.1.1 [4500]; # Adressen og porten, hvor de monteringstjenesterne vil lytte for NAT-baserede kunder.
    strict_address; # Tving obligatorisk kontrol af binding til de angivne IP-adresser.
}

path certificate "/etc/racoon/certs"; # Stien til certificeringsmappen.

remote anonymous { # Sektion, der fastsætter parametre for arbejdet med ISAKMP daemonen og aftaler tilstande med tilsluttende værter. Da IP-adressen, som Mikrotik forbinder fra, er dynamisk, bruger vi anonymous, som tillader forbindelse fra enhver adresse. Hvis værternes IP-adresser er statiske, kan man angive en bestemt adresse og port.

    passive on; # Indstiller daemonen til "server"-tilstand, den vil ikke forsøge at initiere forbindelser.
    nat_traversal on; # Aktiverer brug af NAT-T-tilstand for kunder, hvis de er bag NAT.
    exchange_mode main; # Parametrene for forbindelse, i dette tilfælde - aftale.
    my_identifier address 1.1.1.1; # Identificerer vores Linux-vært ved dens IP-adresse.
    certificate_type plain_rsa "server/server-name.priv.key"; # Serverens private nøgle.
    peers_certfile plain_rsa "mikrotik.pub.key"; # Mikrotiks offentlige nøgle.

    proposal_check claim; # Aftalens tilstand for ISAKMP-tunnelen. Racoon vil bruge værdierne fra den tilsluttende vært (initiatoren) for sessionens varighed og nøglens længde, hvis dens session varighed er længere eller nøglens længde kortere end initiatorens. Hvis sessionens varighed er kortere end initiatorens, bruger racoon sin egen værdi for sessionens varighed og vil sende en RESPONDER-LIFETIME melding.
    proposal { # ISAKMP-tunnelparametre.

        encryption_algorithm aes; # Krypteringsmetode for ISAKMP-tunnelen.
        hash_algorithm sha512; # Hasheringsalgoritme anvendt for ISAKMP-tunnelen.
        authentication_method rsasig; # Godkendelsesmetode for ISAKMP-tunnelen - baseret på RSA-nøgler.
        dh_group modp2048; # Nøglens længde for Diffie-Hellman-algoritmen under ISAKMP-tunnelens aftale.
        lifetime time 86400 sec; # Sessionens varighed.
    }

    generate_policy on; # Automatisk oprettelse af ESP-tunneler fra forespørgslen fra den tilsluttende vært.
}

sainfo anonymous { # Parametre for ESP-tunneler, anonymous - de angivne parametre vil blive anvendt som standardparametre. For forskellige kunder, porte og protokoller kan man angive forskellige parametre, matchning sker baseret på IP-adresser, porte og protokoller.

    pfs_group modp2048; # Nøglens længde for Diffie-Hellman-algoritmen for ESP-tunneler.
    lifetime time 28800 sec; # Varigheden af ESP-tunneler.
    encryption_algorithm aes; # Krypteringsmetode for ESP-tunneler.
    authentication_algorithm hmac_sha512; # Hasheringsalgoritme anvendt til autentificering af ESP-tunneler.
    compression_algorithm deflate; # Komprimerer de overførte data, kun én komprimeringsalgoritme foreslås.
}

Mikrotik-konfiguration

Gå tilbage til sektionen "IP" - "IPsec"

Fanen "Profiler"
Parameter
Værdi

Navn
Valgfri (standard default)

Hash-algoritme
sha512

Krypteringsalgoritme
aes-128

DH-Gruppe
modp2048

Proposal_check
claim

Levetrid
1d 00:00:00

NAT Traversal
true (sæt markeringen)

DPD
120

DPD Maksimum fejl
5

Fanen "Peers"
Parameter
Værdi

Navn
Valgfri (herefter MyPeer)

Adresse
1.1.1.1 (linux maskinens IP)

Lokal adresse
10.0.0.2 (IP WAN-interface på mikrotik)

Profil
default

Exchange-tilstand
main

Passiv
false

Send INITIAL_CONTACT
true

Fanen "Proposal"
Parameter
Værdi

Navn
Valgfri (herefter MyPeerProposal)

Auth. Algoritmer
sha512

Krypt. Algoritmer
aes-128-cbc

Levetrid
08:00:00

PFS Gruppe
modp2048

Fanen "Identiteter"
Parameter
Værdi

Peer
MyPeer

Auth. Metode
rsa nøgle

Nøgle
mikrotik.privet.key

Fjernnøgle
server-name.pub.pem

Politikskabelon-gruppe
default

Notrack-kæde
tom

Min ID-type
auto

Fjern ID-type
auto

Match efter
fjern id

Tilstandskonfiguration
tom

Generer politik
nej

Fanen "Politikker — Generelt"
Parameter
Værdi

Peer
MyPeer

Tunnel
true

Src. adresse
192.168.0.0/30

Dest. adresse
192.168.0.0/30

Protokol
255 (alle)

Skabelon
false

Fanen "Politikker — Handling"
Parameter
Værdi

Handling
krypter

Niveau
kræves

IPsec-protokoller
esp

Proposal
MyPeerProposal

Du har sandsynligvis, som jeg, indstillet snat/masquerade på WAN-interface; denne regel skal justeres, så udgående IPsec-pakker sendes i vores tunnel:
Gå til sektionen "IP" - "Firewall".
Fanen "NAT", åbner vores snat/masquerade regel.

Fanen "Avanceret"
Parameter
Værdi

IPsec-politik
out: none

Genstart racoon daemon

sudo systemctl restart racoon

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

Racoon daemon starter op før netværksinterface bliver aktiveret; vi har angivet strict_address som option i listen-sektionen, så vi skal tilføje dette i racoon systemd unit filen.
/lib/systemd/system/racoon.service, в секцию [Unit], строку After=network.target.

Nu bør vores IPsec-tunneller være oppe, vi ser 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, som mikrotik forbinder til"
        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, som mikrotik forbinder til" 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, som mikrotik forbinder til" dst 1.1.1.1
        proto esp reqid 0 mode tunnel

Hvis tunnelerne ikke er oppe, se syslog eller journalctl -u racoon.

Nu skal L3-interface indstilles, så trafik kan dirigeres. Der er forskellige muligheder, vi vil bruge IPIP, da Mikrotik understøtter det, jeg ville have brugt VTI, men desværre er det stadig ikke implementeret i Mikrotik. IPIP adskiller sig ved, at det desuden kan kapsle multicast og tilføje mærker (fwmark) til pakker, som de kan filtreres på i iptables og iproute2 (policy-baseret routing). Hvis maksimal funktionalitet er nødvendig, så for eksempel GRE. Men man må ikke glemme, at vi betaler for ekstra funktionalitet med et større overhead.

Oversigten over tunnelinterfaces kan ses ved at oversætte. 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 ruter til netværk bag Mikrotik tilføjes.

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

For at vores interface og ruter starter efter genstart skal interfacet beskrives i /etc/network/interfaces og der også tilføje ruter i post-up, eller skrive det hele i en fil, for eksempel /etc/ipip-ipsec0.conf og kalde det via post-up, glem ikke filens ejer, rettigheder og gør det eksekverbart.

Under her 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:

Sektionen "Interfaces", tilføj et nyt interface "IP tunnel":

Fanebladet "IP tunnel" - "Generel"
Parameter
Værdi

Navn
Efter eget valg (senere IPIP-IPsec0)

MTU
1480 (hvis ikke angivet, begynder Mikrotik at skære MTU ned til 68)

Lokal adresse
192.168.0.2

Remote Address
192.168.0.1

Ipsec Secret
Deaktiver feltet (ellers oprettes der en ny peer)

Keepalive
Deaktiver feltet (ellers vil interfacet konstant slukke, da Mikrotik har en særlig format for disse pakker, som ikke fungerer med Linux)

DSCP
arv

Dont Fragment
nej

Clamp TCP MSS
true

Allow Fast Path
true

Sektionen "IP" - "Addresses", tilføj adresse:

Parameter
Værdi

Adresse
192.168.0.2/30

Interface
IPIP-IPsec0

Nu kan der tilføjes ruter til netværk bag Linux-maskinen, ved tilføjelse af ruten vil gateway være vores interface IPIP-IPsec0.

PS

Da vores Linux-server fungerer som transit, giver det mening at indstille parameteren Clamp TCP MSS for IPIP interfaces:

Opret filen /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

I netværket bag Mikrotik har jeg nginx (ip 10.10.10.1), gør den tilgængelig fra internettet, tilføj 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
#På Mikrotik, i mangle-tabellen skal du tilføje en rute regel med destination 192.168.0.1 for pakker med kildeadresse 10.10.10.1 og porte 80, 443.

# OpenVPN-serveren fungerer også på Linux 172.16.0.1/24, for kunder der bruger forbindelsen til den som gateway giver vi internetadgang
-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 i iptables, hvis du har aktiveret pakke-filtre.

Vær sund!

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster