вторник, 27 января 2015 г.

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

image

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


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

Планируя перенос части ИТ-инфраструктуры в сторонний дата-центр, следует решить, каким именно образом все информационные ресурсы организации будут объединены в единую сеть. Решения от ведущих производителей (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.

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

image

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


После установки сети ещё нет, поэтому мы сначала настроим её через 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) соединения.

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

В первом правиле мы задаем действие по умолчанию — в нашем случае это «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.
Посмотреть правила

Правило 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.

Источник: habrahabr.ru

Комментариев нет:

Отправить комментарий