Как настроить 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.