Повышаем безопасность домашнего сервера

04b23f0ac2151a4a505792b024ab65ba.png

Всем привет. Меня зовут Максим, и уже почти два года я содержу домашний сервер.

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

Устройства

На данный момент в моей сети больше дюжины виртуальных машин, вот основные из них:

  • 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

Укажем какие теги могут ходить через наш бридж:

  1. VLAN с номерами 11,17,20,21,22,77,99 могут проходить через порт ether2

  2. Если на ether2 приходит кадр без тега, считаем, что он относится к VLAN10

  3. Весь трафик приходящий на 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=/32
/ip/firewall/address-list/add list=Proxy address=/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:'

Вывод

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

По максимуму закрыли все порты и испольуем VPN для доступа к внутренней сети, по аналогии с VLAN-ами, лучше использовать несколько VPN-профилей и настраивать правила для каждого по-отдельности.

Если же, по какой-то причине, порт закрыть не получается, как у меня с Proxy, нужно заняться настройками безопасности того сервиса, который обслуживает этот порт, в моем случае это NGINX.

© Habrahabr.ru