IPIP IPsec VPN-tonnel tussen Linux-masjien en Mikrotik agter NAT-verskaffer

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

  • Eth0 1.1.1.1/32 eksterne IP
  • ipip-ipsec0 192.168.0.1/30 sal ons tonnel wees

Miktoik: CCR 1009, RouterOS 6.46.5

  • Eth0 10.0.0.2/30 interne IP van die verskaffer. Die verskaffer se eksterne NAT IP is dinamies.
  • ipip-ipsec0 192.168.0.2/30 sal ons tonnel wees

Ons sal 'n IPsec-tonnel op 'n Linux-masjien skep met behulp van wasbeer. Ek sal nie die besonderhede beskryf nie, daar is 'n goeie een статья у vvpoloskin.

Installeer die nodige pakkette:

sudo install racoon ipsec-tools

Ons konfigureer wasbeer, dit sal voorwaardelik optree as 'n ipsec-bediener. Aangesien mikrotik in hoofmodus nie 'n bykomende kliëntidentifiseerder kan oordra nie, en die eksterne IP-adres waardeur dit aan Linux koppel dinamies is, sal die gebruik van 'n voorafgedeelde sleutel (wagwoordmagtiging) nie werk nie, aangesien die wagwoord óf met die IP-adres van die verbindende gasheer, of met identifiseerder.

Ons sal magtiging gebruik deur RSA-sleutels te gebruik.

Die wasbeer-demoon gebruik sleutels in die RSA-formaat, en mikrotik gebruik die PEM-formaat. As jy sleutels genereer met behulp van die plainrsa-gen-nutsding wat saam met wasbeer kom, sal jy nie die publieke sleutel vir Mikrotika na PEM-formaat met sy hulp kan omskakel nie - dit skakel net in een rigting om: PEM na RSA. Nóg openssl nóg ssh-keygen kon die gegenereerde sleutel deur plainrsa-gen lees nie, so die omskakeling sal ook nie moontlik wees om hulle te gebruik nie.

Ons sal 'n PEM-sleutel genereer deur openssl te gebruik en dit dan omskep vir wasbeer met 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

Ons sal die ontvangde sleutels in die gids plaas: /etc/racoon/certs/server. Moenie vergeet om die eienaar van die gebruiker onder wie se naam die wasbeer-demoon geloods word (gewoonlik wortel) op 600 toestemmings te stel nie.

Ek sal die mikrotik-opstelling beskryf wanneer u via WinBox verbind.

Laai die bedienernaam.pub.pem-sleutel op na mikrotik: Kieslys "Lêers" - "Laai op".

Maak die "IP"-afdeling oop - "IP sec" - "Sleutels" oortjie. Nou genereer ons sleutels - die "Generate Key" knoppie, voer dan die mikrotika publieke sleutel "Expor Pub. Sleutel", kan jy dit aflaai vanaf die "Lêers"-afdeling, regskliek op die lêer - "Laai af".

Ons voer die wasbeer publieke sleutel, "Import", in die aftreklys van die "Lêernaam"-veld in, ons soek die bediener-naam.pub.pem wat ons vroeër afgelaai het.

Die mikrotik publieke sleutel moet omgeskakel word

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

en plaas dit in die /etc/racoon/certs-lêergids, en moenie van die eienaar en regte vergeet nie.

racoon config met opmerkings: /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 konfigurasie

Keer terug na die "IP"-afdeling - "IPsec"

"Profiele" oortjie
Parameter
Waarde

Naam
Na u goeddunke (by verstek)

Hash-algoritme
sha512

Enkripsie-algoritme
aes-128

DH-groep
modp2048

Proposhal_check
eis

Lewensduur
1d 00:00:00

NAT Traversal
waar (merk die blokkie)

DPD
120

DPD Maksimum mislukking
5

Eweknie-oortjie
Parameter
Waarde

Naam
Na u goeddunke (hierna na verwys as MyPeer)

Adres
1.1.1.1 (IP Linux-masjiene)

Plaaslike adres
10.0.0.2 (IP WAN-koppelvlak mikrotik)

Profiel
verstek

Uitruilmodus
hoof

Passiewe
valse

Stuur INITIAL_CONTACT
waar

Voorstel-oortjie
Parameter
Waarde

Naam
Na u goeddunke (hierna na verwys as MyPeerProposal)

Auth. Algoritmes
sha512

Encr. Algoritmes
aes-128-cbc

Lewensduur
08:00:00

PFS Groep
modp2048

"Identiteite" oortjie
Parameter
Waarde

eweknie
MyPeer

Atuh. Metode
rsa sleutel

Sleutel
mikrotik.privet.key

Afstandsleutel
bedienernaam.pub.pem

Beleidsjabloongroep
verstek

Notrack-ketting
leeg

My ID Tipe
motor

Afgeleë ID Tipe
motor

Pas by
afstand-ID

Moduskonfigurasie
leeg

Genereer beleid
No.

Oortjie "Beleide - Algemeen"
Parameter
Waarde

eweknie
MyPeer

Tunnel
waar

Src. Adres
192.168.0.0/30

Dest. Adres
192.168.0.0/30

Protokol
255 (almal)

Sjabloon
valse

Oortjie "Beleide - Aksie"
Parameter
Waarde

Aksie
Enkripteer

Vlak
versoeker

IPsec-protokolle
ESP

Voorstel
MyPeerProposal

Heel waarskynlik, soos ek, het jy snat/maskerade op jou WAN-koppelvlak gekonfigureer; hierdie reël moet aangepas word sodat uitgaande ipsec-pakkies in ons tonnel gaan:
Gaan na die afdeling "IP" - "Firewall".
"NAT"-oortjie, maak ons ​​snat/maskerade-reël oop.

Gevorderde oortjie
Parameter
Waarde

IPsec-beleid
uit: geen

Herbegin die wasbeerdemoon

sudo systemctl restart racoon

As racoon nie begin met herbegin nie, dan is daar 'n fout in die konfigurasie; in syslog, racoon vertoon inligting oor die reëlnommer waarin die fout opgespoor is.

Wanneer die bedryfstelsel opstart, begin die wasbeer-daemon voordat die netwerkkoppelvlakke na vore gebring word, en ons het die strict_address-opsie in die luisterafdeling gespesifiseer; jy moet die wasbeer-eenheid by die systemd-lêer voeg
/lib/systemd/system/racoon.service, in die [Eenheid]-afdeling, reël After=network.target.

Nou moet ons ipsec-tonnels op wees, kyk na die uitset:

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

As die tonnels nie op is nie, kyk na syslog, of journalctl -u wasbeer.

Nou moet jy L3-koppelvlakke opstel sodat verkeer herlei kan word. Daar is verskillende opsies, ons sal IPIP gebruik, aangesien mikrotik dit ondersteun, sal ek vti gebruik, maar dit is ongelukkig nog nie in mikrotik geïmplementeer nie. Dit verskil van IPIP deurdat dit addisioneel multicast kan inkapsel en fw-merke op pakkies kan plaas, waardeur dit in iptables en iproute2 (beleidgebaseerde roetering) gefiltreer kan word. As jy maksimum funksionaliteit benodig, dan, byvoorbeeld, GRE. Maar moenie vergeet dat ons betaal vir bykomende funksionaliteit met 'n groot oorhoofse kop nie.

U kan die vertaling van 'n goeie resensie van tonnel-koppelvlakke sien 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

Nou kan jy roetes vir netwerke agter mikrotik byvoeg

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

Om ons koppelvlak en roetes te verhoog na 'n herlaai, moet ons die koppelvlak in /etc/network/interfaces beskryf en roetes daar byvoeg in die post-up, of alles in een lêer skryf, byvoorbeeld /etc/ ipip-ipsec0.conf en trek dit deur post-up, moenie vergeet van die lêer eienaar, regte en maak dit uitvoerbaar.

Hieronder is 'n voorbeeldlêer

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

Afdeling "Interfaces", voeg 'n nuwe koppelvlak "IP-tonnel" by:

Oortjie "IP-tonnel" - "Algemeen"
Parameter
Waarde

Naam
Na u goeddunke (hierna verwys as IPIP-IPsec0)

MTU
1480 (indien nie gespesifiseer nie, begin mikrotik mtu na 68 sny)

Plaaslike adres
192.168.0.2

Afgeleë adres
192.168.0.1

IPsec geheim
Deaktiveer die veld (anders sal 'n nuwe eweknie geskep word)

Hou aan die lewe
Deaktiveer die veld (anders sal die koppelvlak voortdurend afskakel, aangesien mikrotika sy eie formaat vir hierdie pakkette het en nie met Linux werk nie)

DSCP
erf

Moenie Fragmenteer nie
No.

Klem TCP MSS
waar

Laat vinnige pad toe
waar

Afdeling "IP" - "Adresse", voeg die adres by:

Parameter
Waarde

Adres
192.168.0.2/30

Interface
IPIP-IPsec0

Nou kan jy roetes by die netwerk voeg agter 'n Linux-masjien; wanneer 'n roete bygevoeg word, sal gateway ons IPIP-IPsec0-koppelvlak wees.

PS

Aangesien ons Linux-bediener transitief is, maak dit sin om die Clamp TCP MSS-parameter vir ipip-koppelvlakke daarop te stel:

skep 'n lêer /etc/iptables.conf met die 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

Ek het nginx wat op die netwerk agter mikrotik (ip 10.10.10.1) loop, maak dit toeganklik vanaf die internet, voeg dit by /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 

Moenie vergeet om die toepaslike toestemmings by iptables te voeg as u pakkiefilters geaktiveer het nie.

Wees gesond!

Bron: will.com

Voeg 'n opmerking