Настраиваем маршрутизируемое 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

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

  1. Виталий

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

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