Как настроить VPN IPsec - Академия Selectel

Как настроить VPN IPsec

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

Введение

Технология 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.