IPIP IPsec VPN тунел между Linux машина и Mikrotik зад NAT на доставчика

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

  • Eth0 1.1.1.1/32 външен IP
  • ipip-ipsec0 192.168.0.1/30 ще бъде нашият тунел

Miktoik: CCR 1009, RouterOS 6.46.5

  • Eth0 10.0.0.2/30 вътрешен IP от доставчика. Външният IP на NAT доставчика е динамичен.
  • ipip-ipsec0 192.168.0.2/30 ще бъде нашият тунел

IPsec тунел на Linux машината ще подигнем с racoon. Няма да описвам подробности, има добър статия block vvpoloskin.

Установяваме необходимите пакети:

sudo install racoon ipsec-tools

Настройваме racoon, който условно ще играе ролята на ipsec сървър. Понеже mikrotik в главен режим не може да предава допълнителен идентификатор на клиента, а външният IP адрес, през който той се свързва с Linux, е динамичен, не можем да използваме preshared key (авторизация по парола), тъй като паролата трябва да се съпоставя или с IP адреса на свързващия се хост, или с идентификатора.

Ще използваме авторизация по RSA ключове.

Демонт racoon използва ключове в RSA формат, а mikrotik — в PEM формат. Ако генерираме ключове с утилитата plainrsa-gen, която идва с racoon, няма да можем да конвертираме публичния ключ за Mikrotik в PEM формат с нейна помощ — тя конвертира само в една посока: PEM в RSA. Генерираният plainrsa-gen ключ не можа да бъде прочетен нито от openssl, нито от ssh-keygen, така че и с тях не можем да извършим конвертация.

Ще генерираме PEM ключ с openssl, а след това ще го конвертираме за racoon с помощта на 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

Получените ключове ще сложим в папка: /etc/racoon/certs/server. Не забравяйте да зададете собственик на потребителя, от чие име работи демонът racoon (обикновено root), права 600.

Настройките на mikrotik ще опиша при свързване чрез WinBox.

Ключ server-name.pub.pem ще качим в mikrotik: Меню «Files» — «Upload».

Отваряме раздел «IP» — «IP sec» — таб «Keys». Сега генерираме ключове — бутон «Generate Key», след това експортираме публичния ключ на mikrotik «Export Pub. Key», можем да го изтеглим от раздела «Files», с десен бутон върху файла — «Download».

Импортираме публичния ключ racoon, «Import», в падащото меню на полето «File name» намираме заредения по-рано server-name.pub.pem.

Публичният ключ на mikrotik трябва да бъде конвертиран

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

и да бъде поставен в папка /etc/racoon/certs, не забравяйки за собственика и правата.

Конфигурация на racoon с коментари: /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

Връщаме се в раздел "IP" — "IPsec"

Вкладка "Профили"
Параметър
Стойност

Name
По ваше усмотрение (по подразбиране default)

Алгоритъм за хеширане
sha512

Encryption Algorithm
aes-128

DH-група
modp2048

Proposhal_check
претенция

Времетраене
1d 00:00:00

NAT Traversal
вярно (поставете отметка)

DPD
120

Максимално неуспешно DPD
5

Вкладка "Партньори"
Параметър
Стойност

Name
По ваше усмотрение (по-нататък MyPeer)

Адрес
1.1.1.1 (IP на linux машината)

Локален адрес
10.0.0.2 (IP на WAN интерфейса на mikrotik)

Profile
default

Режим на обмен
main

Пасивен
false

Изпращане на INITIAL_CONTACT
true

Вкладка "Предложение"
Параметър
Стойност

Name
По ваше усмотрение (по-нататък MyPeerProposal)

Алгоритми за аутентификация
sha512

Алгоритми за криптиране
aes-128-cbc

Времетраене
08:00:00

Група PFS
modp2048

Вкладка "Идентичности"
Параметър
Стойност

Партньор
MyPeer

Метод на аутентификация
rsa ключ

Ключ
mikrotik.privet.key

Дистанционен ключ
server-name.pub.pem

Група на шаблони за политика
default

Notrack Chain
празно

Мой ID тип
auto

Дистанционен ID тип
auto

Съвпадение по
дистанционен id

Конфигурация на режима
празно

Генериране на политика
но

Вкладка "Политики — Общи"
Параметър
Стойност

Партньор
MyPeer

Тунел
true

Източников адрес
192.168.0.0/30

Целеви адрес
192.168.0.0/30

Protocol
255 (всички)

Шаблон
false

Вкладка "Политики — Действие"
Параметър
Стойност

Action
encrypt

Level
изисква

IPsec протоколи
esp

Предложение
MyPeerProposal

Скорее всего, на вашите WAN интерфейси имате настроен snat/masquerade, това правило трябва да бъде коригирано, така че изходящите пакети ipsec да преминават през нашия тунел:
Преминаваме в раздел "IP" — "Firewall".
Вкладка "NAT", отворете нашето правило snat/masquerade.

Вкладка "Разширени"
Параметър
Стойност

IPsec политика
изход: none

Рестартиране на демона racoon

sudo systemctl restart racoon

Ако racoon не стартира при рестартиране, значи в конфигурацията има грешка, в syslog racoon изведe информация за номера на реда, на който е открита грешката.

Демонът racoon при стартиране на операционната система стартира преди да са активни мрежовите интерфейси, а ние указахме в секцията listen опцията strict_address, необходимо е да добавим в файла на системния юнит на racoon
/lib/systemd/system/racoon.service, в секцию [Unit], строку After=network.target.

Сега нашите ipsec тунели трябва да се активират, проверете изхода:

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

Ако тунелите не са се активирали, погледнете syslog, или journalctl -u racoon.

Сега трябва да настроим L3 интерфейсите, за да можем да маршрутизираме трафика. Има различни възможности, ще използваме IPIP, тъй като той се поддържа от mikrotik. Бих използвал vti, но за съжаление, все още не е реализиран в mikrotik. IPIP се различава с това, че допълнително може да инкапсулира multicast и да поставя метки (fwmark) на пакетите, по които можем да ги филтрираме в iptables и iproute2 (маршрутизиране на базата на политика). Ако е необходима максимална функционалност, тогава например GRE. Но не трябва да забравяме, че за допълнителната функционалност плащаме с по-голям оверхед.

Можете да видите превод на добър преглед на тунелни интерфейси. тук.

На 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

Сега можем да добавим маршрути за мрежите зад mikrotik.

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

За да нашият интерфейс и маршрути се активират след перезаредване, трябва да опишем интерфейса в /etc/network/interfaces и там също да добавим маршрутите в post-up, или да напишем всичко в един файл, например, /etc/ipip-ipsec0.conf и да го извикаме през post-up, не забравяйте за собственика на файла, правата и да го направите изпълним.

Под кат примера на файла.

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

На Mikrotik:

Раздел «Interfaces» добавяме нов интерфейс «IP tunnel»:

Вкладка «IP tunnel» — «General»
Параметър
Стойност

Name
По ваше усмотрение (нататък IPIP-IPsec0)

MTU
1480 (ако не укажете, то mikrotik започва да реже mtu до 68)

Локален адрес
192.168.0.2

Remote Address
192.168.0.1

Ipsec Secret
Деактивираме полето (в противен случай ще се създаде нов Peer)

Keepalive
Деактивираме полето (в противен случай интерфейсът постоянно ще се изключва, тъй като в mikrotik имат свой формат на тези пакети, който не работи с linux)

DSCP
наследява

Dont Fragment
но

Clamp TCP MSS
true

Allow Fast Path
true

Раздел «IP» — «Addresses», добавяме адрес:

Параметър
Стойност

Адрес
192.168.0.2/30

Интерфейс
IPIP-IPsec0

Сега можем да добавяме маршрути в мрежите зад linux машината, при добавяне на маршрута, gateway ще бъде нашият интерфейс IPIP-IPsec0.

PS

Тъй като нашият linux сървър е транзитен, то на него има смисъл да зададем параметъра Clamp TCP MSS за ipip интерфейсите:

създайте файл /etc/iptables.conf със следното съдържание:

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

и в /etc/network/interfaces
post-up iptables-restore < /etc/iptables.conf

В мрежата зад mikrotik при мен работи nginx (ip 10.10.10.1), правим го достъпен от интернет, ще добавим в /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 

Не забравяйте да добавите съответните разрешения в iptables, ако имате включени филтри за пакети.

Бъдете здрави!

Източник: habr.com

Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри 🔥 Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри | ProHoster