Настраиваем маршрутизируемое IPSec-соединение с использованием IKEv2 и GRE между MikroTik RouterOS и CentOS

версия CentOS - 7.7.1908

версия MikroTik RouterOS - 6.45.5

внешний 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

У этой записи один комментарий

  1. Виталий

    достойная статья..
    а можете ее актуализировать до 2022 года..
    с последней centos7 и свежим микротом
    цены бы не было ей....

Добавить комментарий