IPIP IPsec VPN tunel između Linux stroja i Mikrotika iza NAT providera

Linux: Ubuntu 18.04.4 LTS (GNU/Linux 4.15.0-91-generički x86_64)

  • Eth0 1.1.1.1/32 vanjski IP
  • ipip-ipsec0 192.168.0.1/30 bit će naš tunel

Miktoik: CCR 1009, RouterOS 6.46.5

  • Eth0 10.0.0.2/30 interni IP od davatelja. Vanjski NAT IP pružatelja je dinamičan.
  • ipip-ipsec0 192.168.0.2/30 bit će naš tunel

Napravit ćemo IPsec tunel na Linux stroju koristeći racoon. Neću opisivati ​​detalje, ima jedan dobar članak у vvpoloskin.

Instalirajte potrebne pakete:

sudo install racoon ipsec-tools

Konfiguriramo racoon, on će uvjetno djelovati kao ipsec poslužitelj. Budući da mikrotik u glavnom načinu rada ne može prenijeti dodatni identifikator klijenta, a vanjska IP adresa preko koje se spaja na Linux je dinamička, korištenje unaprijed dijeljenog ključa (autorizacija lozinke) neće raditi, jer se lozinka mora podudarati ili s IP adresom host za povezivanje ili s identifikatorom.

Koristit ćemo autorizaciju pomoću RSA ključeva.

Racoon daemon koristi ključeve u RSA formatu, a mikrotik koristi PEM format. Ako ključeve generirate pomoću uslužnog programa plainrsa-gen koji dolazi uz racoon, onda uz njegovu pomoć nećete moći konvertirati javni ključ za Mikrotiku u PEM format - on konvertira samo u jednom smjeru: PEM u RSA. Ni openssl ni ssh-keygen nisu mogli pročitati ključ koji je generirao plainrsa-gen, tako da konverzija neće biti moguća niti pomoću njih.

Generirati ćemo PEM ključ koristeći openssl i zatim ga pretvoriti u racoon pomoću 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

Dobivene ključeve ćemo staviti u mapu: /etc/racoon/certs/server. Ne zaboravite postaviti vlasnika korisnika pod čijim se imenom racoon daemon pokreće (obično root) na 600 dopuštenja.

Opisat ću postavku mikrotika pri spajanju preko WinBoxa.

Učitajte ključ server-name.pub.pem na mikrotik: Izbornik “Files” - “Upload”.

Otvorite odjeljak "IP" - "IP sec" - karticu "Ključevi". Sada generiramo ključeve - gumb “Generate Key”, zatim eksportiramo mikrotika javni ključ “Expor Pub. Ključ", možete ga preuzeti iz odjeljka "Datoteke", desnom tipkom miša kliknite datoteku - "Preuzmi".

Uvezemo racoon javni ključ, “Import”, na padajućem popisu polja “File name” tražimo server-name.pub.pem koji smo ranije preuzeli.

Javni ključ mikrotik treba pretvoriti

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

i stavite ga u mapu /etc/racoon/certs, ne zaboravljajući vlasnika i prava.

racoon konfiguracija s komentarima: /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

Povratak na odjeljak "IP" - "IPsec"

Kartica "Profili".
Parametar
Vrijednost

Ime i Prezime
Po vlastitom nahođenju (prema zadanim postavkama)

Hash algoritam
sha512

Algoritam šifriranja
aes-128

DH-Grupa
modp2048

Proposhal_check
tvrditi

Život
1d 00:00:00

NAT prolaz
istinito (označite okvir)

DPD
120

DPD Maksimalni kvar
5

Kartica vršnjaka
Parametar
Vrijednost

Ime i Prezime
Po vašem nahođenju (u daljnjem tekstu MyPeer)

Adresa
1.1.1.1 (IP Linux strojevi)

Lokalna adresa
10.0.0.2 (IP WAN sučelje mikrotik)

Profil
zadani

Način razmjene
glavni

Pasivan
lažan

Pošalji INITIAL_CONTACT
istinski

Kartica prijedloga
Parametar
Vrijednost

Ime i Prezime
Po vašem nahođenju (u daljnjem tekstu MyPeerProposal)

Auth. Algoritmi
sha512

Encr. Algoritmi
aes-128-cbc

Život
08:00:00

Grupa PFS
modp2048

Kartica "Identiteti".
Parametar
Vrijednost

viriti
Moj Peer

Atuh. metoda
ključ RSA

Ključ
mikrotik.privet.key

Daljinski ključ
ime-poslužitelja.pub.pem

Grupa predložaka pravila
zadani

Notrack lanac
prazan

Moja ID vrsta
automobil

Vrsta daljinskog ID-a
automobil

Podudaranje prema
daljinski id

Konfiguracija načina rada
prazan

Generirajte politiku
Ne

Kartica "Pravila - Općenito"
Parametar
Vrijednost

viriti
Moj Peer

Tunel
istinski

Src. Adresa
192.168.0.0/30

odredište Adresa
192.168.0.0/30

Protokol
255 (sve)

predložak
lažan

Kartica "Pravila - radnja"
Parametar
Vrijednost

Akcijski
šifriranje

Nivo
podnositelj zahtjeva

IPsec protokoli
esp

Prijedlog
MyPeerProposal

Najvjerojatnije, poput mene, imate konfiguriran snat/masquerade na svom WAN sučelju; ovo pravilo treba prilagoditi tako da odlazni ipsec paketi idu u naš tunel:
Idite na odjeljak "IP" - "Vatrozid".
Kartica "NAT", otvorite naše pravilo snat/masquerade.

Kartica Napredno
Parametar
Vrijednost

Politika IPsec-a
van: nijedan

Ponovno pokretanje racoon demona

sudo systemctl restart racoon

Ako se racoon ne pokrene nakon ponovnog pokretanja, postoji pogreška u konfiguraciji; u syslogu racoon prikazuje informacije o broju retka u kojem je otkrivena pogreška.

Kada se OS podigne, racoon daemon se pokreće prije nego što se pokažu mrežna sučelja, a mi smo naveli opciju strict_address u odjeljku slušanja; trebate dodati racoon jedinicu u systemd datoteku
/lib/systemd/system/racoon.service, u odjeljku [Jedinica], redak After=network.target.

Sada bi naši ipsec tuneli trebali raditi, pogledajte izlaz:

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

Ako tuneli nisu otvoreni, pogledajte syslog ili journalctl -u racoon.

Sada trebate konfigurirati L3 sučelja tako da se promet može usmjeravati. Ima raznih opcija, koristit ćemo IPIP, pošto mikrotik to podržava, ja bih koristio vti, ali nažalost još nije implementiran u mikrotik. Razlikuje se od IPIP-a po tome što može dodatno enkapsulirati multicast i stavljati fwmarkove na pakete, pomoću kojih se oni mogu filtrirati u iptables i iproute2 (usmjeravanje temeljeno na politici). Ako vam je potrebna maksimalna funkcionalnost, onda, na primjer, GRE. Ali ne zaboravite da dodatnu funkcionalnost plaćamo velikim troškovima.

Možete vidjeti prijevod dobre recenzije tunelskih sučelja ovdje.

Na Linuxu:

# Создаем интерфейс
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

Sada možete dodati rute za mreže iza mikrotika

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

Da bi naše sučelje i rute bile podignute nakon ponovnog pokretanja, moramo opisati sučelje u /etc/network/interfaces i dodati rute tamo u post-up-u ili napisati sve u jednu datoteku, na primjer, /etc/ ipip-ipsec0.conf i povucite ga kroz post-up, ne zaboravite na vlasnika datoteke, prava i učinite je izvršnom.

Ispod je primjer datoteke

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

Na Mikrotiku:

Odjeljak “Sučelja”, dodajte novo sučelje “IP tunel”:

Kartica “IP tunel” - “Općenito”
Parametar
Vrijednost

Ime i Prezime
Po vašem nahođenju (u daljnjem tekstu IPIP-IPsec0)

MTU
1480 (ako nije navedeno, mikrotik počinje rezati mtu na 68)

Lokalna adresa
192.168.0.2

Udaljena adresa
192.168.0.1

IPsec tajna
Deaktiviraj polje (inače će se stvoriti novi peer)

Držati na životu
Deaktivirajte polje (inače će se sučelje stalno gasiti, jer mikrotika ima svoj format za te pakete i ne radi s Linuxom)

DSCP
nasljediti

Nemojte fragmentirati
Ne

Stezaljka TCP MSS
istinski

Dopusti brzi put
istinski

Odjeljak “IP” - “Adrese”, dodajte adresu:

Parametar
Vrijednost

Adresa
192.168.0.2/30

Sučelje
IPIP-IPsec0

Sada možete dodati rute na mrežu iza Linux stroja; kada dodajete rutu, gateway će biti naše IPIP-IPsec0 sučelje.

PS

Budući da je naš Linux poslužitelj tranzitivan, ima smisla postaviti parametar Clamp TCP MSS za ipip sučelja na njemu:

kreirajte datoteku /etc/iptables.conf sa sljedećim sadržajem:

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

i u /etc/network/interfaces
post-up iptables-restore < /etc/iptables.conf

Imam nginx koji radi na mreži iza mikrotika (ip 10.10.10.1), učini ga dostupnim s interneta, dodaj ga u /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 

Ne zaboravite dodati odgovarajuća dopuštenja za iptables ako imate omogućene filtere paketa.

Ostanite zdravi!

Izvor: www.habr.com

Dodajte komentar