Введение

Технология IPsec VPN позволяет построить туннель для передачи трафика серых (приватных) сетей через публичный интернет. При этом используется шифрование данных для их защиты, за счет чего и достигается безопасность. Чаще всего VPN на базе IPsec используют для site-to-site подключений, когда необходимо соединить две географически разнесенных сети, например, в двух разных дата-центрах, и нет возможности построить VPN по выделенным каналам связи.

В этой статье покажем, как запускать виртуальную машину с VPN IPsec для маршрутизации трафика из облачной сети в удаленную точку подключения. В примере используем демон strongSwan. Во второй части разберем пример отказоустойчивой схемы с двумя виртуальными машинами VPN IPsec.

Исходные данные

  • виртуальная машина запущенная на образе Ubuntu 20.04 с двумя портами,
  • первый порт виртуальной машины подключен к публичной сети (и используется как default route),
  • второй порт подключен к приватной сети, которую необходимо маршрутизировать,

Облачный сервер

Разверните виртуальную машину в пару кликов.
Создать

Предполагаемая схема настройки и адресация выглядит следующим образом:

Эта схема без отказоустойчивости, так как инстанс VPN один и в случае его отказа сеть перестанет работать. В этой статье предполагается что у вас уже есть левая часть схемы, то есть VPN инстанс в другом облаке с настроенной виртуальной машиной или инстансом IPsec.

На стороне Selectel у вашей виртуальной машины для IPsec настроено два порта с адресами 188.68.206.154 и 192.168.10.10 для публичной и приватной сети соответственно.

Настройка VPN с одним инстансом

Подключаемся к виртуальной машине по SSH и начинаем настройку. Первым делом необходимо установить демон strongSwan и включить его в автозагрузку:

    sudo apt update
sudo apt install -y strongswan
sudo systemctl enable strongswan-starter

Далее необходимо включить маршрутизацию пакетов между интерфейсами, так как наша виртуальная машина будет служить шлюзом для приватной сети и отправлять трафик через публичную сеть с шифрованием.

    sudo cat << EOF > /etc/sysctl.d/99-vpn-ipsec.conf
net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
EOF
sudo sysctl -p /etc/sysctl.d/99-vpn-ipsec.conf

Эти команды создают конфигурационный файл sysctl и применяют его.

Далее нам необходимо создать основной конфигурационный файл IPsec для strongSwan:

    sudo cat << EOF > /etc/ipsec.conf
config setup
        charondebug="all"
        uniqueids=yes
        strictcrlpolicy=no

conn site-to-site-vpn
        type=tunnel
        authby=secret
        left=%defaultroute
        leftid=188.68.206.154
        leftsubnet=192.168.10.0/24
        right=51.250.46.166
        rightsubnet=192.168.20.0/24
        ike=aes256-sha2_256-modp1024!
        esp=aes256-sha2_256!
        keyingtries=0
        ikelifetime=1h
        lifetime=8h
        dpddelay=30
        dpdtimeout=120
        dpdaction=restart
        auto=start
EOF

Важные опции, которые требуют настройки в зависимости от вашего окружения и используемых адресов:

leftid — публичный адрес самой виртуальной машины IPsec, в нашем случае это 188.68.206.154, в другом окружении адрес будет другим;
leftsubnet — приватная сеть. Это сеть, которая создана в облаке Selectel для других виртуальных машин. Из нее необходимо иметь доступ к виртуальным машинам в другом облаке;
right — публичный адрес удаленной виртуальной машины, то есть в нашем случае 51.250.46.166;
rightsubnet — удаленная приватная сеть. Это сеть, которая была создана в другом облаке и используется там для виртуальных машин.

Подробнее по остальным опциям можно почитать в официальной документации.

После создания основного файла конфигурации необходимо также создать файл с секретом, который будет содержать пароль для подключения:

sudo cat << EOF > /etc/ipsec.secrets
188.68.206.154 51.250.46.166 : PSK "<SECRET>"
EOF

Где <SECRET> — пароль, указанный с обеих сторон тоннеля, то есть на обеих виртуальных машинах VPN IPsec.

Перезагружаем IPsec демон и проверяем статус подключения:

    sudo systemctl restart strongswan-starter
ipsec status

Настройка отказоустойчивой схемы

Так выглядит отказоустойчивая схема.

В отличии от предыдущей схемы, в качестве IP-адреса шлюза в приватной сети и в качестве основного адреса для VPN-туннеля будут использоваться VIP-адреса. Они будут перемещаться между виртуальными машинами с помощью VRRP.

Чтобы настроить отказоустойчивую схему, необходимо запустить еще одну такую же виртуальную машину для VPN. Будем ее называть vpn2, а первую виртуальную машину — vpn1.

Далее на второй виртуальной машине воспроизводятся те же базовые настройки, что и на первой:

    sudo apt update
sudo apt install -y strongswan
sudo systemctl enable strongswan-starter
sudo cat << EOF > /etc/sysctl.d/99-vpn-ipsec.conf
net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
EOF
sudo sysctl -p /etc/sysctl.d/99-vpn-ipsec.conf

Перед IPsec необходимо настроить VRRP с помощью демона keepalived. Устанавливаем эту службу:

    sudo apt install -y keepalived

Настраиваем VRRP-конфигурацию так, чтобы:

  • оба VIP перемещались одновременно, были в одной группе;
  • при смене статуса инстанса с MASTER на BACKUP и обратно необходимо, чтобы IPsec выключался и включался соответственно, так как туннель должен быть построен только от одной виртуальной машины в один момент времени.

Настраиваем VRRP на виртуальной машине vpn2:

sudo cat << EOF > /usr/local/sbin/notify-ipsec.sh
#!/bin/bash
TYPE=\$1
NAME=\$2
STATE=\$3
case \$STATE in
        "MASTER") /usr/sbin/ipsec restart
                  ;;
        "BACKUP") /usr/sbin/ipsec stop
                  ;;
        "FAULT")  /usr/sbin/ipsec stop
                  exit 0
                  ;;
        *)        /usr/bin/logger "ipsec unknown state"
                  exit 1
                  ;;
esac
EOF
sudo chmod a+x /usr/local/sbin/notify-ipsec.sh
sudo cat << EOF > /etc/keepalived/keepalived.conf
vrrp_sync_group G1 {
    group {
        EXT
        INT
    }
    notify "/usr/local/sbin/notify-ipsec.sh"
}

vrrp_instance INT {
    state BACKUP
    interface eth1
    virtual_router_id 11
    priority 25
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass <SECRET>
    }
    virtual_ipaddress {
        192.168.120.100/24
    }
    nopreempt
    garp_master_delay 1
}

vrrp_instance EXT {
    state BACKUP
    interface eth0
    virtual_router_id 22
    priority 25
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass <SECRET>
    }
    virtual_ipaddress {
        188.68.206.158/29
    }
    nopreempt
    garp_master_delay 1
}
EOF

Эти команды создают два файла:

  • /usr/local/sbin/notify-ipsec.sh — скрипт, который будет вызываться при смене статуса VRRP и будет выключать/включать IPsec;
  • /etc/keepalived/keepalived.conf — файл конфигурации keepalived для двух групп.

Далее необходимо перезагрузить keepalived и включить его в автозапуске:

    sudo systemctl restart keepalived
sudo systemctl enable keepalived

После этого можно приступать к настройке IPsec на vpn2. Конфигурационный файл теперь будет немного другим, так как туннель должен строиться с VIP-адреса, а не с адреса на интерфейсе.

    sudo cat << EOF > /etc/ipsec.conf
config setup
        charondebug="all"
        uniqueids=yes
        strictcrlpolicy=no

conn site-to-site-vpn
        type=tunnel
        authby=secret
        left=%defaultroute
        leftid=188.68.206.158
        leftsubnet=192.168.10.0/24
        right=51.250.46.166
        rightsubnet=192.168.20.0/24
        ike=aes256-sha2_256-modp1024!
        esp=aes256-sha2_256!
        keyingtries=0
        ikelifetime=1h
        lifetime=8h
        dpddelay=30
        dpdtimeout=120
        dpdaction=restart
        auto=start
EOF

Файл с секретом создается тоже с VIP-адресом:

sudo cat << EOF > /etc/ipsec.secrets
188.68.206.158 51.250.46.166 : PSK "<SECRET>"
EOF

Настройка vpn2 окончена. Приступаем к настройке vpn1, так как на первой виртуальной машине тоже надо запустить VRRP и подправить конфигурацию IPsec.

Так как эта схема строится для отказоустойчивости, большинство конфигурационных файлов будут точно такими же как и на vpn2. Исключение — роль VRRP у этого инстанса будет MASTER. Устанавливаем keepalived, создаем конфигурацию и скрипт контроля IPsec:

sudo apt install -y keepalived
sudo cat << EOF > /usr/local/sbin/notify-ipsec.sh
#!/bin/bash
TYPE=\$1
NAME=\$2
STATE=\$3
case \$STATE in
        "MASTER") /usr/sbin/ipsec restart
                  ;;
        "BACKUP") /usr/sbin/ipsec stop
                  ;;
        "FAULT")  /usr/sbin/ipsec stop
                  exit 0
                  ;;
        *)        /usr/bin/logger "ipsec unknown state"
                  exit 1
                  ;;
esac
EOF
sudo chmod a+x /usr/local/sbin/notify-ipsec.sh
sudo cat << EOF > /etc/keepalived/keepalived.conf
vrrp_sync_group G1 {
    group {
        EXT
        INT
    }
    notify "/usr/local/sbin/notify-ipsec.sh"
}

vrrp_instance INT {
    state MASTER
    interface eth1
    virtual_router_id 11
    priority 25
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass <SECRET>
    }
    virtual_ipaddress {
        192.168.120.100/24
    }
    nopreempt
    garp_master_delay 1
}

vrrp_instance EXT {
    state MASTER
    interface eth0
    virtual_router_id 22
    priority 25
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass <SECRET>
    }
    virtual_ipaddress {
        188.68.206.158/29
    }
    nopreempt
    garp_master_delay 1
}
EOF
sudo systemctl enable keepalived

Пароль <SECRET>, указанный в конфигурации, должен быть одинаковым на обеих виртуальных машинах VPN.

Далее нам надо обновить IPsec-конфигурацию и конфигурацию секрета IPsec так, чтобы там был указан VIP вместо основного адреса. То есть конфигурация IPsec и конфигурация секрета будет идентична на vpn1 и vpn2.

sudo cat << EOF > /etc/ipsec.conf
config setup
        charondebug="all"
        uniqueids=yes
        strictcrlpolicy=no

conn site-to-site-vpn
        type=tunnel
        authby=secret
        left=%defaultroute
        leftid=188.68.206.158
        leftsubnet=192.168.10.0/24
        right=51.250.46.166
        rightsubnet=192.168.20.0/24
        ike=aes256-sha2_256-modp1024!
        esp=aes256-sha2_256!
        keyingtries=0
        ikelifetime=1h
        lifetime=8h
        dpddelay=30
        dpdtimeout=120
        dpdaction=restart
        auto=start
EOF
sudo cat << EOF > /etc/ipsec.secrets
188.68.206.158 51.250.46.166 : PSK "<SECRET>"
EOF


Перезагружаем keepalived и проверяем статус IPsec:

    sudo systemctl restart keepalived
ipsec status

Заключение

В этой инструкции мы рассказали, как запустить виртуальную машину VPN IPsec для маршрутизации трафика из облачной сети в удаленную точку подключения и разобрали пример отказоустойчивой схемы с двумя виртуальными машинами VPN IPsec.

Что дальше?

Зарегистрироваться в панели управления

Регистрируйте аккаунт в панели управления Selectel, пополняйте баланс удобным способом и подключайте наши продукты.
Перейти в панель

Узнать о продуктах больше

Все о принципах работы, задачах и фичах читайте на нашем сайте.
Перейти на сайт

Комментарии