Настраиваем маршрутизируемое IPSec-соединение с использованием IKEv2 и GRE между RouterOS 6.45.5 с динамическим IP-адресом и CentOS 7.7.1908 со статическим IP-адресом
Подключение будет реализовано следующим образом:
- внешний IP-адрес CentOS - 1.1.1.1
- внешний IP-адрес MikroTik - динамический
- внутренний IP-адрес CentOS в туннеле IPSec - 10.1.1.1
- внутренний IP-адрес MikroTik в туннеле IPSec - 10.2.2.2
- внутренний IP-адрес CentOS в туннеле GRE - 192.168.100.1/30
- внутренний IP-адрес MikroTik в туннеле GRE - 192.168.100.2/30
- проверка подлинности будут выполняться на основе сертификатов
Настройка центра сертификации и выпуск сертификатов
Замечание: центр сертификации будет выпускать только сертификаты для работы IPSec и без использования списков отзыва. При этом предполагается, что центр сертификации расположен на некотором другом сервере
- создаем папку /etc/CA/PrivateCA/certs
- mkdir -p /etc/CA/PrivateCA/certs
- создаем пустой файл базы данных
- touch /etc/CA/PrivateCA/database
- генерируем случай номер следующего сертификата
- openssl rand -hex 16 > /etc/CA/PrivateCA/serial
- создаем файл /etc/CA/PrivateCA/main.conf с основными настройками ЦС
-
[default] default_ca = ca_section [ca_section] database = /etc/CA/PrivateCA/database serial = /etc/CA/PrivateCA/serial certificate = /etc/CA/PrivateCA/root.cer private_key = /etc/CA/PrivateCA/root.key RANDFILE = /etc/CA/PrivateCA/rand new_certs_dir = /etc/CA/PrivateCA/certs unique_subject = no copy_extensions = copy default_days = 365 default_md = sha512 name_opt = RFC2253 policy = policy_section [policy_section] commonName = supplied [req] default_bits = 8192 encrypt_key = yes utf8 = yes string_mask = utf8only distinguished_name = dn_section prompt = yes [dn_section] commonName = "CN=" commonName_default = "SomeCommonName" [ca_ext_section] subjectKeyIdentifier = hash basicConstraints = critical,CA:true,pathlen:0 keyUsage = critical,digitalSignature,keyCertSign [server_ext_section] subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always basicConstraints = critical,CA:false keyUsage = critical,digitalSignature,keyEncipherment extendedKeyUsage = clientAuth,serverAuth
- создаем запрос сертификата центра сертификации
- openssl req -new -config /etc/CA/PrivateCA/main.conf -out /etc/CA/PrivateCA/root.csr -keyout /etc/CA/PrivateCA/root.key -extensions ca_ext_section
- создаем самоподписанный сертификат центра сертификации
- openssl ca -selfsign -config /etc/CA/PrivateCA/main.conf -in /etc/CA/PrivateCA/root.csr -out /etc/CA/PrivateCA/root.cer -extensions ca_ext_section -days 1825
- создаем запрос сертификата для CentOS
- openssl req -new -config /etc/CA/PrivateCA/main.conf -out /root/pki/hub_ipsec.csr -keyout /root/pki/hub_ipsec.key -extensions server_ext_section
- выпускаем сертификат для CentOS
- openssl ca -config /etc/CA/PrivateCA/main.conf -in /root/pki/hub_ipsec.csr -out /root/pki/hub_ipsec.cer -extensions server_ext_section
- создаем запрос сертификата для MikroTik
- openssl req -new -config /etc/CA/PrivateCA/main.conf -out /root/pki/spoke_ipsec.csr -keyout /root/pki/spoke_ipsec.key -extensions server_ext_section
- выпускаем сертификат для MikroTik
- openssl ca -config /etc/CA/PrivateCA/main.conf -in /root/pki/spoke_ipsec.csr -out /root/pki/spoke_ipsec.cer -extensions server_ext_section
- копируем файлы root.cer, hub_ipsec.cer, spoke_ipsec.cer на CentOS и на MikroTik, файл hub_ipsec.key - только на CentOS, а файл spoke_ipsec.key - только на MikroTik
Настройка CentOS
- в файл /etc/sysctl.conf добавляем
-
net.ipv4.ip_forward=1 net.ipv4.conf.eth0.rp_filter=0 net.ipv4.conf.all.rp_filter=0 net.ipv4.conf.default.rp_filter=0 net.ipv4.conf.default.send_redirects=0 net.ipv4.conf.default.accept_redirects=0
- Замечание 1: о необходимости использования данных параметров (всех, кроме первого, который необходим для включения маршрутизации IPv4-пакетов) говорится при проверке работы Libreswan с помощью команды ipsec verify
- Замечание 2: просмотреть, например, значение параметра net.ipv4.ip_forward можно командой cat /proc/sys/net/ipv4/ip_forward
- устанавливаем Libreswan
- yum install libreswan
- останавливаем службу IPSec
- systemctl stop ipsec
- удаляем текущую базу данных NSS
- rm /etc/ipsec.d/*db
- инициализируем новую базу данных NSS
- ipsec initnss
- создаем файл /etc/ipsec.d/main.conf
-
conn hub_spoke left=1.1.1.1 leftcert=hub leftrsasigkey=%cert leftid=%fromcert leftsubnet=10.1.1.1/32 leftsourceip=10.1.1.1 right=%any rightcert=spoke rightrsasigkey=%cert rightid=%fromcert rightsubnet=10.2.2.2/32 ikev2=insist ike=aes256-sha512;ecp_521 esp=aes256-sha512;ecp_521 type=tunnel authby=rsasig auto=start
- Замечание: таким образом, при установлении соединения loopback-интерфейсу будет добавлен IP-адрес 10.1.1.1, а в таблицу маршрутизации - соответствующий маршрут к хосту 10.2.2.2
- настраиваем права доступа к файлу /etc/ipsec.d/main.conf
- chmod 600 /etc/ipsec.d/main.conf
- включаем автоматический запуск Libreswan при старте системы
- systemctl enable ipsec
- создаем файл /etc/sysconfig/network-scripts/ifcfg-spoke
-
DEVICE=spoke BOOTPROTO=none ONBOOT=yes TYPE=GRE PEER_OUTER_IPADDR=10.2.2.2 MY_OUTER_IPADDR=10.1.1.1 MY_INNER_IPADDR=192.168.100.1/30 MTU=1398
- разрешаем IPSec-трафик и GRE-трафик только поверх IPSec (на примере входящего трафика)
-
iptables -A INPUT -i eth0 -p udp -m udp --dport 500 -j ACCEPT
iptables -A INPUT -i eth0 -p udp -m udp --dport 4500 -j ACCEPT
iptables -A INPUT -i eth0 -p esp -j ACCEPT
iptables -A INPUT -i eth0 -p gre -m policy --dir in --pol ipsec -j ACCEPT
iptables -A INPUT -i eth0 -p gre -j DROP - объединяем сертификат и закрытый ключ в PKCS12-файл
- openssl pkcs12 -export -in hub_ipsec.cer -inkey hub_ipsec.key -name "hub" -out hub_ipsec.p12
- импортируем сертификат ЦС
- certutil -A -i root.cer -n "Private CA" -t "CT,," -d sql:/etc/ipsec.d
- импортируем сертификат и закрытый ключ CentOS
- ipsec import hub_ipsec.p12
- Замечание: извлечь закрытый ключ из базы данных NSS можно командами
pk12util -o hub_ipsec.p12 -d sql:/etc/ipsec.d/ -n hub
openssl pkcs12 -in hub_ipsec.p12 -out hub_ipsec.key - импортируем сертификат Mikrotik
- certutil -A -i spoke_ipsec.cer -n "spoke" -t ",," -d sql:/etc/ipsec.d
- запускаем службу IPSec
- systemctl start ipsec
Настройка Mikrotik
- устанавливаем сертификат ЦС
- certificate import file-name=root.cer
- устанавливаем сертификат CentOS
- certificate import file-name=hub_ipsec.cer
- устанавливаем сертификат Mikrotik
- certificate import file-name=spoke_ipsec.cer
- устанавливаем закрытый ключ Mikrotik
- certificate import file-name=spoke_ipsec.key passphrase=
- создаем профиль IPSec
- ip ipsec profile add name="profile1" dh-group=ecp521 enc-algorithm=aes-256 hash-algorithm=sha512
- создаем узел IPSec
- ip ipsec peer add name="peer1" profile=profile1 address=1.1.1.1 exchange-mode=ike2 send-initial-contact=yes
- создаем предложение IPSec
- ip ipsec proposal add name="proposal1" auth-algorithms=sha512 enc-algorithms=aes-256-cbc pfs-group=ecp521
- создаем политику IPSec
- ip ipsec policy peer=peer1 proposal=proposal1 tunnel=yes ipsec-protocols=esp sa-src-address=0.0.0.0 sa-dst-address=1.1.1.1 src-address=10.2.2.2/32 dst-address=10.1.1.1/32 protocol=all src-port=any dst-port=any action=encrypt level=require
- создаем правило проверки подлинности IPSec
- ip ipsec identity add peer=peer1 auth-method=digital-signature match-by=certificate certificate=spoke_ipsec.cer_0 remote-certificate=hub_ipsec.cer_0
- создаем loopback-интерфейс
- interface bridge add name=loopback
- назначаем loopback-интерфейсу IP-адрес
- ip address add interface=loopback address=10.2.2.2
- создаем GRE-туннель
- interface gre add name="hub" local-address=10.2.2.2 remote-address=10.1.1.1
- Замечание: keepalive-сообщения должны быть выключены - в таком случае интерфейс всегда находится в активном состоянии
- назначаем адрес GRE-интерфейсу
- ip address add interface="hub" address=192.168.100.2/30
- разрешаем IPSec-трафик и GRE-трафик только поверх IPSec (на примере исходящего трафика)
-
ip firewall filter add chain=output out-interface=ether1 protocol=udp dst-port=500,4500 action=accept
ip firewall filter add chain=output out-interface=ether1 protocol=ipsec-esp action=accept
ip firewall filter add chain=output out-interface=ether1 protocol=gre ipsec-policy=out,ipsec action=accept
ip firewall filter add chain=output out-interface=ether1 protocol=gre action=drop
достойная статья..
а можете ее актуализировать до 2022 года..
с последней centos7 и свежим микротом
цены бы не было ей....