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 .
Установяваме необходимите пакети:
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
