Кто бы мог подумать, что развернуть часть серверов компании в Amazon было плохой идеей.

В итоге поставленная задача — сделать дополнительный VPN-туннель между Amazon и инфраструктурой в РФ.

image

Кроме простого how-to опишу несколько особенностей в настройке, с которыми можно столкнуться.

  1. Настройка файрвола и роутинга


    Покупаем у пока еще не заблокированного хостера VPS за сумму, эквивалентную 10 000 монгольских тугриков в месяц, ставим CentOS 7, включаем пересылку пакетов

    echo net.ipv4.ip_forward=1 >>/etc/sysctl.d/ipv4.forward.enable.conf
    sysctl -a
    

    Добавляем в файрволе правила для приема пакетов IPsec

    firewall-cmd --zone=dmz --permanent --add-rich-rule='rule protocol value="esp" accept'
    firewall-cmd --zone=dmz --permanent --add-port=500/udp
    firewall-cmd --zone=dmz --permanent --add-port=4500/udp
    firewall-cmd --permanent --add-service="ipsec"
    firewall-cmd --reload
    firewall-cmd --list-all

  2. Настройка StrongSwan


    Устанавливаем демон IPsec StrongSwan:

    yum install -y epel-release
    yum install -y strongswan
    

    Делаем предварительные настройки в /etc/strongswan.d/charon.conf:

    charon {
        # Понадобится при использовании с Cisco IKEv2
        make_before_break = yes
        # Необходимо для работы с туннелями
        install_routes = no
    }

    Настройка Strongswan может быть проведена двумя способами.

    • Старый способ, использующий демон strongswan, уже достаточно хорошо описан:


      Файл конфигурации

      /etc/strongswan/ipsec.conf

      Файл с паролями и сертификатами:

      /etc/ipsec.secrets

      Остановка службы:

      systemctl stop strongswan

    • Новый способ, использующий демон charon, появившийся в версии 5.2.0:


      Вся конфигурация хранится в /etc/strongswan/swanctl/swanctl.conf

      Рассмотрим два варианта настройки демона charon:

      1. Одинаковые настройки аутентификации и шифрования для всех. Сделаем разными только PSK:


        connections {
         ToWorld {
          local_addrs = 10.3.3.1
          version = 1
          proposals = aes256-sha1-modp1536
          reauth_time = 1440m
          local {
           auth = psk
          }
          remote {
           auth = psk
          }
          children {
           ToWorld-1 {
            local_ts = dynamic[gre]
            remote_ts = dynamic[gre]
            mode = transport
            esp_proposals = aes128-sha1-modp1536
            rekey_time = 60m
            start_action = trap
            dpd_action = restart
           }
          }
         }
        }
        secrets {
         ike-To-2951
         {
          id = 1.1.1.1
          secret = "etokto2ttakoimohnatenkyi"
         }
         ike-To-CSR1000V
         {
          id = 2.2.2.2
          secret = "zdorovkakzhiznkasamзpro100klass"
         }
        }

      2. Индивидуальные настройки аутентификации и шифрования:


        connections {
         To2951 {
          encap = no
          remote_addrs = 1.1.1.1
          version = 1
          proposals = aes256-sha1-modp1536
          reauth_time = 1440m
          fragmentation = yes
          local-1 {
           auth = psk
           id = 10.3.3.1
          }
          remote-1 {
           auth = psk
          }
          children {
           To2951-1 {
            local_ts = 10.3.3.1/32[gre]
            remote_ts = 1.1.1.1/32[gre]
            mode = transport
            esp_proposals = aes128-sha1-modp1536
            rekey_time = 60m
            start_action = start
            dpd_action = restart
           }
          }
         }
         ToCSR1000V {
          encap = no
          remote_addrs = 2.2.2.2
          version = 1
          proposals = aes256-sha1-modp1536
          reauth_time = 1440m
          fragmentation = yes
          local-1 {
           auth = psk
           id = 10.3.3.1
          }
          remote-1 {
           auth = psk
          }
          children {
           ToCSR1000V-1 {
            local_ts = 10.3.3.1/32[gre]
            remote_ts = 2.2.2.2/32[gre]
            mode = transport
            esp_proposals = aes128-sha1-modp1536
            rekey_time = 60m
            start_action = start
            dpd_action = restart
           }
          }
         }
        }
        secrets {
         ike-To-2951 
         {
          id-1 = 1.1.1.1
          secret = "etokto2ttakoimohnatenkyi"
         }
         ike-To-CSR1000V
         {
          id-1 = 2.2.2.2
          secret = "zdorovkakzhiznkasamзpro100klass"
         }
        }
        

    Включаем службу

    sudo systemctl enable strongswan-swanctl
    sudo systemctl start strongswan-swanctl
    

  3. Поднятие туннелей с маршрутизаторами Cisco


    • Настраиваем GRE-туннели в CentOS


      Создаем /etc/sysconfig/network-scripts/ifcfg-Tunnel13

      NAME=Tunnel13
      DEVICE=Tunnel13
      ONBOOT=yes
      STARTMODE=onboot
      BOOTPROTO=none
      TYPE=GRE
      PEER_OUTER_IPADDR=1.1.1.1
      PEER_INNER_IPADDR=172.16.130.2/30
      MY_INNER_IPADDR=172.16.130.1/30
      MY_OUTER_IPADDR=10.3.3.1
      ZONE=trusted
      TTL=30
      MTU=1400
      

      Создаем /etc/sysconfig/network-scripts/ifcfg-Tunnel23

      NAME=Tunnel23
      DEVICE=Tunnel23
      ONBOOT=yes
      STARTMODE=onboot
      BOOTPROTO=none
      TYPE=GRE
      PEER_OUTER_IPADDR=2.2.2.2
      PEER_INNER_IPADDR=172.16.230.2/30
      MY_INNER_IPADDR=172.16.230.1/30
      MY_OUTER_IPADDR=10.3.3.1
      ZONE=trusted
      TTL=30
      MTU=1400
      

      В настройке GRE-интерфейсов есть пара особенностей.

      Первая — необходимо уменьшить MTU для корректного прохождения пакетов.

      Второе — указать TTL, это понадобится в будущем, когда будем настраивать OSPF. Если этого не сделать, пакеты OSPF будут приходить на удаленный хост с TTL, равным единице (из-за GRE over IPsec), оставаясь без ответа. Соответственно устройства будут висеть в состоянии INIT/DROTHER, связности мы не дождемся. При этом корректные ответы ICMP могут сбить с толку.

      Поднимаем интерфейсы

      ifup Tunnel13
      ifup Tunnel23
      

    • Создаем туннель на Cisco 2951


      crypto keyring StrongSwanKeyring
        pre-shared-key address 3.3.3.1 key etokto2ttakoimohnatenkyi
      
      crypto isakmp policy 60
       encr aes 256
       authentication pre-share
       group 5
      
      crypto isakmp identity address
      
      crypto isakmp profile StrongSwanIsakmpProfile
         keyring StrongSwanKeyring
         match identity address 3.3.3.1
       
      crypto ipsec transform-set StrongSwanTransformSet esp-aes esp-sha-hmac
       mode transport
      
      crypto ipsec profile StrongSwanIpsecProfile
       set transform-set StrongSwanTransformSet
       set pfs group5
       set isakmp-profile StrongSwanIsakmpProfile
      
      interface Tunnel13
       ip address 172.16.130.2 255.255.255.252
       tunnel source GigabitEthernet2
       tunnel destination 3.3.3.1
       tunnel protection ipsec profile StrongSwanIpsecProfile
      

    • Создаем туннель на Cisco CSR1000V


      crypto keyring StrongSwanKeyring
        pre-shared-key address 3.3.3.1 key etokto2ttakoimohnatenkyi
      
      crypto isakmp policy 60
       encr aes 256
       authentication pre-share
       group 5
      
      crypto isakmp identity address
      
      crypto isakmp profile StrongSwanIsakmpProfile
         keyring StrongSwanKeyring
         match identity address 3.3.3.1
       
      crypto ipsec transform-set StrongSwanTransformSet esp-aes esp-sha-hmac
       mode transport
      
      crypto ipsec profile StrongSwanIpsecProfile
       set transform-set StrongSwanTransformSet
       set pfs group5
       set isakmp-profile StrongSwanIsakmpProfile
      
      interface Tunnel23
       ip address 172.16.230.2 255.255.255.252
       tunnel source GigabitEthernet2
       tunnel destination 3.3.3.1
       tunnel protection ipsec profile StrongSwanIpsecProfile


    Проверяем, что туннели поднялись, шифрование работает.

    На CentOS

    strongswan statusall

    На Cisco

    show crypto session detail

  4. Настройка динамической маршрутизации на Quagga


    Если вы используете динамическую маршрутизацию на основе OSPF, то следующим шагом логично было бы поднять демон OSPF на CentOS, настроив новые туннели в качестве резервного маршрута.

    • Настройка OSPF на CentOS


      В качестве демона установим Quagga:

      yum install -y quagga

      Создаем конфигурационный файл демона /etc/quagga/zebra.conf

      hostname StrongSwanServer
      log file /var/log/quagga/quagga.log
      !
      interface Tunnel13
       ip address 172.16.130.1/30
      !
      interface Tunnel23
       ip address 172.16.230.1/30
      !
      

      Вес пути можно регулировать параметрами cost либо bandwidth, устанавливая их на нужных интерфейсах.

      Устанавливаем права и включаем службу

      
      chown quagga:quaggavt /etc/quagga/zebra.conf
      systemctl enable zebra.service 
      systemctl start zebra.service

      Создаем конфигурационный файл демона /etc/quagga/ospfd.conf

      log file /var/log/quagga/ospfd.log
      !
      router ospf
       ospf router-id 10.3.3.1
       passive-interface default
       no passive-interface Tunnel13
       no passive-interface Tunnel23
       network 172.16.130.0/30 area 0.0.0.0
       network 172.16.230.0/30 area 0.0.0.0

      Устанавливаем права и включаем службу

      
      chown quagga:quaggavt /etc/quagga/ospfd.conf
      systemctl enable ospfd.service 
      systemctl start ospfd.service

      Далее можем запустить терминал vtysh и работать с Quagga в циско-подобном интерфейсе, например:

      vtysh
      show running-config

    • Настройка OSPF на Cisco 2951


      router ospf 1
       passive-interface default
       no passive-interface Tunnel12
       no passive-interface Tunnel13
       no passive-interface GigabitEthernet1
       network 192.168.1.0 0.0.0.255 area 0
       network 172.16.120.0 0.0.0.3 area 0
       network 172.16.130.0 0.0.0.3 area 0
      

    • Настройка OSPF на Cisco CSR1000V


       router ospf 1
       passive-interface default
       no passive-interface Tunnel12
       no passive-interface Tunnel23
       no passive-interface GigabitEthernet1
       network 192.168.2.0 0.0.0.255 area 0
       network 172.16.120.0 0.0.0.3 area 0
       network 172.16.230.0 0.0.0.3 area 0


    Проверяем видимость соседей и пришедшие маршруты на CentOS:

    vtysh
    show ospf neighbor
    show ip ospf route
    

    и на Cisco:

    show ospf neighbor
    show ip ospf route

  5. Что осталось нерассмотренным


    Я описал самый простой вариант. Конечно же, вы настроите обмен ключами, используя IKE v2, авторизацию по сертификату, добавите в файрвол дополнительную фильтрацию по адресам, сделаете OSPF с авторизацией и, при большом количестве маршрутизаторов, с разделением на area, измените значения hello-interval и dead-interval на интерфейсах.

    Буду рад советам в комментариях, а информации об опечатках — в личку. Спасибо за внимание.

Комментарии (8)


  1. Pave1
    27.04.2018 11:14

    Вот если бы Вы написали тут скрипт, который бы автоматически на регулярной основе правил на кваге настройку анонсов заблокированных роскомнадзором префиксов интересующих сервисов — вот это было бы круто. Хотя, учитывая их текущее колличество в настоящий момент — так не долго и сеть завалить (((( А гонять весь трафик через облако — дело не хитрое.


    1. darken99
      27.04.2018 12:22
      +1

      Вот тут есть то что вам надо


  1. mihmig
    27.04.2018 13:44

    Зачем же Вы плодите неправильные подходы:
    sed -i 's/#net.ipv4.ip_forward=1/net.ipv4.ip_forward=1/g' /etc/sysctl.conf
    для кого стараются разработчики дистрибутивов:
    echo net.ipv4.ip_forward=1 >>/etc/sysctl.s/ipv4.forvard.enable.conf


    1. iluvar Автор
      27.04.2018 14:05

      Михаил, спасибо за дополнение. Включение форвардинга смотрел на официальном Wiki разработчиков CentOS
      wiki.centos.org/TipsAndTricks/IPForwarding
      В дистрибутиве CentOS 7 нет каталога /etc/sysctl.s

      Если вы имели ввиду

      echo net.ipv4.ip_forward=1 >>/etc/sysctl.d/ipv4.forward.enable.conf

      то поясните подробнее, в чем преимущество, поправлю в статье


      1. alex_www
        27.04.2018 19:37
        +1

        Не автор, но /etc/sysctl.conf устанавливается пакетным менеджером и может быть перезаписан yum/apt
        (предупреждение есть, но кто ж их читает), потому лучше в отдельеный файл в /etc/sysctl.d


        1. iluvar Автор
          27.04.2018 19:44

          логично, спасибо вам обоим, сейчас поправлю


  1. gto
    27.04.2018 18:18

    Если туннель только для обхода блокировок, зачем в нём ipsec? Или я не правильно понял задачу?


    1. iluvar Автор
      27.04.2018 18:40

      В Amazon находится часть серверов компании, туннель связывает их с серверами в РФ.