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. Не описуватиму подробиці, є хороша стаття у vvpoloskin.

Встановлюємо необхідні пакети:

sudo install racoon ipsec-tools

Налаштовуючи racoon, він умовно виступатиме в ролі ipsec сервера. Так як mikrotik в main режимі не може передавати додатковий ідентифікатор клієнта, а зовнішній ip адрес через який він коннектиться до Linux динамічний, використовувати preshared key (авторизацію по паролю) не вийде, так як пароль повинен зіставлятися або з ip адресою хоста, що підключається, або з ідентифікатором.

Будемо використовувати авторизацію за ключами RSA.

Демон racoon використовує ключі у форматі RSA, а mikrotik – у форматі PEM. Якщо генерувати ключі утилітою plainrsa-gen, яка йде разом з racoon, то конвертувати публічний ключ для Mikrotika у формат 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, потім експортуємо публічний ключ mikrotika «Expor 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"

Вкладка "Profiles"
Параметр
значення

ІМ'Я
На ваш розсуд (за замовчуванням default)

Алгоритм хешування
sha512

Алгоритм шифрування
AES-128

DH-Group
modp2048

Proposhal_check
стверджувати

Тривалість Життя
1 день 00:00:00

Обхід NAT
true (ставимо галочку)

DPD
120

DPD Maximum failure
5

Вкладка "Peers"
Параметр
значення

ІМ'Я
На ваш розсуд (далі MyPeer)

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

Місцева адреса
10.0.0.2 (IP WAN інтерфейсу mikrotik)

профіль
дефолт

Режим обміну
основний

Пасивний
false

Send INITIAL_CONTACT
правда

Вкладка "Proposal"
Параметр
значення

ІМ'Я
На ваш розсуд (далі MyPeerProposal)

Auth. Algorithms
sha512

Encr. Algorithms
aes-128-cbc

Тривалість Життя
08:00:00

ПФС Груп
modp2048

Вкладка "Identities"
Параметр
значення

Груша
MyPeer

Atuh. Method
rsa key

ключ
mikrotik.privet.key

Віддалений ключ
server-name.pub.pem

Policy Tamplate Group
дефолт

Notrack Chain
порожньо

My ID Type
автоматичний

Тип віддаленого ідентифікатора
автоматичний

Match By
віддалений ідентифікатор

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

Generate Policy
немає

Вкладка "Policies - General"
Параметр
значення

Груша
MyPeer

Тунель
правда

Src. Address
192.168.0.0/30

Дест. Адреса
192.168.0.0/30

протокол
255 (усі)

шаблон
false

Вкладка "Policies - Action"
Параметр
значення

дію
шифрувати

рівень
requier

IPsec Protocols
особ

пропозиція
MyPeerProposal

Швидше за все у вас, як і у мене, на WAN інтерфейсі налаштований snat/masquerade, це правило треба скоригувати, щоб вихідні пакети ipsec йшли в наш тунель:
Переходимо до розділу "IP" - "Firewall".
Вкладка "NAT", відкриваємо наше правило snat/masquerade.

Вкладка Advanced
Параметр
значення

IPsec Policy
out: none

Рестартуємо демона racoon

sudo systemctl restart racoon

Якщо при рестарті racoon не запускається, значить в конфізі є помилка, syslog racoon виводить інформацію про номер рядка, в якій виявлена ​​помилка.

Демон racoon при завантаженні ОС стартує раніше підняття мережевих інтерфейсів, а ми вказали в секції listen опцію strict_address, необхідно додати у файл systemd юніту 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 (policy-based routing). Якщо потрібна максимальна функціональність, тоді, наприклад, 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"
Параметр
значення

ІМ'Я
На ваш розсуд (далі IPIP-IPsec0)

MTU
1480 (якщо не вказувати, mikrotik починає різати mtu до 68)

Місцева адреса
192.168.0.2

Віддалена адреса
192.168.0.1

Ipsec Secret
Деактивуємо поле (інакше буде створено новий Peer)

Залишатися живим
Деактивуємо поле (інакше інтерфейс постійно вимикатиметься, тому що у mikrotika якийсь свій формат цих пакетів і з linux не працює)

DSCP
наслідувати

Dont Fragment
немає

Clamp TCP MSS
правда

Allow Fast Path
правда

Розділ "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

Додати коментар або відгук