Пару лет назад я опубликовал небольшой очерк о работе, проделанной над мини-PC Lenono Thinkcentre M72e Tiny. Этот мини-компьютер предполагалось использовать в качестве гибко-настраиваемого и высокопроизводительного софтверного раутера.
В этой публикации поговорим немного о конфигурировании оного. Но для начала, традиционная рубрика:
А зачем?
Нравится. Просто нравится использовать энтерпрайз технологии дома. Это удобно и позволяет решить весьма заковыристые проблемы.
Когда будущую сеть для дома находилась в стадии планирования/проектирования, большое внимание предполагалось уделить безопасности работы оной. Кроме банальных телефонов, планшетов, ноутбуков, телевизоров и т.п., сетью в моей обители пользуется армия устройств для умного дома, погодная станция, приемник сигналов пролетающих мимо бортов для flightradar24, камеры наблюдения и т.д. Сразу было понятно, что ограничиться одной общей сетью для всех устройств будет не самым удачным решением.
Попытка объединить все эти устройства в одной сети, во-первых, привела бы к невероятной мешанине. А во вторых, представлялся простейший сценарий, в котором злоумышленник подбирается к одной из камер наружного наблюдения, вынимает из нее сетевой провод, втыкает его в свой ноутбук и вуаля – гигабитный доступ к домашней сети за одно движение.
В итоге решено было объединить устройства по их смысловому назначению в отдельные независимые подсети и осуществлять маршрутизацию и контроль доступа между этими подсетями с помощью раутера.
Что для этого нужно?
Одного раутера, для осуществления задуманного, конечно, недостаточно. Нужен свитч, он же коммутатор. Учитывая, что сетевых интерфейсов на раутере два, а планируемых подсетей больше, не говоря уже о соединении с интернетом, свитч нужен был с поддержкой vlan. Такие свитчи позволяют создавать виртуальные локальные сети, т.е. по сути устройства физически подключаются к одному свитчу, но логически оказываются в изолированных подсетях и не могут взаимодействовать друг с другом напрямую, без помощи раутера. А в раутере уже можно настроить кому куда можно, а кому нет.
В качестве коммутатора я взял Cisco SG200-26 – гигабитный управляемый безвентиляторный свитч. Подобные машины весьма недороги и высокопроизводительны. Очень им доволен, хотя продвинутая конфигурация (через веб-интерфейс) потребовала вдумчивого чтения доков и немного экспериментирования.
А вот с раутером было интереснее. Хардверные раутеры Cisco и иже с ними совсем недешевы, и, кроме того, часто требуют платной подписки для функционирования определенных встроенных сервисов, что для домашнего использования явно перебор.
Что ты такое, VyOS?
По совету товарища я почитал про операционную систему VyOS. Эта ось, основанная на Debian, позволяет превратить обычный компьютер в софтверный раутер со внушительным списком встроенных возможностей.
Интерфейс у VyOS – командный, очень похожий на оный у серьезных хардверных собратьев, включая приятные плюшки в виде поддержки аббревиатур для длинных команд и авто-заполнения/авто-подставления с помощью клавиши Tab.
С непривычки, пожалуй, это может показаться страшно сложным, архаичным подходом. На практике же оказывается, что после даже не слишком детально изучения интерфейса, простота и скорость осуществления настроек раутера оказываются куда лучше, чем новомодные веб-морды.
А вот возвращаясь к свичту, могу сказать, что веб-морда, пожалуй лучший выбор, в силу очень большого числа портов с небольшим, и, в большинстве своем, идентичным набором настроек для каждого. Т.е. есть возможность настроить кучу портов сразу, а не по одному, как это делается в раутере.
Как?
Установка
Процедура проста и детально расписана на официальном портале.
По сути, скачиваем образ, записываем его (на диск или флешку, не забыв сделать ее загрузочной), и грузимся.
Загрузившись прямо с диска (или флешки), система покажет баннер ISOLINUX с базовыми инструкциями. Там ничего интересного, и нужно просто нажать enter.
Когда загрузка завершится и появится приглашение входа в систему, используйте имя пользователя vyos и пароль vyos для авторизации.
В принципе, на данном этапе мы уже имеем полнофункциональный софтверный раутер под управлением VyOS, загрузившийся прямо с временного носителя. Раутер уже можно настраивать и все будет работать. Это дает возможность опробовать возможности раутера, не осуществляя установки и вообще не внося никаких изменений в компьютер.
Для того, чтобы произвести установку системы на компьютер на постоянной основе, нужно выполнить команду install image. Система задаст несколько простых вопросов по ходу установки (вроде имени пользователя-администратора и пароля), по окончании которой, систему следует перезагрузить командой reboot.
Таким образом, кстати, можно установить несколько различных версий VyOS. Это может быть полезно на тестовых стендах, я полагаю. Дома же, раутер предполагается гонять без экрана после первичной настройки, поэтому устанавливается одна версия, которая и будет автоматом грузиться после ребута.
Настройка
Опишу основные моменты.
Несмотря на то, что система основана на Debian линуксе, и из командной строки можно получить доступ к файловой системе и командной строке Debian, делать этого не нужно, за исключением случая, когда вы точно знаете, что делаете. Далее по тексту будет пример, когда доступ к файловой системе окажется полезным.
Попытка взаимодействия с сетевыми настройками (и иже с ними) через консоль Debian приведет к краху системы. Вся настройка производится через консоль VyOS. А она уже будет взаимодействовать с Debian и мы в этот процесс вмешиваться не будем.
Залогинившись в систему, мы оказываемся в режиме наблюдателя. Нам можно просматривать информацию о работе системы, но нельзя вносить изменения в настройки.
Попробуйте просмотреть текущее состояние сетевых интерфейсов с помощью команды show interfaces.
Как я упоминал, система поддерживает сокращения, т.е. команда show int будет эквивалентна полной комманде show interfaces.
Если попробовать написать show и затем нажать клавишу Tab, то VyOS покажет все возможные варианты продолжения команды show.
Если ввести show i и затем нажать Tab, то система покажет лишь варианты начинающиеся на i, то есть incoming, interfaces и т.д.
Подобные подсказки нередко приходятся весьма кстати – необязательно досконально помнить все нюансы управления системой. Примерных воспоминаний часто оказывается достаточно, чтобы с помощью подсказок и автозаполнения восстановить правильные команды.
Перейдем непосредственно к конфигурированию. Для этого нужно выполнить команду configure (или сокращенно conf).
Далее, настройки устанавливаются командой set.
Основные настройки
Например, следующий блок команд, устанавливает хостнейм для раутера как MyVyOsRouter, присваивает сетевому интерфейсу eth0 имя WAN и что IP адрес интерфейс должен будет получить автоматом от dhcp сервера. Классическая настройка интернет порта на раутере.
set system host-name 'MyVyOsRouter'
set interfaces ethernet eth0 description 'WAN'
set interfaces ethernet eth0 address dhcp
Введенные команды настроек не вступают в силу, пока не будет выполнена команда commit. Она выполняет проверку, и в случае отсутствия ошибок и конфликтов, производит изменения конфигурации в соответствии со введенными ранее командами.
В случае обнаружения проблем, новая конфигурация не вступает в силу и выводится информация, помогающая разобраться в чем дело. В таком случае можно отменить все введенные после последнего commit‘а (или ребута) команды выполнив команду discard. Также можно отменить конкретную команду, заменив set на delete (или сокращенно del), например:
delete system host-name 'MyVyOsRouter'
Инcтрукция delete с последующим commit позволяет удалить настройки из уже примененной и работающей конфигурации.
Еще один важный момент. commit только применяет изменения, но не сохраняет их, т.е. после рестарта все изменения будут утеряны. Для того, чтобы сохранить конфигурацию, следует выполнить команду save. Без дополнительных аргументов текущая конфигурация раутера будет сохранена в файл (/config/config.boot), из которого автоматически снова загрузится после рестарта.
Существуют дополнительные возможности сохранения конфигурации, к примеру на TFTP сервер. Это классический способ обмена файлами с сетевым оборудованием без графического интерфеса. Все что нужно это запустить на компе TFTP сервачок и указать VyOS куда сохранять конфиг:
save tftp://192.168.100.2/mynewconfig.config
Понятное дело, что для доступа к серверу нужен работающий, правильно сконфигурированный сетевой интерфейс.
Аналогичным образом работает команда load, предсказуемо загружающая уже сохраненний конфиг (не забывайте про неоходимость commit после load).
Полный спикок возможнойстей save и load смотрите нажав Tab после введения команды.
К слову, если нужно вернуться к голой дефолтной конфигурации, выполните:
load /opt/vyatta/etc/config.boot.default
commit
save
Продолжим. Создадим две сети vlan на интерфейсе eth1, и назовем их LAN1 и LAN2. IP адреса виртуальных интерфейсов будут 192.168.100.1/24 и 192.168.200.1/24 соответственно.
set interfaces ethernet eth1 vif 10 description "LAN1"
set interfaces ethernet eth1 vif 10 address "192.168.100.1/24"
set interfaces ethernet eth1 vif 20 description "LAN2"
set interfaces ethernet eth1 vif 20 address "192.168.200.1/24"
Таких виртуальных подсетей можно создать сколько угодно. Числа 10 и 20 в командах выше, это вроде как порядкового номера блока конфигурации vif (сокращение от virtual interface), т.е. все блоки с номером 10 относятся к настройке одной и той-же конкретной подсети. Логика нумерации блоков такая-же, как в Бейсике 30 лет назад. Т.е. просто числа по нарастанию. Кому-то нравятся интервалы в десятку, кому-то в сотню. Не принципиально.
Делаем commit (делать ли save решайте сами, но я не делаю так часто…) и продолжаем.
Если вам не нужны виртуальные сети, то можно сконфигурировать eth1 по-простому:
set interfaces ethernet eth1 description "LAN"
set interfaces ethernet eth1 address "192.168.100.1/24"
На этом этапе я предпочитаю запустить ssh сервер, который даст возможность удаленного подключения к раутеру, что позволяет отключить от него клавиатуру и монитор. Профит. Будем слушать входящие ssh соединения на интерфейсе смотрящем в LAN1:
set service ssh port "22"
set service ssh listen-address "192.168.100.1"
Пожалуй на этом этапе я перестану упоминать необходимость производить commit (и, периодически, save).
Далее настроим NAT, иными словами организуем выход из локальной сети в интернет (он у нас на интерфейсе eth0):
set nat source rule 10 outbound-interface "eth0"
set nat source rule 10 source address "192.168.100.0/24"
set nat source rule 10 translation address masquerade
10 это опять, номер блока инструкций nat source. После применения, эти инструкции должны запустить NAT в сети LAN1, т.е. хосты с прописанным адресом и шлюзом уже должны получить доступ ко всемирной сети.
Для удобства нужно прописать перенаправление DNS запросов к интернет-провайдеру и DHCP server:
set service dns forwarding listen-on eth1.2
set service dns forwarding system
set service dns forwarding dhcp eth0
set service dns forwarding name-server X.X.X.X
set service dns forwarding name-server Y.Y.Y.Y
set service dhcp-server shared-network-name LAN1 authoritative enable
set service dhcp-server shared-network-name LAN1 subnet 192.168.100.0/24 default-router 192.168.100.1
set service dhcp-server shared-network-name LAN1 subnet 192.168.100.0/24 dns-server 192.168.100.1
set service dhcp-server shared-network-name LAN1 subnet 192.168.100.0/24 lease 86400
set service dhcp-server shared-network-name LAN1 subnet 192.168.100.0/24 start 192.168.100.50 stop 192.168.100.99
В результате все DNS запросы будут перенаправлены на сервера с адресами X.X.X.X и Y.Y.Y.Y. Кроме того DHCP сервер в подсети LAN1 будет динамично раздавать IP адреса в диапазоне от 192.168.100.50 до 192.168.100.99.
Подобным образом настраивается подсеть LAN2. У меня она не имеет доступа в интернет, поэтому в ней нет NAT и перенаправления DNS. А вот DHCP, для удобства есть:
set service dhcp-server shared-network-name LAN2 authoritative enable
set service dhcp-server shared-network-name LAN2 subnet 192.168.200.0/24 default-router 192.168.200.1
set service dhcp-server shared-network-name LAN2 subnet 192.168.200.0/24 lease 86400
set service dhcp-server shared-network-name LAN2 subnet 192.168.200.0/24 start 192.168.200.50 stop 192.168.200.250
Некоторые сетевые устройства в моей сети LAN2 не предоставляют возможности установки статического IP адреса. VyOS позволяет зарезервировать конкретный IP адрес за конкретным MAC адресом, фактически делая IP адрес статическим. Например:
set service dhcp‐server shared‐network‐name LAN2 subnet 192.168.200.0/24 static‐mapping DEVICE1 ip‐address 192.168.200.123
set service dhcp‐server shared‐network‐name LAN2 subnet 192.168.200.0/24 static‐mapping DEVICE1 mac‐address xx:xx:xx:xx:xx:xx
Эти инструкции зарезервируют адрес 192.168.200.123 для устройства DEVICE1 с MAC адресом xx:xx:xx:xx:xx:xx.
Port forwarding
Здесь все просто. Следующий блок инструкций пробросит 80тый порт на IPшник 192.168.100.100
set nat destination rule 10 description "Port Forward: HTTP to 192.168.100.100"
set nat destination rule 10 destination port 80
set nat destination rule 10 inbound-interface eth0
set nat destination rule 10 protocol tcp
set nat destination rule 10 translation address 192.168.100.100
Если нужно пробросить входящий на 80тый порт траффик на НЕ 80тый порт на внутреннем хосте, то пригодится директива translation port:
set nat destination rule 10 description "Port Forward: HTTP to 192.168.100.100"
set nat destination rule 10 destination port 8080
set nat destination rule 10 translation port 80
set nat destination rule 10 inbound-interface eth0
set nat destination rule 10 protocol tcp
set nat destination rule 10 translation address 192.168.100.100
Эта конфигурация переправит с порта 8080 на внешнем интерфейсе на порт 80 на 192.168.100.100.
Помните, что включенный брандмауэр не позволит осуществить проброс портов без соответствующих настроек. Читайте ниже.
Настройки VPN
Возможность устанавливать защищенное соединение с домашней сетью извне – одно из фундаментальных требований к ее работе. Разумеется, для этого нам понадобится либо статический интернет адрес (редкость на сегодняшний день), либо придется воспользоваться одним из DDNS сервисов.
По сути сервисы DDNS позволяют автоматом присваивать ваш динамический внешний IP к домену. Многие современные интернет модемы поддерживают этот функционал. В крайнем случае можно запустить DDNS клиент на одной из домашних машин.
Вернемся к настройке VPN. Опишу два наиболее популярных варианта – L2TP+IPSEC и OpenVPN. У каждого из них свои достоинства и недостатки, о которых вы можете поискать информацию сами.
L2TP+IPSEC
L2TP+IPSEC проще в конфигурировании на VyOS и не требует дополнительного программного обеспечения на устройствах, с которых предполагается осуществлять соединение. И Windows, и Linux, и Android и iOS устанавливают соединение с помощью встроенного функционала, хоть и первоначальная настройка оного не тривиальна.
Нижеследующий список инструкций, поднимает L2TP+IPSEC VPN сервер на интерфейсе eth0 и разрешает входящие соединения с любого адреса (allowed-network 0.0.0.0/0).
Вновь подсоединившиеся клиенты получат IP адреса из подсети 192.168.300.0 в диапазоне от 192.168.300.10 до 192.168.300.20.
Для успешного подключения клиент должен авторизоваться с помощью секрета SECRET, и связки имя пользователя + пароль USERNAME и PASSWORD. Замените эти три параметра на что-то хитрое и не подбираемое быстрым перебором. Важность сложности паролей широко освещена в сети, поэтому повторяться не буду.
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 dhcp-interface eth0
set vpn l2tp remote-access client-ip-pool start 192.168.300.10
set vpn l2tp remote-access client-ip-pool stop 192.168.300.20
set vpn l2tp remote-access ipsec-settings authentication mode pre-shared-secret
set vpn l2tp remote-access ipsec-settings authentication pre-shared-secret SECRET
set vpn l2tp remote-access authentication mode localcommit
set vpn l2tp remote-access authentication local-users username USERNAME password PASSWORD
Конфигурация встроенного клиента на Android будет выглядеть следующим образом:
С адресом сервера, юзернэймами и паролями все предельно ясно. А вот перечисление подсетей 192.168.100.0/24 и 192.168.200.0/24 (через пробел) в Forwarding Rules необходимо, чтобы получить к ним доступ через VPN. Другие типы VPN (такие как OpenVPN, рассмотренный ниже), позволяют передавать эту информацию клиентам автоматически, но L2TP+IPSEC не подразумевает такой настройки, по крайней мере под VyOS. По этой причине инструкции по маршрутизации нужно прописывать вручную на стороне клиента.
iOS у меня нету, чтоб сделать скриншот, но там все весьма похоже. Эскуза.
В Windows придется повозиться чуть дольше. В настройках сетей и интернета выбираем VPN и следом добавить новое соединение VPN. В появившемся окошке заполняем поля по примеру ниже:
Сохранив изменения, в окошке общих настроек VPN нужно выбрать пункт “Change Adapter Options“:
Windows традиционно создает виртуальные сетевые адаптеры для VPN соединений, поэтому реальные и виртуальные адаптеры вашей системы, вперемешку, предстанут перед взором.
Выбираем наш новый VPN (я его, для примера, назвал My Connection) и правым кликом идем в Свойства.
В табе безопасности (Security) важно выбрать “Maximum strength encryption” и “Microsoft CHAP Version 2“:
Напоследок нужно отключить еще одну важную опцию, которую по мистическим причинам Windows всегда включает по умолчанию. Опция форсирует систему использовать VPN сервер как шлюз для всех исходящих соединений. Разумеется именно это необходимо в определенных ситуациях, но в большинстве случаев это нонсенс.
Отправляемся в таб сетевых настроек (“Networking”), выбираем “Internet Protocol Version 4 (TCP/IPv4)”, жмем “Свойства“. Внизу в появившемся оконце жмем кнопку “Дополнительно (Advanced) и снимаем галку с пункта “Use default gateway on remote network“:
Сохраняем все изменения и в принципе VPN соединение уже должно работать. Ярлычок на него должен быть доступен по клику на сетевое соединение в панели задач, возле часов.
Однако, как и в случае с Android, в системе нужно будет прописать маршруты к сетям 192.168.100.0/24 и 192.168.200.0/24, иначе до них не добраться.
Это довольно просто. Запускаем Windows Power Shell из под админа и выполняем команды такого рода:
Add-VpnConnectionRoute -ConnectionName "My Connection" -DestinationPrefix 192.168.100.0/24
Эта директива указывает, что сеть 192.168.100.0/24 нужно искать через соединение My Connection. Модифицируем и применяем команду для всех сетей к которым нужно проложить путь. Эти настройки остаются в системе, поэтому процедура выполняется лишь однажды.
OpenVPN
Настройка OpenVPN в VyOS немного сложнее, чем оная для L2TP+IPSEC. Интернет так-же упоминает потенциальные проблемы с производительностью высокоскоростных сильно-нагруженных соединений на слабом железе, но по факту это не применимо к домашним соединениям – скорости в сотни мегабит не будут проблемой даже на очень слабом железе.
Клиенты потребуют специального софта для установки соединения, но конфигурация оного осуществляется буквально за секунды, и кроме того, гораздо приятнее визуализирует процессы и статистику обмена данными.
Традиционная настройка OpenVPN сервера включает в себя авторизацию с помощью сертификатов и ключей. Сгенерировать и хранить ключи можно где угодно, но, раз уж сердцем VyOS является Debian, то почему бы не воспользоваться, встроенными, так сказать возможностями.
Для начала нужно получить root доступ на VyOS. Делается это следующей командой:
set system login user root authentication plaintext-password PASSWORD
Вместо PASSWORD придумайте какой-нибудь качественнный пароль. После этого введя в консоли VyOS команду su, мы окажемся в консоли Debian с root доступом. Излишним будет напоминать, что root всемогущ, и можно натворить дел. Но нам всего-то нужно создать несколько файлов и положить их, аккуратненько, в папочку.
Итак, из под root, копируем файлы для генерации ключей во временную папочку, скажем easy-rsa2-my:
cp -rv /usr/share/doc/openvpn/examples/easy-rsa/2.0/ /config/easy-rsa2-my
Затем подредактируем немного файл vars под свои нужды. Там в конце всякие настройки мэйлов, названия компании и подобная муть. В принципе это не сильно важно. Но если очень хочется, то:
nano /config/easy-rsa2-my/vars
Теперь можно сгенерировать сертификаты. Оно задаст кучу вопросов, но там все довольно просто. Важно только одно: пароль для сертификатов задавать не нужно, т.е. просто оставляем его пустым.
cd /config/easy-rsa2-my/
source ./vars
./clean-all
./build-ca
./build-dh
./build-key-server server
./build-key client
После генерации ключей и сертификатов, скопируем их туда, где к ним будет обращаться OpenVPN сервер. Например по адресу /config/auth/ovpn.
sudo mkdir /config/auth/ovpn
sudo cp keys/ca.crt /config/auth/ovpn/
sudo cp keys/dh1024.pem /config/auth/ovpn/
sudo cp keys/server.key /config/auth/ovpn/
sudo cp keys/server.crt /config/auth/ovpn/
cd /config/auth/ovpn
openvpn --genkey --secret tls.key
Далее нам понадобятся файлы tls.key, ca.crt, client.key и client.crt для создания файла конфигурации клиента. Их можно скопировать на флешку, или залить на TFTP сервер, или даже скопировать через WinSCP.
К этим файлам мы вскоре вернемся. Давайте сначала выйдем root консоли командой exit и закончим конфигурировать OpenVPN сервер:
set interfaces openvpn vtun0 mode "server"
set interfaces openvpn vtun0 server subnet "192.168.300.0/24"
set interfaces openvpn vtun0 local-port "1194"
set interfaces openvpn vtun0 tls ca-cert-file "/config/auth/ovpn/ca.crt"
set interfaces openvpn vtun0 tls cert-file "/config/auth/ovpn/server.crt"
set interfaces openvpn vtun0 tls dh-file "/config/auth/ovpn/dh1024.pem"
set interfaces openvpn vtun0 tls key-file "/config/auth/ovpn/server.key"
set interfaces openvpn vtun0 openvpn-option "tls-auth /config/auth/ovpn/tls.key 0"
set interfaces openvpn vtun0 encryption aes256
set interfaces openvpn vtun0 keep-alive interval 10
set interfaces openvpn vtun0 keep-alive failure-count 3
set interfaces openvpn vtun0 server push-route 192.168.100.0/24
set interfaces openvpn vtun0 server push-route 192.168.200.0/24
Этими командами мы запускаем OpenVPN сервер на стандартном порту 1194. Сервер будет раздавать адреса в подсети 192.168.300.0/24. Авторизация будет происходить с помощью указанных ключей и сертификатов, и, кроме того, мы будем шифровать данные алгоритмом aes256 и добавим TLS аутентификацию на канал контроля, для пущей безопасности.
Последние две строки уведомят клиента, что подсети 192.168.100.0/24 и 192.168.200.0/24 следует искать через VPN шлюз, таким образом лишая нас необходимости вручную прописывать маршруты, как в случае с L2TP+IPSEC.
На этом настройка сервера завершена.
Займемся созданием файла конфигурации для клиентов. Этот файл будет содержать в себе ВСЕ данные для установления соединения с VPN. Т.е. нужно принять все меры, чтобы он не оказался в руках злоумышленников.
К слову, в идеале, на VyOS хорошо бы настроить лог и мониторить его (автоматически) на предмет входящих VPN соединений (и не только), и уведомлять, скажем, через email, при обнаружении оного. Вероятно, об этом я расскажу в отдельном опусе.
Вернемся к клиенту. По сути файл конфигурации это текстовый файл, содержащий адрес сервера, настройки соединения и клиентские ключи и сертификаты. Наверное есть утилиты для упрощения создания этих файлов, но я все делаю по старинке, в редакторе. Итак, создаем пустой текстовый файл, меняем его название и расширение на myvpn.ovpn и открываем в любом текстовом редакторе, вроде блокнота. Понятное дело, что имя файла можно выбрать по своему усмотрении. Важно лишь расширение.
Начнем с костяка файла. Я понавтыкал комментов, чтоб было понятно, что к чему:
#
# OpenVPN client configuration file example
#
# We're a client
client
# Use tun or tap driver
dev tun
# Protocol
proto udp
# Server address
remote <SERVER ADDRESS> <SERVER PORT>
# Keep trying indefinitely to resolve the
# host name of the OpenVPN server. Very useful
# on machines which are not permanently connected
# to the internet such as laptops.
resolv-retry infinite
# Most clients don't need to bind to
# a specific local port number.
nobind
# Try to preserve some states across restarts.
persist-key
persist-tun
# Encryption cipher
cipher AES-256-CBC
# TLS key direction
key-direction 1
# Certificate Authority
<ca>
-----BEGIN CERTIFICATE-----
<INSERT HERE>
-----END CERTIFICATE-----
</ca>
# Client certificate
<cert>
-----BEGIN CERTIFICATE-----
<INSERT HERE>
-----END CERTIFICATE-----
</cert>
# Client key
<key>
-----BEGIN RSA PRIVATE KEY-----
<INSERT HERE>
-----END RSA PRIVATE KEY-----
</key>
# TLS auth
<tls-auth>
-----BEGIN OpenVPN Static key V1-----
<INSERT HERE>
-----END OpenVPN Static key V1-----
</tls-auth>
# Verify server certificate by checking
# that the certicate has the nsCertType
# field set to "server". This is an
# important precaution to protect against
# a potential attack discussed here:
# http://openvpn.net/howto.html#mitm
ns-cert-type server
# Set log file verbosity.
verb 4
# Silence repeating messages
mute 20
# Pull extra options from the server
pull
Все, что остается сделать, это вписать адрес сервера и порт вместо <SERVER ADDRESS> и <SERVER PORT> соответственно, и, заполнить секции <INSERT HERE> данными из файлов tls.key, ca.crt, client.key и client.crt, которые мы скопировали с сервера ранее. Сохраняем получившийся ovpn файл. Его то мы и скормим клиенту на этапе конфигурации соединения.
Для этого качаем клиент (существует под все платформы), устанавливаем и запускаем. Нажимаем плюсик для добавления нового профиля соединения, выбираем таб FILE и скармливаем наш ovpn файл:
При импорте нового профиля, происходит его проверка. Если ovpn файл содержит ошибки, то программа нам об этом сообщит и отменит процедуру импорта. Это довольно удобно и позволяет довольно быстро доработать файл до рабочего состояния.
Успешно импортированный профиль появится в списке профилей, где его можно будет немедленно активировать нажав на него, либо редактировать, нажав на пиктограмму карандашика (хотя редактировать, в данном случае, громко сказано: по сути там можно только поменять название соединения….):
При успешном установлении соединения, клиент начнет отображать статистику обмена данными:
OpenVPN клиенты для различных операционных систем выглядят и ведут себя совершенно одинаково, что упрощает и унифицирует процессы импорта профилей и использования.
Настройки брандмауэра VyOS
Фильтрация траффика
Брандмауэр очень важен. Если его не настроить, то VyOS позволит осуществлять соединения и передачу данных для всех и во всех направлениях, что совершенно противоречит требованиям безопасности. Поэтому брандмауэр нужно настроить, и это, весьма несложно, но невероятно занудно. Но выбора нет :).
Для начала сконфигурируем брандмауэр для фильтрации траффика между локальными сетями и Интернетом. Пример ниже подразумевает существование двух локальных сетей, LAN1 и LAN2. Если их больше, то нужно будет создать больше правил для брандмауэра. Если меньше, то правил потребуется меньше.
Настройки для VPN рассмотрим чуть ниже.
Итак, создадим зоны для сетей WAN, LAN1 и LAN2:
set zone-policy zone WAN interface eth0
set zone-policy zone LAN1 interface eth1.2
set zone-policy zone LAN2 interface eth1.3
Разрешим все соединения из LAN1 в WAN, т.е. из локальной сети в интернет:
set firewall name LAN1_2_WAN description "LAN1 to WAN"
set firewall name LAN1_2_WAN default-action "drop"
set firewall name LAN1_2_WAN rule 10 action "accept"
set zone-policy zone WAN from LAN1 firewall name LAN1_2_WAN
А вот соединения из интернета в локалку запретим, кроме ответов на соединения инициированные из локалки:
set firewall name WAN_2_LAN1 description "WAN to LAN1"
set firewall name WAN_2_LAN1 default-action "drop"
set firewall name WAN_2_LAN1 rule 10 action "accept"
set firewall name WAN_2_LAN1 rule 10 state established "enable"
set firewall name WAN_2_LAN1 rule 10 state related "enable"
set zone-policy zone LAN1 from WAN firewall name WAN_2_LAN1
Запретим, для примера, исходящие соединения из LAN2 в интернет и обратно:
set firewall name LAN2_2_WAN description "LAN2 to WAN"
set firewall name LAN2_2_WAN default-action "drop"
set zone-policy zone WAN from LAN2 firewall name LAN2_2_WAN
set firewall name WAN_2_LAN2 description "WAN to LAN2"
set firewall name WAN_2_LAN2 default-action "drop"
set zone-policy zone LAN2 from WAN firewall name WAN_2_LAN2
Кстати, учитывая что мы не настроили NAT для LAN2, соединения с интернетом из этой подсети, входящие и исходящие все равно не будут работать. Но я предпочитаю идеально сконфигурированный брандмауэр.
Теперь разрешим совершать соединения из LAN1 в LAN2, но не обратно. Обратно разрешим только отвечать на установленные из LAN1 соединения:
set firewall name LAN1_2_LAN2 description "LAN1 to LAN2"
set firewall name LAN1_2_LAN2 default-action "drop"
set firewall name LAN1_2_LAN2rule 10 action "accept"
set zone-policy zone LAN2 from LAN1 firewall name LAN1_2_LAN2
set firewall name LAN2_2_LAN1 description "LAN2 to LAN1"
set firewall name LAN2_2_LAN1 default-action "drop"
set firewall name LAN2_2_LAN1 rule 10 action "accept"
set firewall name LAN2_2_LAN1 rule 10 state established "enable"
set firewall name LAN2_2_LAN1 rule 10 state related "enable"
set zone-policy zone LAN1 from LAN2 firewall name LAN2_2_LAN1
Подобным образом настраиваются правила фильтрации траффика между всеми подсетями. К примеру, если вы настроили удаленный доступ, то необходимо настроить правила для подсетей VPN. Пример конфигурации для OpenVPN:
set zone-policy zone OPENVPN interface vtun0
set firewall name OPENVPN_2_LAN1 description "OPENVPN to LAN1"
set firewall name OPENVPN_2_LAN1 default-action "drop"
set firewall name OPENVPN_2_LAN1 rule 10 action "accept"
set zone-policy zone LAN1 from OPENVPN firewall name OPENVPN_2_LAN1
set firewall name LAN1_2_OPENVPN description "LAN1 to OPENVPN"
set firewall name LAN1_2_OPENVPN default-action "drop"
set firewall name LAN1_2_OPENVPN rule 10 action "accept"
set zone-policy zone OPENVPN from LAN1 firewall name LAN1_2_OPENVPN
set firewall name OPENVPN_2_LAN2 description "OPENVPN to LAN2"
set firewall name OPENVPN_2_LAN2 default-action "drop"
set firewall name OPENVPN_2_LAN2 rule 10 action "accept"
set zone-policy zone LAN2 from OPENVPN firewall name OPENVPN_2_LAN2
set firewall name LAN2_2_OPENVPN description "LAN2 to OPENVPN"
set firewall name LAN2_2_OPENVPN default-action "drop"
set firewall name LAN2_2_OPENVPN rule 10 action "accept"
set firewall name LAN2_2_OPENVPN rule 10 state established "enable"
set firewall name LAN2_2_OPENVPN rule 10 state related "enable"
set zone-policy zone OPENVPN from LAN2 firewall name LAN2_2_OPENVPN
Данная конфигурация, в продолжение примера с нашими подсетями LAN1 и LAN2, разрешает двусторонний траффик между LAN1 и подсетью OPENVPN, а вот LAN2 сможет только отвечать на соединения инициированные из OPENVPN.
Port forwarding – брандмауэр
Следующий сет команд разрешит осуществить проброс траффика:
set firewall name OUTSIDE_2_LAN1 rule 10 action "accept"
set firewall name OUTSIDE_2_LAN1 rule 10 destination address "192.168.100.100"
set firewall name OUTSIDE_2_LAN1 rule 10 destination port "80"
set firewall name OUTSIDE_2_LAN1 rule 10 protocol "tcp"
set firewall name OUTSIDE_2_LAN1 rule 10 state new "enable"
Открытие портов для VPN
С этим делом существуют определенные непонятки. Дело в том, что в процессе изучения VyOS, я пользовался информацией из официальной документации и осуществлял настройку брандмауэра, открывающую порты для входящий VPN соединений. К примеру, для L2TP+IPSEC это выглядит так:
set firewall name WAN_2_LAN rule 40 action "accept"
set firewall name WAN_2_LAN rule 40 destination port "50"
set firewall name WAN_2_LAN rule 40 protocol "tcp_udp"
set firewall name WAN_2_LAN rule 41 action "accept"
set firewall name WAN_2_LAN rule 41 destination port "500"
set firewall name WAN_2_LAN rule 41 protocol "udp"
set firewall name WAN_2_LAN rule 42 action "accept"
set firewall name WAN_2_LAN rule 42 destination port "4500"
set firewall name WAN_2_LAN rule 42 protocol "udp"
set firewall name WAN_2_LAN rule 43 action "accept"
set firewall name WAN_2_LAN rule 43 destination port "1701"
set firewall name WAN_2_LAN rule 43 ipsec "match-ipsec"
set firewall name WAN_2_LAN rule 43 protocol "udp"
Впоследствии оказалось, что VPN работает и без этих правил. Я был этому весьма удивлен, и посоветовался с другом, экспертом в области сетевых технологий, по этому поводу. В отличие от меня, друг удивлен не был, и рассказал, что механизм перехвата траффика никак не регламентируется, и каждый вендор решает сам, в каком порядке обрабатываются входящие пакеты.
Т.е. кто-то может их сначала пропустить, через брандмауэр, и потом на VPN сервер, а кто-то наоборот. По сути то, если мы запустили VPN сервер, то ежу понятно, что порты, на которых он слушает должны быть открыты. Поэтому это никак не нарушает критерии безопасности системы.
Я не проверял детально, но вполне может оказаться, что разные версии VyOS могут вести себя по-разному касательно обсуждаемого аспекта. Из любопытства, я осуществил целый ряд проверок на предмет фильтрации входящего траффика – проблем не обнаружилось. Вдобавок, стоит учесть, что VyOS это серьезный продукт, используемый корпоративными пользователями, и далеко не бесплатно. Скачивая образ, читатель наверняка обратил внимание, что свежие версии VyOS недоступны для бесплатного скачивания. К счастью предпоследние релизы становятся достоянием общественности, правда, без возможности обратиться в службу поддержки. Ну и в целом, открытая база знаний VyOS не слишком полна и дружелюбна. В ней безусловно есть все основные фишки системы, но более продвинутые настройки приходится выискивать на форумах.
Заключение
За 2 года использования, VyOS показала себя прекрасно. После настройки и тестирования, раутер ни разу не нуждался во внимании. Он пережил несколько сбоев в электропитании, и после перезагрузки (длящейся меньше минуты), снова вступал в строй.
Функционал команды show log оказался очень кстати, для дебага и выяснения непоняток, когда что-то не хотело работать во время настройки.
Как я уже упоминал, необходимость осуществления продвинутой конфигурации может потребовать погуглить и покопаться на профессиональных форумах, но ответ, так или иначе находится.
Кстати, оказалось, что некоторые продукты ивестного производителся Ubiquiti используют OEM версию VyOS в качестве операционной системы.
В общем, как говорится, дорогу осилит идущий. Всем привет.