Кто бы мог подумать, что развернуть часть серверов компании в Amazon было плохой идеей.
В итоге поставленная задача — сделать дополнительный VPN-туннель между Amazon и инфраструктурой в РФ.
Кроме простого how-to опишу несколько особенностей в настройке, с которыми можно столкнуться.
В итоге поставленная задача — сделать дополнительный VPN-туннель между Amazon и инфраструктурой в РФ.
Кроме простого how-to опишу несколько особенностей в настройке, с которыми можно столкнуться.
Настройка файрвола и роутинга
Покупаем у пока еще не заблокированного хостера 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
Настройка 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:
Одинаковые настройки аутентификации и шифрования для всех. Сделаем разными только 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" } }
Индивидуальные настройки аутентификации и шифрования:
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
Поднятие туннелей с маршрутизаторами 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
Настройка динамической маршрутизации на 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
Что осталось нерассмотренным
Я описал самый простой вариант. Конечно же, вы настроите обмен ключами, используя IKE v2, авторизацию по сертификату, добавите в файрвол дополнительную фильтрацию по адресам, сделаете OSPF с авторизацией и, при большом количестве маршрутизаторов, с разделением на area, измените значения hello-interval и dead-interval на интерфейсах.
Буду рад советам в комментариях, а информации об опечатках — в личку. Спасибо за внимание.
Комментарии (8)
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.confiluvar Автор
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
то поясните подробнее, в чем преимущество, поправлю в статье
Pave1
Вот если бы Вы написали тут скрипт, который бы автоматически на регулярной основе правил на кваге настройку анонсов заблокированных роскомнадзором префиксов интересующих сервисов — вот это было бы круто. Хотя, учитывая их текущее колличество в настоящий момент — так не долго и сеть завалить (((( А гонять весь трафик через облако — дело не хитрое.
darken99
Вот тут есть то что вам надо