Site icon IT Draft

Защита Web-сервера с помощью UFW, WireGuard и Dnsmasq в Debian 11

Защита Web-сервера с помощью UFW, WireGuard и Dnsmasq в Debian 11

UFW + WireGuard + Dnsmasq

UFW (Uncomplicated Firewall) — это утилита для конфигурирования межсетевого экрана Netfilter. Она использует интерфейс командной строки, состоящий из небольшого числа простых команд.

В статье рассмотрен один из вариантов защиты Web севера, который показался мне интересным

Принцип действия следующий:

Установка и настройка WireGuard

Устанавливаем дистрибутив и генерим пару ключей

$ sudo apt install wireguard -y
$ sudo su
$ cd /etc/wireguard/
$ umask 077; wg genkey | tee privatekey | wg pubkey > publickey
$ exit

Редактируем конфиг wireguard

Selectel — ведущий провайдер облачной инфраструктуры и услуг дата-центров

Компания занимает лидирующие позиции на рынке на рынке выделенных серверов и приватных облаков, и входит в топ-3 крупнейших операторов дата-центров в России.


$ sudo nano /etc/wireguard/wg0.conf
[Interface]
PrivateKey = # Приватный ключ, который сгенерировали выше
Address = 172.16.22.1/24
ListenPort = 41821

[Peer]
PublicKey = # Публичный ключ клиента №1
AllowedIPs = 172.16.22.2/32

[Peer]
PublicKey = # Публичный ключ клиента №2
AllowedIPs = 172.16.22.3/32

Запускаем сервис и добавляем его в автозагрузку

$ sudo systemctl start wg-quick@wg0
$ sudo systemctl enable wg-quick@wg0

Настройка WireGuard на клиенте

Приводим конфиг wireguard к виду

[Interface]
PrivateKey = # Приватный ключ клиента, генерируется сам
Address = 172.16.22.2/32
DNS = 172.16.22.1

[Peer]
PublicKey = # Публичный ключ сервера
AllowedIPs = 172.16.22.1/32
Endpoint = itdraft.ru:41821
PersistentKeepalive = 25

Установка и настройка DNS-сервера Dnsmasq

Устанавливаем дистрибутив и редактируем конфиг

$ sudo apt -y install dnsmasq
$ sudo nano /etc/dnsmasq.d/dnsmasq.conf

# Слушаем интерфейс wireguard
listen-address=172.16.33.1
bind-interfaces

# не передавать значения из /etc/hosts
no-hosts

# подмена ip
address=/itdraft.ru/172.16.22.1

Перезапускаем сервис

$ sudo systemctl restart dnsmasq

Таким образом, при подключении по VPN, локальный DNS-сервер подменяет белый ip на серый.
Благодаря этому мы можем защитить админку сайта соответствующими настройками Nginx: разрешить доступ к директории только из сетки Wireguard

Осталось защитить SSH-порт

Установка и настройка UFW

Устанавливаем дистрибутив

$ sudo apt -y install ufw

Проверяем состояние UFW (по-умолчанию UFW не активен)

$ sudo ufw status verbose
Status: inactive

Задаем значения по умолчанию: запрещаем входящие соединения и разрешаем исходящие

$ sudo ufw default deny incoming
$ sudo ufw default allow outgoing

Добавляем правило: разрешаем подключение к ssh только из сети wireguard

$ sudo ufw allow proto tcp from 172.16.22.0/24 to any port 22

Открываем остальные порты

$ sudo ufw allow http
$ sudo ufw allow https
$ sudo ufw allow 41821/udp

Активируем UFW

$ sudo ufw enable

Другие команды UFW

Отключаем UFW

$ sudo ufw disable

Смотрим правила и удаление правило 2

$ sudo ufw status numbered
$ sudo ufw delete 2

Сбросить настройки

$ sudo ufw reset

Настройка связки UFW + Docker

Скачиваем утилиту ufw-docker, делаем её исполняемой и устанавливаем

$ sudo wget -O /usr/local/bin/ufw-docker https://github.com/chaifeng/ufw-docker/raw/master/ufw-docker
$ sudo chmod +x /usr/local/bin/ufw-docker
$ sudo ufw-docker install

Перезапускаем UFW

$ sudo systemctl restart ufw

Открываем web-порты

$ sudo ufw-docker allow 80
$ sudo ufw-docker allow 443

Но у меня заработала связка UFW + Docker после следующих действий:

Смотрим наши сети

$ docker network ls
NETWORK ID     NAME           DRIVER    SCOPE
639665111b6c   proj_default   bridge    local
5ff37bbe516b   bridge         bridge    local
421941e27957   host           host      local
8cf544723e76   none           null      local

Смотрим выделенный диапазон ip сети proj_default

$ docker inspect proj_default
...
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.21.0.0/16",
                    "Gateway": "172.21.0.1"
                }

...

Разрешаем входящий трафик для этой сети

$ sudo ufw allow in from 172.21.0.0/16
Exit mobile version