Всем привет. Меня зовут Максим, и уже почти два года я содержу домашний сервер.
На данный момент использую его не только я. Многие сервисы находятся в публичном доступе, также я предоставляю виртуальные машины и много других чувствительных сервисов своим знакомым: дисковое хранилище, базы данных и тд. В связи с чем серьезно встает вопрос безопасности. В этой статье я расскажу про то, как я стараюсь обеспечивать безопасность в своей домашней сети.
Устройства
На данный момент в моей сети больше дюжины виртуальных машин, вот основные из них:
Proxy - входная точка для всех моих веб-сайтов
Машина для контейнеров (пет-проекты, базы данных и другие сервисы)
Media сервер, на котором крутится Deluge и Samba шара
3 машины под Kubernetes-кластер
2 инстанса Zabbix
3 виртуалки, которые я раздал знакомым
Также есть отдельная машина под CA, Windows 10, которая иногда используется как рабочее место через RDP, OpenVPN сервер и др. В данной статье я рассмотрю только основные машины.
Первое, что мы сделаем - логически разделим машины по группам и изолируем сети с помощью VLAN
Машина |
Подсеть |
Proxy, Машина с контейнерами |
VLAN 10 |
Media сервер |
VLAN 11 |
Kubernetes кластер |
VLAN 17 |
Выделенные виртуальная машина 1 |
VLAN 20 |
Выделенные виртуальная машина 2 |
VLAN 21 |
Выделенные виртуальная машина 2 |
VLAN 22 |
Proxmox |
VLAN 77 |
Zabbix, Рабочий компьютер |
VLAN 99 |
Почти все мои контейнеры - это веб-приложения, поэтому я объединил Proxy и Машину с контейнерами в одну подсеть VLAN10
Из двух Zabbix-ов только один обслуживает мою сеть, и располагаться он будет в админском VLAN99, также сюда я кину свой рабочий комп
В общем случае, все подсети для которых требуются специальные правила, должны иметь свой VLAN-тег, чтоб трафик можно было отличать.
Настройка роутера Mikrotik
Создание VLAN
Первое что мы сделаем - создадим bridge для наших VLAN
/interface/bridge/add name=bridge-vlan
Добавим в наш бридж порты
/interface/bridge/port/add bridge=bridge-vlan interface=ether2 pvid=10
/interface/bridge/port/add bridge=bridge-vlan interface=ether3 pvid=99
В данном случае за ether2 находится Proxmox и тег прописывать не обязательно, т.к весь трафик оттуда почти всегда будет тегирован, но если это не так, с помощью этой настройки он будет по-умолчанию определен к VLAN10
За ether3 находится рабочий компьютер, который как указано выше относится к VLAN99
Укажем какие теги могут ходить через наш бридж:
VLAN с номерами 11,17,20,21,22,77,99 могут проходить через порт ether2
Если на ether2 приходит кадр без тега, считаем, что он относится к VLAN10
Весь трафик приходящий на ether3 относится к VLAN99
/interface/bridge/vlan
add bridge=bridge-vlan tagged=bridge-vlan,ether2 vlan-ids=11,17,20,21,22,77,99
add bridge=bridge-vlan tagged=bridge-vlan untagged=ether2 vlan-ids=10
add bridge=bridge-vlan untagged=ether3 vlan-ids=99
Создадим интерфейсы для наших VLAN-ов
Общий шаблон команды
/interface/vlan/add name=vlanX vlan-id=X interface=bridge-vlan disabled=no
Где X - номер VLAN-a
Теперь нужно назначить адреса VLAN-интерфейсам
Я использую вот такой шаблон 192.168.X.0 (где X - номер VLAN)
/ip/address/add address=192.168.10.1/27 interface=vlan10
/ip/address/add address=192.168.11.1/29 interface=vlan11
/ip/address/add address=192.168.17.1/27 interface=vlan17
/ip/address/add address=192.168.20.1/30 interface=vlan20
/ip/address/add address=192.168.21.1/29 interface=vlan21
/ip/address/add address=192.168.22.1/29 interface=vlan22
/ip/address/add address=192.168.77.1/30 interface=vlan77
/ip/address/add address=192.168.99.1/27 interface=vlan99
Настройка DHCP
Создадим пулы адресов, которые будут выдаваться клиентам
/ip/pool/add name=vlan10-pool ranges=192.168.10.2-192.168.10.30
/ip/pool/add name=vlan11-pool ranges=192.168.12.2-192.168.11.6
/ip/pool/add name=vlan17-pool ranges=192.168.17.2-192.168.17.30
/ip/pool/add name=vlan20-pool ranges=192.168.22.2
/ip/pool/add name=vlan21-pool ranges=192.168.21.2-192.168.21.6
/ip/pool/add name=vlan22-pool ranges=192.168.22.2-192.168.22.6
/ip/pool/add name=vlan77-pool ranges=192.168.77.2
/ip/pool/add name=vlan99-pool ranges=192.168.99.2-192.168.99.30
Непосредственно создание DHCP серверов
/ip/dhcp-server/add address-pool=vlan10-pool disabled=no interface=vlan10 name=vlan10-dhcp
/ip/dhcp-server/add address-pool=vlan11-pool disabled=no interface=vlan11 name=vlan11-dhcp
/ip/dhcp-server/add address-pool=vlan17-pool disabled=no interface=vlan17 name=vlan17-dhcp
/ip/dhcp-server/add address-pool=vlan20-pool disabled=no interface=vlan20 name=vlan20-dhcp
/ip/dhcp-server/add address-pool=vlan21-pool disabled=no interface=vlan21 name=vlan21-dhcp
/ip/dhcp-server/add address-pool=vlan22-pool disabled=no interface=vlan22 name=vlan22-dhcp
/ip/dhcp-server/add address-pool=vlan77-pool disabled=no interface=vlan77 name=vlan77-dhcp
/ip/dhcp-server/add address-pool=vlan99-pool disabled=no interface=vlan99 name=vlan99-dhcp
Пропишем параметры которые будут получать клиенты DHCP (default-gateway, DNS)
/ip/dhcp-server/network/add address=192.168.10.0/27 gateway=192.168.10.1 dns-server=192.168.10.1
/ip/dhcp-server/network/add address=192.168.11.0/29 gateway=192.168.11.1 dns-server=192.168.11.1
/ip/dhcp-server/network/add address=192.168.17.0/27 gateway=192.168.17.1 dns-server=192.168.17.1
/ip/dhcp-server/network/add address=192.168.20.0/30 gateway=192.168.20.1 dns-server=192.168.20.1
/ip/dhcp-server/network/add address=192.168.21.0/29 gateway=192.168.21.1 dns-server=192.168.21.1
/ip/dhcp-server/network/add address=192.168.22.0/29 gateway=192.168.22.1 dns-server=192.168.22.1
/ip/dhcp-server/network/add address=192.168.77.0/30 gateway=192.168.77.1 dns-server=192.168.77.1
/ip/dhcp-server/network/add address=192.168.99.0/27 gateway=192.168.99.1 dns-server=192.168.99.1
Настройка гипервизора
Я использую Proxmox в качестве гипервизора, настройка VLAN в нем очень простая.
Содержимое файла /etc/network/interfaces
auto lo
iface lo inet loopback
iface enp5s0 inet manual
auto vmbr0
iface vmbr0 inet manual
bridge-ports enp5s0
bridge-stp off
bridge-fd 0
bridge-vlan-aware yes
bridge-vids 2-4094
auto vmbr0.77
iface vmbr0.77 inet dhcp
vmbr0 - Linux Bridge, который настроен на работу с VLAN. Все виртуальные машины присоединены к этому мосту и им можно присвоить тег VLAN.
Машины, у которых VLAN Tag пустой будут отправлять нетегированный трафик.
vmbr0.77 - Это интерфейс, через который происходит взаимодействие с самим Proxmox. Через точку указывается тег VLAN ()
Итак, VLAN-ы созданы, трафик тегируется, но сети все еще не изолированы.
Firewall правила для VLAN
Фаервол в Mikrotik настраивается точно также как и iptables
VLAN99, в котором находится Zabbix и рабочая станция должны иметь доступ ко всей сети.
Создадим группу интерфейсов, в терминологии Mikrotik она называется Interface List, и добавяим туда VLAN99
/interface/list/add name=ADMIN
/interface/list/member/add interface=vlan99 list=ADMIN
Для группы применяем разрешающее правило
/ip/firewall/filter/add chain=forward action=accept in-interface-list=ADMIN
В моем случае, Proxy должен иметь доступ к некоторым сервисам вне своей сети, но для него правило будет жестче. Приводить его я не буду.
Остальные VLAN-ы должны быть изолированы друг от друга
Создадим еще одну группу интерфейсов
/interface/list/add name=VLAN
Добавим в нее наши VLAN-интерфейсы
/interface/list/member/add interface=vlan10 list=VLAN
/interface/list/member/add interface=vlan11 list=VLAN
/interface/list/member/add interface=vlan17 list=VLAN
/interface/list/member/add interface=vlan20 list=VLAN
/interface/list/member/add interface=vlan21 list=VLAN
/interface/list/member/add interface=vlan22 list=VLAN
/interface/list/member/add interface=vlan77 list=VLAN
/interface/list/member/add interface=vlan99 list=VLAN
И создадим запрещающее правило
/ip/firewall/filter/add chain=forward action=drop in-interface-list=VLAN out-interface-list=!WAN
Тем самым разрешаем пересылать пакеты из VLAN только в Интернет.
Доступ к сети извне. Настройка VPN
В Mikrotik теперь есть возможность создавать Wireguard сервер. Мне нравится, что он простой, легкий и прозранчый, поэтому использовать я буду его.
Для начала определим группы клиентов. На каждую из групп будет отдельный профиль (интерфейс)
Админские устройства
Устройства семьи
2 группы под устройства моих знакомых для подключения к сетям их виртуальных машин.
/interface/wireguard/add listen-port=12111 name=wireguard-admin
/interface/wireguard/add listen-port=12112 name=wireguard-family
/interface/wireguard/add listen-port=12113 name=wireguard-tolya
/interface/wireguard/add listen-port=12114 name=wireguard-leha
Wireguard-интерфесам необходимо назначить адреса
/ip/address/add address=10.99.0.1/29 interface=wireguard-admin
/ip/address/add address=10.12.0.1/27 interface=wireguard-family
/ip/address/add address=10.21.0.1/29 interface=wireguard-tolya
/ip/address/add address=10.22.0.1/29 interface=wireguard-leha
Настройку пиров я опущу, ради экономии букв, и вернемся к Firewall-у
Firewall правила для VPN
Для работы Wireguard нужно открыть порты
/ip/firewall/filter/add chain=input action=accept protocol=udp dst-port=12111,12112,12113,12114
Добавим интерфейс wireguard-admin в группу ADMIN, тем самым дав доступ ко всей сети.
Samba-сервер и Proxy будут доступны для группы Family
Дабы не привязываться к айпишникам машин можно создать группу устройств, в терминологии Mikrotik - Address List
/ip/firewall/address-list/add list=Media address=<media-server-ip>/32
/ip/firewall/address-list/add list=Proxy address=<proxy-server-ip>/32
И прописать правила
/ip/firewall/filter/add chain=forward action=accept dst-address-list=Media protocol=tcp dst-port=139,445 in-interface=wireguard-family
/ip/firewall/filter/add chain=forward action=accept dst-address-list=Proxy protocol=tcp dst-port=80,443 in-interface=wireguard-family
Арендуемые машины будут доступны через соотвествующие Wireguard-интерфейсы
/ip/firewall/filter/add chain=forward action=accept dst-address-list=TolyaMachines in-interface=wireguard-tolya
/ip/firewall/filter/add chain=forward action=accept dst-address-list=LehaMachines in-interface=wireguard-leha
Остальных Wireguard-клиентов нужно изолировать друг от друга
По классике, создаем группу интерфейсов WIREGUARD
/interface/list/add name=WIREGUARD
Добавляем туда наши Wireguard-интерфейсы
/interface/list/member/add interface=wireguard-admin list=WIREGUARD
/interface/list/member/add interface=wireguard-family list=WIREGUARD
/interface/list/member/add interface=wireguard-tolya list=WIREGUARD
/interface/list/member/add interface=wireguard-leha list=WIREGUARD
Создаем запрещающее правило
/ip/firewall/filter/add chain=forward action=drop in-interface-list=WIREGUARD
Сайты
Некоторые из расположенных у меня сайтов доступны из сети, для этого к Proxy проброшены 80 и 443 порты.
На роутере работает DNS сервер, который резолвит имена внутренних сервисов и машин.
В NGINX, для доменов, которые должны быть доступны только внутри сети, нужно прописать ограничения на Source Address
Чтоб ограничить IP-адреса, можно использовать директивы deny и allow
Вот часть файла конфигурации сайта
server {
allow 192.168.0.0/16; # доступ внутри сети
allow 10.0.0.0/8; # доступ по VPN
deny all;
....
Если данных действий не предпринять, можно получить доступ к сайту из Интернета, путем подстановки домена через локальный DNS или, например, через CURL
curl http://SOME.INTERNAL.SERVICE --resolve 'SOME.INTERNAL.SERVICE:80:<public-ip>'
Вывод
С помощью VLAN мы смогли создавать правила по движению трафика внутри нашей сети и логически разделить подсети, что позволит ограничить зону поражения при взломе.
По максимуму закрыли все порты и используем VPN для доступа к внутренней сети, по аналогии с VLAN-ами, лучше использовать несколько VPN-профилей и настраивать правила для каждого по-отдельности.
Если же, по какой-то причине, порт закрыть не получается, как у меня с Proxy, нужно заняться настройками безопасности того сервиса, который обслуживает этот порт, в моем случае это NGINX.
Комментарии (47)
Vaitek
13.06.2024 15:11+4А я бы на фото посмотрел, как организованна стойка, кабель менеджмент, охлаждение, звукоизоляция...
Alexsey
13.06.2024 15:11Это все, при наличии бюджета, в общем-то можно уместить в один ATX системник + микрот закинуть сверху. Если бюджета нет, то два ATX системника с б/у зеонами. Хотя может с б/у эпиками можно и в один корпус уже уложиться. Упихать это в корпус fractal define и с шумом и охлаждением проблем особо не будет.
nidalee
13.06.2024 15:11+1В зеоны влезать особого смысла нет, на али уже эпики продают. Да и смысл? Какие задачи крутить на нескольких NUMA-нодах? У меня 3900Х в "сервере" простаивает большую часть времени (к сожалению).
А вот файлопомойка - другое дело. В Fractal Design R5 влезает при большом желании 14 HDD - проверял лично. Дальше без рэкового корпуса расти, вроде, некуда.
Alexsey
13.06.2024 15:11Ну у автора дофига виртуалок, я исходил из мысли не шарить ядра между виртуалками.
В R5 упихать больше 10 3.5" сейчас уже проблематично будет, вторую корзину и салазки к ней искать даже не представляю где, если только печатать на 3д принтере. Даже до 2022 уже вопросы возникали с тем где искать запчасти к нему, мне саппорт производителя еле-еле салазки на замену нашел.
nidalee
13.06.2024 15:11+2Ну у автора дофига виртуалок, исходил из мысли не шарить ядра между виртуалками.
Есть подозрение, что они тоже с хорошим таким простоем :)
В R5 упихать больше 10 3.5" сейчас уже проблематично будет, вторую
корзину и салазки к ней искать даже не представляю где, если только
печатать на 3д принтере.О 3D принтере и не думал даже, кстати. 8 туда влезает их коробки, еще 3 добиваем через 5.25 бей, а слева от стойки с HDD влезает еще рандомная с aliexpress. Слегка перекрывает материнскую плату справа снизу, но 3-4 диска добавить туда не проблема. У меня вот такая. Прикрутить ее можно через отверстия для вентиляции, но лично я даже и не заморачивался - она там без винтов встает плотно.
Alexsey
13.06.2024 15:11У меня только два влезло в 5.25. Ну наверное можно извратиться с каким-нибудь хитрым адаптером, я просто 5.25 -> 3.5 в оба слота впихнул. А вот за ссылку на корзину спасибо, надо прикупить.
nidalee
13.06.2024 15:11Вот в такого красавчика влезает 3 HDD. Не знаю, можно его сейчас купить или нет.
vikarti
13.06.2024 15:11У меня нечто подобное :)
Только: DHCP раздает AdGuard Home + есть еще OPNsense и всем "пользовательским" машинам (они в другом VLAN) адреса раздает по DHCP уже OPNsense. хардварный Mikrotik сейчас чисто подключения к провайдерам держит и NAT + VPN-туннель к CHR (даже правила что в туннель уже сделаны не схеме с хабра с BGP от антифильтра и микротике а на OPNsense, так удобнее). А стойка...плохо она организована.
GennPen
13.06.2024 15:11+1Что то не понятно. Это с каждой новой виртуалкой нужно лезть в настройки сети гипервизора и коммутатора чтобы добавить для нее VLAN? Не проще ли на уровне фаервола изолировать виртуалки?
M_AJ
13.06.2024 15:11Да, это очень странный момент, с учетом того, что в Proxmox есть SDN, и разделять виртуалки можно там, лишний раз не заходя в настройки роутера.
GennPen
13.06.2024 15:11Тут предложенный PVLAN тоже подойдет. Раньше не задумывался о нем, а сейчас опробовал - выглядит очень даже неплохо. Изолированные порты, все дела, даже фаервол не нужно настраивать для изоляции.
Danismind
13.06.2024 15:11И еще небольшой вопрос: предположим Вас атаковали, как Вы будете восстанавливаться?
NikaLapka
13.06.2024 15:11+6То чувство, когда после клика на заголовок, хотел увидеть рассуждения на тему: можно ли всё выше перечисленное сделать на одном единственном сетевом адаптере, или Best Practice всегда подразумевает наличие отдельного физического сетевого адаптера для управления(это не вопрос организации xLAN, а безопасности эмуляции и гипервизоров), или безопасно ли использовать stable пакеты вроде(Debian 12 stable) nginx 1.22.1, OpenVPN 2.6.3, php-fpm 8.2,.. или лучше всегда устанавливать приложения, принимающие соединения, из официальных репозиториев, с актуальной stable версиях, для своевременного ответа CVE,.. но вместо этого увидел лишь очередной пример, конфигурации VLAN'ов на RouterOS. Разочарован.
poige
13.06.2024 15:11+1это даже how-to назвать сложно, скорее записки для себя как-чего настроил. Без ответов/размышлений про отчего и зачем. Никакого ядра концепта, просто деревья леса.
NutsUnderline
13.06.2024 15:11+1все таки не совсем простой материал и структура тяжеловата для понимания, я бы выводы перенес в начало или понятными подзаголовками "делаем так чтобы виртуалки имели доступ в интернет но не имели доступа друг-другу", "настраиваем виртуалки для Лехи и Толи", "защищаем сайт от ненужного доступа"
Keeper10
13.06.2024 15:11+1Proxy - входная точкой для всех моих веб-сайтов
Машина для контейнеров (пет-проекты, базы данных и другие сервисы)
Media сервер, на котором крутится Deluge и Samba шара
3 машины под Kubernetes-кластер
2 инстанса Zabbix
3 виртуалки, которые я раздал знакомым
Надеюсь, всё это запущено на том же микротике?
LeMaX
13.06.2024 15:11+1По собственному опыту, как начал греться домашний роутер, пришел к тому, что палить свой реальный IP паршивая затея. Купил за 200 в месяц виртуалку внешнюю, через которую завернул весь трафик не домашний сервер.
Он и по гео все запросы отсекает, и по спискам на всякий.
Antra
13.06.2024 15:11+1Точно! Одна маленькая виртуалка сразу кучу задач решает
На ней и nginx/traefik как реверс прокси. Одна точка входа для разных внутренних сервисов, расположенных на разных домашних виртуалках. И letsencrypt.
И даже проброс acme challenge для letsencrypt в Кубере, чтобы на ингрессе своем дома тоже актуальые сертификаты держал.
И Zerotier еще, чтобы подключения были через нее, свою, а не через кого-то. А с нее домой уже по стандартному туннелю (исходящий Wireguard, к примеру, и дома хоть динамический IP за Hide NAT - все равно все хорошо работает).
LeMaX
13.06.2024 15:11Да! На внешней виртуалке у меня как раз nginx как реверс прокси версия от сообщества lua antiddos типа с защитой l7, но не проверял, по geoip запретил популярные направления типа Ирана, Китая и т п…
Домашний сервер из вне порты 22/80/443 фаерволом закрыты на доступ только с внешней виртуалки и локальной сети, роутер через встроенный hosts заворачивает все домашние адреса в локалку когда к нему подключен. Получается когда дома подключен по вайфай хожу в домашнее облако по тому же адресу, но по локалке, а как выхожу за пределы домашней сети, запросы по тому же адресу уже летят через внешнюю виртуалку.
werter_l
13.06.2024 15:11Спасибо, то переборщили с влан (
Я бы упростил до такой схемы:
- proxmox ve (pve) в кач-ве гипервизора;
- pfsense\opnsense в ВМ как роутер\ впн\ idps;
- разнес бы ВМ по разным сетевым интерфейсам, создав нужное кол-во бриджей на pve БЕЗ привязки к физ. сетевым , затем добавив их к pfsense\opnsense и нужной ВМ;
- для единой точки входа извне можно пользовать vpn и\или Apache Guacamole или Kasm Workspaces
Всё. Избавились от микрота и "каши" с vlan.
Зы. Для ви-фи пользую кинетик или шитые в кинетик сяоми (дешевле в 2+ раза - 4 пда в помощь).
Зы2. Железка такая (в комментах под товаром есть как просто улучшить охлаждение)
Apv__013
Ужас то какой. Называть это "домашним" сервером язык не поворачивается. Зачем всё это дома?
goth
Сначала ты поднимаешь временно пару виртуалок на старой железке..а дальше - всё как в тумане, и ты уже счастливый владелец десятка-двух серверов и жить без них как-то очень неудобно...))
pae174
Я так в 2003 году хостинговую компанию в чулане накреативил, и в 2005 продал вместе с примерно 1000 клиентов.
Dick_from_mountain
Чулан или компанию продал?
Turbo_Pascal_55
Клиентов - налоговой.
HumbleCommentor
Что такое чулан?
PabloP
Креативное пространство с небольшими ограничениями и налетом ретро, где ваши кейсы получат неожиданное развитие без внешнего коучинга.
Dolios
Организуем садовый инвентарь на даче:
экскаватор с траншеекопателем убираем в быстровозводимый ангар
для двух теплиц, которые я сдал в аренду знакомым делаем отдельные входы, чтобы не шлялись по участку
устраиваем 24/7 видеонаблюдение с будкой охранника в гараж на 8 машин
строительство насосной станции оставляем на следующий дачный сезон
)))
PereslavlFoto
Траншеекопатель на дачах штука обычная, ведь без него не проложишь даже водопровод. Теплицы для знакомых постепенно появляются, когда два соседа строят одну теплицу. Видеонаблюдение давно уже стало привычной штукой, а насосные станции работают на участках, сколько я себя помню.
Dolios
В 90-е у нас тоже была фазенда с теплицами. Теперь для меня дача, это газон и ёлки с берёзками.
kenomimi
Тоже когда-то держал такое дома)
Потом купил сервак за три копейки (а Х79 стоят как металлолом, несмотря на то, что для дома там мощи за глаза), набил его на топ-конфиг - это тоже почти бесплатно, и поставил в колокейшн. Ну его нафиг, держать железо дома - шум, постоянные отказы из-за пыли и статики, ну и электричества он нажирает ровно на те же 3к, что плачу за место в серверной и 100мбит анлим.
Зачем? Видеонаблюдение на 10 камер. Умный дом (openhab). Независимый от вендора музыкальный плеер. Почта, календарь, контакты, жаббер - последний для уведомлений от систем. Несколько десктопных виртуалок для экспериментов по работе. Свой гитлаб, свои репы жавы, докера, и прочее, сейчас вот надо еще сделать зеркала дебиана и арча. Файловый сервер. Фотоальбом а-ля гугл фото. Система бекапа всего с бекконектом. Еще десятка два всякой мелочевки, нужной в работе... Всё это завернуто в ipsec и видно только изнутри, снаружи торчит только почта и ipsec.
Это чертовски удобно, когда разберешся в теме и настроишь.
maxitop
>>Фотоальбом а-ля гугл фото
А какое именно ПО в качестве фотоальбома используете?
kenomimi
Photoprism. Там и в браузере удобно смотреть, и приложения есть, и видео можно держать. Кто бы еще бесшовную синхронизацию как в гугле прикрутил... Умеет индексировать картинки, распознавать их и тегировать - но я этот функционал не гонял.