Пост

Очень нам этот интернет ваш нужон!

Данный материал не является руководством (ни по настройке, ни к действию). Он описывает тот путь, который я прошел при решении некоторых проблем одной отдельно взятой локальной сети. Не преследую цели убедить кого-то в чем-то, просто делюсь своим опытом. Никаких четких инструкций, только принципы и направление куда копать, если оно вам надо

Проблематика

Ни для кого не секрет, что я работаю программистом и разрабатываю игры. Так вышло, что для организации доступа к внутренним рабочим ресурсам у нас используется Cisco AnyConnect VPN. По понятным причинам гнать через него весь трафик не есть хорошая практика, потому держать его постоянно включенным на компе - не круто. Так же не круто то, что у меня 2 ПК, телефон… и все это регулярно нуждается в подключении к рабочей сети для быстрого реагирования на какие-то непредвиденные обстоятельства. Не удобно, если честно

Так же все кто живут в РФ знают, что доступ в интернет стал интересным челенджем, если речь касается определенных ресурсов. Последней каплей лично в моей жизни стало то, что некая компания с русскими корнями, но чешской регистрацией ограничила скачивание своего софта для жителей нашей страны. Не будем называть имён, но все кто работает с популярными IDE знают о ком я. Есть опасения что по этому пути рано или поздно пойдут Unity и прочий софт, который я активно использую. Ограничение стоит извне для русских ip адресов и никак не связано с РКН. Но и РКН конечно добавляет в этот список определенные… Какой выход? Поднимаем где нибудь VPN или покупаем готовый… но опять же, устройств дома куча… гонять весь трафик - не круто. Включать и выключать постоянно VPN на устройствах тоже… надо помнить, что, где когда у тебя включено (у нас же еще есть рабочий VPN)

Помимо всего вышеозначенного у меня есть NAS… точнее был. Он изначально был не очень крутым парнем, но последнее время все стало очень плохо. Диски живы и прекрасно себя чувствуют, а вот сам NAS тупит, сетевые диски вечно отваливаются. Может уснуть и не проснуться… В общем пользоваться им для “удобного хранения семейного фотоархива” не очень удобно…

Сидел я сидел, смотрел на все это и думал… Придумал примерно следующее

У нас есть план!

Очевидно, что все перечисленное это проблема локальной сети и на уровне этой локальной сети должно решаться. Начал раскручивать проблемы я с NAS… погуглив, почитав, пришел к выводу… лучший софт (да и сами NAS) нынче у Synology. Но цены там такие, что просто жуть… Цены на NAS вообще нынче не очень божеские, но что поделать. Но вектор мысли уже был задан…

В сети есть такое поделие XPenology… способ поставить софт Synology на любую железку с подходящей архитектурой. “АГА!” сказали крутые сибирские мужики и пошли валить лес искать железку у китайцев на всем известную площадку? Почему именно китайцы? Потому что в моем первоначальном представлении мне нужен был корпус и материнка с возможностью удобной замены дисков, желательно с возможностью установки m.2 nvme диска под систему и гигабитной сетью (как минимум)… Поиск навел меня на вот эти два товара:

  1. Материнка BKHD 1264 nas - достаточно любопытная материнская платка для сугубо утилитарных целей

    image

    • 6 SATA портов, что для NAS огромный плюс
    • 2 NVME M.2 порта, причем нормального формфактора 2280, а не коротыши
    • 4 гигабитных порта… 4 КАРЛ!!! В то время как IBM официально очень стесняется располагать на одной плате даже два… то ли по соображениям патентов, то ли стандартов… Наши друзья из поднебесной ляпают по 4 порта (иногда дополняя их одним или двумя 2.5 гигабит) и не очень стесняются этого
    • Mini ITX форм фактор
    • Интегрированный n100 процессор. Не очень мощный, но и не арм малыш. Это полноценный камешек на энергоэффективных (малых) ядрах от Intel. Для утилитарных целей проц просто идеальный… к тому же очень холодный
  2. Корпус Jonsbo N2

    image

    • Поддержка Mini ITX материнок
    • Корзина под 5 полноразмерных дисков
    • Активное охлаждение этих самых дисков (есть нюансы)
    • Возможность установки нормального блока питания SFX форм фактора
    • Слот под 2.5 диск (итого в сумме 6 sata - это судьба)

Такую материнку тратить только на NAS было бы кощунством, потому, вспомнив про другие две проблемы… я подумал: “А чего бы из этого еще и роутер то не сделать?”

И пошел опять гуглить

Немного про железки которые шлют пакеты

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

  1. Поднятие отдельных каналов VPN как сетевых интерфейсов
  2. Поддержку всевозможных прокси решений и обертку их как сетевых интерфейсов (например VLESS и Shadowsocks это сугубо прокси решения, а не полноценные VPN)
  3. Возможность гибко настраивать роутинг основываясь на доменных именах

Гугление показывает… что все это на базе обычных роутеров собрано может быть и идеальной для этого системой является OpenWRT… Но как правило слабым местом в таких сборках является процессор устройства. Они как правило не очень производительные. При большом количестве wifi подключений проц в целом может сильно нагружаться… А несколько VPN каналов и хитрая маршрутизация может положить на лопатки достаточно мощный роутер… К тому же у имеющегося Zyxel поддержки OpenWRT нет, а вышеозначенные требования из коробки выполняются с огромными бубнами, костылями и по отзывам работают очень нестабильно, все с той же упоркой в процессор

В виду всего этого было решено ставить роутер на ту же материнку что и NAS, а из моего роутера сделать точку доступа

Пытливый ум тут же задаст вопрос “Андрей, ты с дуба рухнул? NAS и внешний интерфейс на одной машине? ЭТО ЖЕ НЕ БЕЗОПАСНО!” И тут мы приходим к идее виртуализации.

  1. На машинку ставим гипервизор Proxmox, выделяя ему отдельный сетевой порт под его нужды
  2. Заводим внутри него машинку под роутер, отдав на откуп ей два порта (само собой не настраивая их в рамках материнской системы)
  3. Заводим машинку под NAS, отдав ей напрямую управление HDD и оставшийся порт (так же без настройки в материнской системе)
  4. Теоретически можно завести еще несколько виртуалочек под разные нужды, главное чтоб вычислительных мощностей хватило… у меня заведена дополнительная дебиан система под докер и прочие эксперименты

Как итог, внешний порт не имеет IP адреса на уровне родительской системы. Единственное куда с него можно попасть - это внутренняя система роутера. Там файервол и прочие штуки, как в обычном роутере. Да, они по прежнему на одном камне, уязвимости, бла бла бла… но такого уровня безопасности с головой хватает, учитывая то, что финансово я органичен =)

Да, по финансам, собрать комп стоило 42 тысячи российских рублей, что (в сравнении с NAS системами) не очень то и дорого… учитывая, что на сдачу я получил полноценный роутер и неплохой гипервизор в рамках сети

Скорее всего в будущем я перейду на структуру сети, в которой роутер будет совсем отдельной железкой, на базе чего то типа NanoPI r4s или подобных мини пк, а в текущую сборку переедет личный git, который сейчас живет в рамках vps и постоянно жалуется, что вот вот кончится место… но это вопросы достаточно далекого будущего

Как работает роутинг?

Как я уже писал выше, маршруты должны работать из локальной сети автоматом, при этом без моего вмешательства в роутинг на уровне ip адресов. Я ленивая тварь, хочу тупо загнать списки доменов какой куда будет идти и не парится. Задачу разбиваем на две подзадачи

1. Точечная маршрутизация по доменным именам

Тут нам на помощь приходит такая связка как dnsmasq и nftables. Обе есть в стандартной поставке OpenWRT, потому речь пойдет о них. Подробные гайды как это работает можно найти в сети в большом количестве, но если коротко… то настраивается все примерно так:

  • dnsamasq (выступая dns сервером сети) при ресолвинге доменных имён складывает их в специальный ip set, если доменное имя подходит под правила. Заводим такие правила и ip set под каждый канал, через который хотим водить наш трафик
  • nftables (выступая сетевым фильтром) метит пакеты отправленные на ip попавшие в в определенные ip set (которые мы создавали ранее) определенной меткой и после отправляет все помеченные пакеты в определенный в нужный нам туннель
  • если пакеты никак не помечены, они идут напрямую в основной канал

Данные действия производятся один раз. В последствии может понадобиться только изменение правил маршрутизации и списков доменных имён, если поменяются внешние условия.

Да, знающие люди скажут, что тот же Openconnect умеет маршрутизировать трафик самостоятельно, говоря клиенту - вот такие домены мне интересны, а вот такие нет… Так же это умеют много какие технологии туннелирования, но если начинать работать с ними таким образом, система становится зоопарком решений и теряет всяческие намёки на системность. Потому маршрутами у нас занимается этот слой абстракции. Плюсом к этому можно метить пакеты теми же метками по другим каким то условиям. Пакет с определенного клиента в сети, пакет на определенный ip и так далее.

В стандартную поставку dnsamasq не входит работа с ip set, но его можно обновить установив пакет dnsamasq-full

2. Туннели

На этом уровне абстракции мы работаем с виртуальными туннелями или выходами в сеть. В рамках OpenWRT у нас есть девайсы и интерфейсы. Девайсы это сетевые интерфейсы (включая даже tun интерфейсы) определенные на уровне самой системы. Интерфейсы же это некая более высокая система абстрагирования, которая может в себе объединять даже несколько сетевых интерфейсов (как это делается с lan портами). Так вот на уровне маршрутов мы можем работать только с такими интерфейсами, а это возможно далеко не всегда. Что заведено у меня:

  1. Рабочий VPN. Так как на работе у меня используется Cisco Anyconnect, я взял пакет luci-proto-openconnect, который позволяет не только создавать VPN канал, но и настраиваеть его непосредственно из web интерфейса роутера. Мега удобная штука. При подключении опенконнекта к циске могут возникнуть вопросы, так как протоколы хоть и совпадают, есть нюансы. Так например в рабочем VPN у нас два способа авторизации: OAuth через гугл аккаунт и доступ по паролю. В рамках cisco клиента настраивается это посредством изменения url. А вот на уровне самого протокола - это разные авторизационные группы и в случае с Openconnect ее надо указывать явным образом

Если возьметесь настраивать это дело (свой VPN или может на вашей работе тоже используется Cisco AnyConnect), очень рекомендую использовать Openconnect Client GUI для отладки подключения. Софтина очень умная и при коннекте подсказывала мне, что есть две авторизационные группы и даже показывала их id чтоб я мог выбрать между ними. Официальный клиент такой гибкостью не обладает

  1. Личный VPN. Тут уже достаточно честно собранный из исходников Openconnect Server поднятый в Сербии. Нужен мне не столько для обхода чего либо, сколько для доступа к некоторым сервисам, которым не очень нравится откуда я к ним выхожу. Так как это не Cisco, а непосредственно сам Openconnect, то клиент к нему цепляется достаточно просто

  2. В качестве эксперимента поднят SOCKS5 прокси. Так ка многие VPN протоколы подразумевают поднятие именно прокси, а не отдельного канала. Но нам то нужен интерфейс, полноценный… а не прокси висящая на каком то порту. Да и далеко не весь внешний софт умеет так работать. В общем тут на помощь приходит такая штука как sing-box. Есть в репозитории OpenWRT. По сути может конвертировать что угодно почти во что угодно. Вам нужно сделать из опенконнекта сокс прокси? Оно так может. Из vless впн нормальный тунель на уровне интерфейса? Тоже может. В общем с помощью нее я обернул SOCKS5 проксю (в моем случае достаточно известный в наше время ByeDPI) в нормальный tun интерфейс

Важная оговорка. sing-box хоть и создает интерфейс, на уровне системы роутера это будет девайс. Чтоб нормально с ним работать в рамках построения маршрутов и правил нужно создать в веб интерфейса unmanaged интерфейс и обернуть им девайс, который создает sing-box

  1. Непосредственно PPPOE подключение провайдера, через которое все это великолепие и имеет доступ в сеть

Примерно так это все выглядит в веб интерфейсе, если кому то интересно (на самом деле просто текста много, нужна картинка)

image

А начинал ты с NAS…

Да, основная цель все таки было решение проблемы с хранением и ее я решил даже лучше, чем вообще ожидал. Собранный комп, хоть и является достаточно слабеньким по меркам даже офисных компов с утилитарными задачами справляется просто на ура

NAS работает очень стабильно, не смотря на тех же дисках предыдущий нас постоянно “ломался” - скорость доступа к данным очень радует. В поставку synology просто какое то чудовищное количество разнообразных пакетов и софта. Эта штука автоматически качает торренты, позволяет заводить отдельные квоты на файлы разных пользователей, вести отдельные папки, каталогизировать фото, выступает медиа сервером и еще умеет ооочень много чего, с чем я пока даже не успел столкнуться. Если бы я был чуть богаче, вероятно я купил бы себе их полноценный NAS, потому как тогда я получил бы еще и доступ к своему хранилищу из любой точки мира где есть инет через облако… Но вероятно это можно будет решить белым ip и пробросом портов…. но уже даже на этом уровне это просто на две головы круче чем то, что у меня было

Вместо заключения

Теперь, когда всяческие инфраструктурные моменты меня больше не заботят… Я возвращаюсь к работе над проектом… и следующий пост будет именно о игре, а не о чем то другом =)

Авторский пост защищен лицензией CC BY 4.0 .