Программная маршрутизация с VyOS

VyOS

Стабильность и эффективность бизнес-процессов современной организации во многом зависит от бесперебойного функционирования ИТ-инфраструктуры. Содержание ИТ-инфраструктуры во многих случаях обходится дорого, в особенности для малых и средних компаний.

С целью оптимизации расходов многие организации прибегают сегодня к практике ИТ-аутсорсинга: вместо того, чтобы приобретать оборудование, компания арендует его в стороннем дата-центре, а для его обслуживания привлекает сторонних специалистов.
Чтобы эта практика была выгодной с организационной и с финансовой точки зрения, нужно тщательно продумать техническую сторону вопроса.

Планируя перенос части ИТ-инфраструктуры в сторонний дата-центр, следует решить, каким именно образом все информационные ресурсы организации будут объединены в единую сеть. Решения от ведущих производителей (Juniper, Cisco и других) зачастую стоят дорого; компаниям небольшого и среднего размера они могут оказаться не по карману. В этой связи вполне закономерным и объяснимым является возросший интерес к бесплатным продуктам с открытым исходным кодом, многие из которых по возможностям не уступают платным аналогам, а иногда даже превосходят их.

Важным элементом корпоративной сети является маршрутизатор — специализированное сетевое устройство, предназначенное для объединения сегментов сети и пересылки пакетов между ними. Маршрутизаторы бывают как аппаратные, так и программные. В случае, когда необходимо выстроить ИТ-инфраструктуру с минимальными расходами, использование программного маршрутизатора может оказаться вполне подходящим вариантом.

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

VyOS: общая информация

VyOS представляет собой форк известной сетевой операционной системы Vyatta. Его первый релиз под кодовым названием Hydrogen был представлен в декабре 2013 года.

Последний на сегодняшний день релиз — Helium — вышел в свет в сентябре 2014 года. Интерфейс командной строки (CLI) в VyOS похож на СLI устройств от Juniper Networks.

Возможности VyOS действительно широки. Вот далеко не полный список:

  • межсетевой экран для IPv4 и IPv6, включая фильтрацию p2p-трафика;
    трансляция сетевых адресов (NAT);
  • DHCP-сервер для IPv4 и IPv6;
  • система обнаружения вторжений;
  • балансировка нагрузки и резервирование канала;
  • резервирование маршрутизаторов с синхронизацией таблицы состояний соединений;
  • виртуальные частные сети (IPsec, L2TP/IPsec, PPTP, OpenVPN);
  • учёт трафика (Netflow и sFlow);
  • веб-прокси и фильтрация URL.

Как и Vyatta, VyOS основан на Debian. Это позволяет расширить функциональность путём установки дополнительных deb-пакетов.

Установка

Подробную инструкцию по установке VyOS мы приводить не будем, да в этом и нет нужды: всё детально расписано здесь. Существует два типа установки VyOS: install system и install image. Первый тип (install system) подразумевает стандартную установку ОС на диск. При установке с использованием install image каждая версия VyOS будет находиться в отдельной директории, что даёт возможность откатиться к предыдущему релизу в случае возникновения неполадок (рекомендуемый метод установки).

Итак: загружаемся с диска, входим в систему (логин — vyos, пароль — vyos), выполняем команду install image. Начнётся установка, в ходе которой нужно будет ответить на стандартные вопросы установщика Linux. По завершении выполним команду reboot и снова зайдём в систему и войдём в систему под логином и паролем, заданными во время установки.

Практический пример

Рассмотрим особенности работы VyOS на конкретном практическом примере. Условия задачи: организация состоит из трёх географически удалённых друг от друга подразделений: одно — в Москве, второе — в Санкт-Петербурге, третье — в Хабаровске. В Петербурге имеются четыре сервера, установленные в дата-центре. Нужно сделать так, чтобы только один из них должен быть подключен к Интернету напрямую. Остальные должны быть объединены в локальную сеть и выходить в Интернет через маршрутизатор. Мы будем использовать разные типы подключений для филиалов — L2TP/IPsec, PPTP и OpenVPN.

Наша сеть будет выглядеть следующим образом:

VyOS

Конфигурация шлюза

После установки сети ещё нет, поэтому мы сначала настроим её через KVM-консоль.

Для начала настроим первый сетевой интерфейс (внешний), который будет иметь адрес 95.213.170.75. Переходим в режим настройки командой configure — да-да, все как у «старших» железных собратьев.

set interfaces ethernet eth0 address 95.213.170.75/29
set interfaces ethernet eth0 description "WAN"

В данном случае мы назначили интерфейсу eth0 адрес и указали описание порта, чтобы не запутаться в дальнейшем.

Также укажем адреса шлюза по умолчанию и DNS-сервера:

set system gateway-address 95.213.170.73
set system name-server 188.93.16.19

Здесь мы используем Санкт-Петербургский DNS-сервер Селектел, но вы, конечно же, можете указать любой другой.
Настроим сервис SSH, с помощью которого мы будем производить дальнейшее конфигурирование шлюза:

set service ssh port "22"

Логика работы VyOS почти такая же, как у устройств от Juniper Networks. Чтобы применить изменения, нужно выполнить команду commit. Чтобы изменения остались в силе после перезагрузки, их нужно сохранить с помощью команды save. Этой командой vyOS отличается в плане логики от JunOS: в сетевой ОС от Juniper после commit не нужно сохранять изменения.

Подключимся к маршрутизатору по SSH. Для входа в систему введём логин и пароль, заданные при установке. Затем настроим внутренний сетевой интерфейс eth1. Это локальный сетевой интерфейс, к которому подключены серверы в дата-центре. Присвоим ему адрес 10.0.10.1 с маской сети /24 и добавим описание:

set interfaces ethernet eth1 address 10.0.10.1/24
set interfaces ethernet eth1 description "LAN"

Чтобы наши машины могли распознавать имена сетевых ресурсов, нужно настроить DNS. Мы будем настраивать DNS-forwarder, который будет перенаправлять запросы на разрешение имён к серверам, заданным конфигурацией. Процедура настройки этого компонента проста:

set service dns forwarding cache-size "0"
set service dns forwarding listen-on "eth1"
set service dns forwarding name-server "188.93.16.19"
set service dns forwarding name-server "188.93.17.19"

В первой команде указывается размер кэша, который DNS-forwarder будет использовать для хранения записей. Мы выставили нулевой размер кэша, так как в нашем случае хранение DNS-записей не имеет особого смысла. Вторая команда задает интерфейс, на котором будет «слушать» запросы DNS-forwarder. Мы специально используем только внутренний интерфейс, на котором DNS-forwarder будет «слушать» запросы, чтобы не сделать DNS-forwarder, доступный всему интернету. В третьей и четвертой команде указываются адреса, куда будут пересылаться запросы. В нашем примере используются DNS-серверы Селектел, но вместо них, конечно же, можно указать любые другие.

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

В VyOS мы можем использовать наборы правил межсетевого экрана (файерволла), называя их любыми именами. В нашем примере для внешней сети используется набор правил под именем OUTSIDE, для внутренней, соответственно, INSIDE.

Для внешнего интерфеса мы разрешим все соединения «изнутри наружу», для внутреннего интерфейса — все «изнутри наружу» и доступ к SSH.

Создадим правила для внешнего интерфейса:

set firewall name OUTSIDE default-action "drop"
set firewall name OUTSIDE rule 1 action "accept"
set firewall name OUTSIDE rule 1 state established "enable"
set firewall name OUTSIDE rule 1 state related "enable"

Вышеперечисленными командами мы разрешаем уже установленные ранее (established) и относящиеся к ним (related) соединения.

Затем зададим правила файерволла:

Просмотреть правила
set firewall name INSIDE default-action 'drop'
set firewall name INSIDE rule 1 action 'accept'
set firewall name INSIDE rule 1 state established 'enable'
set firewall name INSIDE rule 1 state related 'enable'
set firewall name INSIDE rule 2 action 'accept'
set firewall name INSIDE rule 2 icmp type-name 'echo-request'
set firewall name INSIDE rule 2 protocol 'icmp'
set firewall name INSIDE rule 2 state new 'enable'
set firewall name INSIDE rule 3 action 'drop'
set firewall name INSIDE rule 3 destination port '22'
set firewall name INSIDE rule 3 protocol 'tcp'
set firewall name INSIDE rule 3 recent count '4'
set firewall name INSIDE rule 3 recent time '60'
set firewall name INSIDE rule 3 state new 'enable'
set firewall name INSIDE rule 31 action 'accept'
set firewall name INSIDE rule 31 destination port '22'
set firewall name INSIDE rule 31 protocol 'tcp'
set firewall name INSIDE rule 31 state new 'enable'

В первом правиле мы задаем действие по умолчанию — в нашем случае это «drop» (все пакеты, которые не попадают под установленные правила будут отбрасываться файерволлом). Во втором мы разрешаем прохождение пакетов ICMP; прежде всего это нужно для того, чтобы в случае сбоя мы смогли «пропинговать» наш роутер. Третье правило отвечает за SSH-подключения: мы разрешаем TCP трафик приходящий на 22 порт.

Применим созданные правила к соответствующим интерфейсам — внешнему и локальному:

set interfaces ethernet eth0 firewall in name 'OUTSIDE'
set interfaces ethernet eth1 firewall out name 'INSIDE'

Стоит обратить внимание на параметры in и out — они задают тип трафика, входящий или исходящий относительно маршрутизатора, и не связаны с названиями наборов правил межсетевого экрана.

Не забываем применять и сохранять конфигурацию с помощью команд commit и save.

Настройка VPN

Как уже было сказано выше, в филиалах у нас будут использоваться разные типы VPN-соединений. Начнём с настройки L2TP/IPSec (подробнее см. здесь):

set vpn ipsec ipsec-interfaces interface eth0
set vpn ipsec nat-traversal enable
set vpn ipsec nat-networks allowed-network 0.0.0.0/0

set vpn l2tp remote-access outside-address 95.213.170.75
set vpn l2tp remote-access client-ip-pool start 10.0.10.20
set vpn l2tp remote-access client-ip-pool stop 10.0.10.30
set vpn l2tp remote-access ipsec-settings authentication mode pre-shared-secret
set vpn l2tp remote-access ipsec-settings authentication pre-shared-secret <пароль>
set vpn l2tp remote-access authentication mode local
set vpn l2tp remote-access authentication local-users username <пользователь> password <личный_пароль>

С помощью первых трёх мы задаем конфигурацию IPSec: указываем интерфейс, на который будут идти пакеты, включаем NAT traversal и разрешаем NAT для всех сетей. Далее идут команды отвечающие за L2TP. В целом по написанию команд нетрудно догадаться, за что они отвечают, обратим внимание лишь на некоторые параметры.

  • outside-address — указывает внешний адрес VPN-сервера;
  • pre-shared-secret <пароль> — задает пароль для подключения, который в дальнейшем будет использоваться для настройки VPN на клиентских устройствах;
  • authentication mode local — задаёт тип аутентификации. В нашем примере используется аутентификация по локальной базе, но можно использовать и RADIUS-сервер для централизованного управления учётными записями.

В последней строке мы создаём пользователя и устанавливаем для него пароль.
После этого внесём коррективы в правила файерволла и разрешим трафик L2TP/IPSec.

Просмотреть правила файерволла
set firewall name INSIDE rule 4 action 'accept'
set firewall name INSIDE rule 4 protocol 'esp'
set firewall name INSIDE rule 41 action 'accept'
set firewall name INSIDE rule 41 destination port '500'
set firewall name INSIDE rule 41 protocol 'udp'
set firewall name INSIDE rule 42 action 'accept'
set firewall name INSIDE rule 42 destination port '4500'
set firewall name INSIDE rule 42 protocol 'udp'
set firewall name INSIDE rule 43 action 'accept'
set firewall name INSIDE rule 43 destination port '1701'
set firewall name INSIDE rule 43 ipsec 'match-ipsec'
set firewall name INSIDE rule 43 protocol 'udp'

commit
save

Правило 4 разрешает трафик протокола ESP, по которому работает установленный туннель IPSEC, 42 — NAT traversal, 43 — порт 1701, на котором работает L2TP.

Перейдем теперь к настройке второго типа VPN-подключения и «поднимем» OpenVPN-сервер.
Для начала скопируем файлы easy-rsa в директорию /config/easy-rsa2 , чтобы не потерять их при обновлении системы:

cp -rv /usr/share/doc/openvpn/examples/easy-rsa/2.0/ /config/easy-rsa2

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

nano /config/easy-rsa2/vars

export KEY_COUNTRY="RU"
export KEY_CITY="Saint-Petersburg"
export KEY_ORG="Selectel"
export KEY_EMAIL="t-rex@selectel.ru"

Эти данные будут указываться в полях сертификатов, которые мы будем генерировать. Перейдем в директорию /config/easy-rsa2/ и загрузим переменные:

cd /config/easy-rsa2/
source ./vars

Удалим все ключи:

./clean-all

Затем сгенерируем файлы центра сертификации:

./build-ca
./build-dh

и сертификат сервера:

./build-key-server t-rex-server

После этого скопируем ключи в соответствующие директории:

cp /config/easy-rsa2/keys/ca.crt /config/auth/
cp /config/easy-rsa2/keys/dh1024.pem /config/auth/
cp /config/easy-rsa2/keys/t-rex-server.key /config/auth/
cp /config/easy-rsa2/keys/t-rex-server.crt /config/auth/

Далее подготовим клиентские файлы для подключения к серверу:

./build-key branch-msk

и сразу же скопируем их в отдельную папку:

cd /config/easy-rsa2/keys
mkdir branch-msk
cp branch-msk* branch-msk/
cp ca.crt branch-msk/

Сгенерированные файлы понадобятся для подключения клиентов к серверу, поэтому их нужно будет передать на клиентскую сторону. Это можно сделать с помощью любого SCP-клиента: WinSCP для Windows или стандартного консольного клиента scp для Linux.

Далее переходим к настройке сервера:

set interfaces openvpn vtun0 mode 'server'
set interfaces openvpn vtun0 server name-server '10.0.10.1'
set interfaces openvpn vtun0 server push-route '10.0.10.0/24'
set interfaces openvpn vtun0 server subnet '10.1.10.0/24'
set interfaces openvpn vtun0 tls ca-cert-file '/config/auth/ca.crt'
set interfaces openvpn vtun0 tls cert-file '/config/auth/t-rex-server.crt'
set interfaces openvpn vtun0 tls dh-file '/config/auth/dh1024.pem'
set interfaces openvpn vtun0 tls key-file '/config/auth/t-rex-server.key'
set service dns forwarding listen-on vtun0

commit
save

Обратим внимание на последнюю команду: в ней мы перенаправляем запросы на разрешение имён на DNS-forwarder, настроенный ранее. Отметим также, что в случае с OpenVPN мы сначала использовали отдельную сеть для построения самого туннеля, а затем смаршрутизировали её на локальную сеть, где находятся наши серверы. Это объясняется особенностями протокола. Более подробно об этом мы расскажем в следующей публикации.

Настройка PPTP-сервера

Настроим последний тип VPN-подключения — PPTP. Конечно, протокол PPTP слабо защищён и поэтому вряд ли может быть использован для передачи конфиденциальной информации, но для обеспечения удаленного доступа он находит широкое применение. PPTP-клиент присутствует практически в любом устройстве, имеющем подключение к сети.

Из приведённого примера можно заметить, что PPTP настраивается почти таким же образом, как L2TP:

set vpn pptp remote-access authentication mode local
set vpn pptp remote-access authentication local-users username <имя_пользователя> password <пароль>
set vpn pptp remote-access client-ip-pool start 10.0.10.31
set vpn pptp remote-access client-ip-pool stop 10.0.10.40
set vpn pptp remote-access dns-server server-1 188.93.17.19
set vpn pptp remote-access outside-address 95.213.170.75

В первой команде мы задаем локальный режим аутентификации пользователей. Если у вас есть RADIUS-сервер, можно выбрать режим аутентификации radius: с его помощью управлять учётными записями пользователей гораздо удобнее.

Затем мы создаем локальных пользователей, указываем диапазон IP-адресов и данные серверов DNS, выдаваемых клиентам. Последняя команда задает адрес интерфейса, на котором будет «слушать» наш сервер.

Применим и сохраним настройки:

commit
save

Сервер готов к подключению клиентов.

Осталось только разрешить прохождение трафика из локальной сети во внешнюю. Таким образом мы обеспечим доступ в Интернет серверам, подключенным к локальной сети, а также пользователям, подключающимся к нашему роутеру из филиалов:

set nat source rule 1 outbound-interface 'eth0'
set nat source rule 1 source address '10.0.10.0/24'
set nat source rule 1 translation address masquerade

Заключение

Итак, готово: мы построили сеть в соответствии с условиями поставленной задачи. Один из серверов (расположенный в Санкт-Петербурге) выступает в качестве маршрутизатора, остальные три сервера подключены к нему по локальной сети. Маршрутизаторы в филиалах имеют доступ к ресурсам локальной сети через безопасные VPN-подключения.

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

  • организация GRE-туннелей;
  • работа с протоколом L2TPv3;
  • QoS;
  • zone-based firewall;
  • увеличение производительности сетевого интерфейса (performance tuning)
  • VRRP.