Пост

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

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

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

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

  • На сервере открываем входящие Web и VPN порты

  • Подключение по SSH разрешено при активной VPN сессии

  • Подключение к админке сайта разрешено при активной VPN сессии

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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
$ 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

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

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

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

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

1
2
3
4
5
6
7
8
9
10
[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

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

1
2
3
4
5
6
7
8
9
10
11
12
$ 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

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

1
$ sudo systemctl restart dnsmasq

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

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

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

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

1
$ sudo apt -y install ufw

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

1
2
$ sudo ufw status verbose
Status: inactive

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

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

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

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

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

1
2
3
$ sudo ufw allow http
$ sudo ufw allow https
$ sudo ufw allow 41821/udp

Активируем UFW

1
$ sudo ufw enable

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

Отключаем UFW

1
$ sudo ufw disable

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

1
2
$ sudo ufw status numbered
$ sudo ufw delete 2

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

1
$ sudo ufw reset

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

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

1
2
3
$ 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

1
$ sudo systemctl restart ufw

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

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

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

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

1
2
3
4
5
6
$ 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

1
2
3
4
5
6
7
8
9
10
11
$ docker inspect proj_default
...
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.21.0.0/16",
                    "Gateway": "172.21.0.1"
                }

...

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

1
$ sudo ufw allow in from 172.21.0.0/16
Авторский пост защищен лицензией CC BY 4.0 .

© IT Draft. Некоторые права защищены.