Повышаем безопасность домашнего сервера
Всем привет. Меня зовут Максим, и уже почти два года я содержу домашний сервер.
На данный момент использую его не только я. Многие сервисы находятся в публичном доступе, также я предоставляю виртуальные машины и много других чувствительных сервисов своим знакомым: дисковое хранилище, базы данных и тд. В связи с чем серьезно встает вопрос безопасности. В этой статье я расскажу про то, как я стараюсь обеспечивать безопасность в своей домашней сети.
Устройства
На данный момент в моей сети больше дюжины виртуальных машин, вот основные из них:
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=/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.