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