notby.NET Logo

Утилита UFW для настройки и конфигурации файрвола в Linux

В ядро Linux уже встроен межсетевой экран (Firewall) netfilter. Для управления им используются утилиты iptables, nftables и самая последняя разработанная ufw (Uncomplicated Firewall). Название утилиты переводится как “незамысловатый файрвол”, таким он и является. Утилиты ufw полностью достаточно, чтобы настроить защиту для своего компьютера и сервера, открыть порт или заблокировать определенный IP-адрес.

Все действия выполняются от root пользователя или с его привилегиями через sudo.

su -

1. Установка ufw

Устанавливаем ufw в Debian/Ubuntu

apt install ufw

Устанавливаем ufw в Arch Linux

pacman -S ufw

В других Linux дистрибутивах происходит установка через свой пакетный менеджер. Настройка ufw происходит одинаково во всех дистрибутивах Linux.

2. Включение ufw и начальная настройка

2.1. Поведение по умолчанию

По умолчанию, файрвол Linux настраиваемый через утилиту ufw разрешает весь исходящий трафик и запрещает весь входящий. Если необходимо, это поведение можно изменить.

Запретить весь входящий трафик по умолчанию

ufw default deny incoming

Разрешить весь исходящий трафик по умолчанию

ufw default allow outgoing

Настройки ufw c запретом всех входящих соединений полностью достаточно для защиты персонального компьютера или ноутбука.

2.2. Разрешение доступа через SSH

Если настройка файрвола на сервере происходит удаленно через SSH, обязательно перед включением ufw необходимо разрешить входящий трафик по порту на котором работает SSH сервер, по умолчанию это 22 порт.

Обязательно разреши доступ и открой порт SSH-сервера, иначе потеряешь удаленный доступ к серверу.

Разрешить входящий TCP трафик на 22 порт

ufw allow 22/tcp

Если происходит настройка персонального компьютера или ноутбука, эту настройку не нужно делать.

2.3. Включение ufw

Включаем ufw

ufw enable

Если включение происходит на удаленном сервере, будет выведено предупреждение, что есть вероятность потерять доступ через SSH. Убеждаемся что открыт порт для SSH и вводим Y, чтобы согласится и включить файрвол.

Файрвол Linux включен и добавлен в автозагрузку командой “ufw enable” на удаленном Debian сервере

Firewall был активирован, включен и добавлен в автозагрузку.

3. Проверка статуса ufw и вывод списка правил

Проверяем состояние, настройки и список правил ufw

ufw status verbose
Вывод статуса и списка правил файрвола командой “ufw status verbose” на удаленном Debian сервере. По умолчанию запрещен входящий трафик и разрешен исходящий трафик, открыт TCP порт 22 дня доступа к SSH серверу.

В моем случае: разрешен любой исходящий трафик, запрещен любой входящий трафик кроме TCP протокола на 22 порт (так как настройка происходит на удаленном сервере).

  • Status — состояние файрвола, где active - включен, inactive - выключен;
  • Logging — уровень логирования, где on (уровень) - включен с указанием уровня лога, off - отключено логирование;
  • Default — поведение файрвола по умолчанию:
    • incoming – весь входящий трафик запрещен (deny) или разрешен (allow);
    • outcoming – весь исходящий трафик разрешен (allow) или запрещен (deny);
    • routed – маршрутизация запрещена (deny) или разрешена (allow).
  • New profiles — применять профиль приложения;
  • Список правил файрвола:
    • To –  куда направляется пакет [IP, порт, протокол, …];
    • Action – действие для правила [ALLOW IN (разрешить входящие), ALLOW OUT (запретить исходящие), …] ;
    • From – откуда пришел пакет [IP, порт, протокол, …].

Можно вывести только список правил с указанием их номеров

ufw status numbered
Вывод списка правил файрвола командой “ufw status numbered” в консоли Debian сервере, открыт TCP 22 порт

4. Синтаксис утилиты ufw и примеры настройки правил

4.1. Открыть входящие порты

Открываем входящий порт 80 для веб-сервера

ufw allow 80/tcp

или можно просто указать HTTP

ufw allow http

Эти две строчки делают одно и тоже, но я бы рекомендовал прописывать порт и указывать транспортный протокол (TCP, UDP, …).


Открываем входящий порт 443 (HTTPS) для защищенных соединений веб-сервера

ufw allow 443/tcp

Если веб-сервер поддерживает HTTP/3 соединения, открываем входящий порт 443 с использованием UDP протокола

ufw allow 443/udp

Открываем доступ для SSH сервера, но с защитой от брутфорса

ufw limit 22/tcp

параметр limit разрешает не более 6 подключений с одного IP в течение 30 секунд.


Открываем диапазон портов

ufw allow 25000:25100

Будет разрешен входящий трафик по любым транспортным протоколам с 25000 порта до 25100 порта.

Можно открыть порты с указанием конкретного протокола

ufw allow 25000:25100/tcp
ufw allow 25000:25100/udp

4.2. Разрешить входящий трафик с определенных IP-адресов

Разрешаем доступ по любым портам и транспортным протоколам для IP-адреса

ufw allow from 80.95.110.25

Разрешить аналогичный доступ, но целой подгруппе адресов, например локальной сети (192.168.0.0/24 в моем случае)

ufw allow from 192.168.0.0/24

Разрешаем доступ IP-адресу из интернета только до SSH сервера, который работает через TCP протокол на 22 порту

ufw allow in proto tcp from 80.95.110.25 to any port 22

Если сервер или компьютер находится за маршрутизатором, можно разрешить доступ к SSH только из локальной сети роутера

ufw allow in proto tcp from 192.168.0.0/24 to any port 22
  • allow – разрешить доступ;
  • in – направление трафика (необязательно указывать в данном случае);
  • proto – указывает транспортный прокол TCP, UDP, … (обязательное слово, если необходимо указать прокол);
  • from – откуда пришел трафик, IP адрес или подгруппа;
  • to – куда придет трафик (можно явно указать IP-адрес сетевой карты, any - на все сетевые карты и их адреса);
  • port – на какой порт принимать трафик (обязательное слово, если необходимо указать порт).

4.3. Разрешить входящий трафик на определенный сетевой интерфейс

Предположим, сервер имеет две сетевых карты и необходимо разрешить доступ к веб-серверу (HTTP/HTTPS) только с одной сетевой карты.

Выводим список сетевых карт в системе

ip a

Разрешаем доступ к веб-серверу (HTTP/HTTPS) через конкретный сетевой интерфейс (ens33 в моем случае)

ufw allow in on ens33 proto tcp from any to any port 80,443

При указании сетевого интерфейса, необходимо непременно указывать направление трафика: входящий (in) или исходящий (out), перед параметром on <имя сетевого интерфейса>.

4.4. Запретить входящие подключения определенным IP-адресам

Для того чтобы создать запрещающее правило, необходимо вместо allow указывать deny в правилах. Файрвол, настраиваемый через утилиту ufw, обрабатывает правила в порядке их номера.

Каждое новое добавленное правило добавляется в конец списка правил. Если вначале стоит правило, которое разрешает доступ с любых IP-адресов, то правило запрета конкретного IP адреса должно находится выше этого правила.

Запрещаем доступ IP-адресу

ufw prepend deny from 80.95.110.25

Параметр prepend установит данное правило в начало списка. Это будет означать что доступ с IP адреса 80.95.110.25 будет полностью закрыт, независимо от того, какие правила идут после.


Например, необходимо запретить группе IP-адресов доступ к веб-серверу. Логично добавить это правило сразу перед правилом которое разрешает доступ к веб-серверу с любых IP адресов.

Выводим список правил с указанием их номеров

ufw status numbered
Вывод списка правил файрвола с указанием их номеров командой “ufw status numbered” в консоли Debian сервере, открыты TCP 22, 80, 443 порты

Запрещаем группе IP-адресов доступ к SSH серверу

ufw insert 2 deny proto tcp from 203.0.113.0/24 to any port 80,443

Параметр insert 2 установит данное правило вторым в списке. Правило, которое было под номером 2, станет под номером 3 и все остальные правила аналогично сдвинутся.


Запрещаем доступ с IP-адресов, которые принадлежат частным адресам (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16) используемым в локальной сети

ufw prepend deny from 10.0.0.0/8
ufw prepend deny from 172.16.0.0/12
ufw prepend deny from 192.168.0.0/16

И также запретим частным адресам IPv6

ufw prepend deny from fc00::/7

Параметр prepend установит данные правила в начале списка.

4.5. Запретить исходящий трафик до определенных IP-адресов или портов

Бывают ситуации, когда необходимо ограничить исходящий трафик до определенных сервисов или IP адресов. Допустим, если используем DNS over TLS (DoT), то можно полностью запретить исходящий трафик к незащищенным DNS серверам (53 TCP/UDP) для повышения безопасности.

Запрещаем подключатся к любым DNS серверам

ufw deny out any 53

Запрещаем доступ до всех устройств локальной сети (192.168.0.0/24 в моем случае)

ufw deny out to 192.168.0.0/24

Запрещаем любые исходящие TCP пакеты с сетевого интерфейса (ens33 в моем случае)

ufw deny out on ens33 proto tcp

4.6. Удалить правила файрвола

Правила можно удалять, указав их полностью или через номер. Чтобы удалить правило, которое было добавлено командой

ufw allow 80,433/tcp

необходимо добавить параметр delete перед правилом

ufw delete allow 80,433/tcp

В таком случае, будут удалены правила для IPv4 и IPv6. Если необходимо удалить только правило для IPv6, необходимо удалить через указание номера конкретного правила.

Выводим список правил с указанием их номеров

ufw status numbered
Вывод списка правил файрвола с указанием их номеров командой “ufw status numbered” в консоли Debian сервере, открыты TCP 22, 80, 443 порты

Удаляем правило, указав его номер

ufw delete 3

Будет удалено правило allow 80,433/tcp (только IPv6), которое имеет номер 3.

4.7. Настроить уровень лог-файла (ufw.log)

В большинстве операционных систем Linux в каталоге /var/log/ находится лог-файл ufw.

Найдем данный лог-файл

ls /var/log/ufw*

Открываем найденный лог-файл

nano /var/log/ufw.log

Существует несколько уровней ведения журнала событий (логирования):

  • off – логирование отключено;
  • low – логировать все заблокированные пакеты, не соответствующие заданной политике (с ограничением записи повторяющихся пакетов), а также пакеты правил, для которых указано принудительное логирование;
  • medium – уровень low, плюс все разрешенные пакеты, не соответствующие заданной политике, все недействительные пакеты, а также все новые соединения. Все логирование выполняется с ограничением записи повторяющихся пакетов;
  • high – уровень medium (без ограничения записи повторяющихся пакетов), плюс все остальные пакеты с ограничением записи повторяющихся пакетов;
  • full –  уровень high без ограничения записи повторяющихся пакетов.

В официальном руководстве “ограничение записи повторяющихся пакетов” на английском написано rate limiting, дословный перевод “ограничение скорости”. Смысл, как я его понял, заключается в том, что когда установлено соединение, происходит непрерывная передача “одинаковых” пакетов для файрвола, но записан в лог-файл будет только один пакет.

Отключаем ведение лог-файла файрвола, если он не нужен

ufw logging off

Устанавливаем уровень логирования low

ufw logging low

Уровень low является настройкой файрвола по умолчанию.

Если установить уровень логирования выше medium, лог-файл будет очень быстро вырастать в размере, так как будут записыватся все пакеты, даже если они повторяются. Например, если за время соединения между двумя узлами в течение 1 секунды было передано 300 пакетов, в лог-файл будет добавлено 300 “одинаковых” строк с различием в миллисекундах.

5. Пример настройки ufw для сервера

Допустим, на сервере работает nginx. Необходимо открыть порт для доступа через SSH, открыть порты HTTP/HTTPS для веб-сервера, запретить все остальные входящие соединения и разрешить серверу ходить в интернет.

ufw default deny incoming
ufw default allow outgoing
ufw limit 22/tcp
ufw allow 80,443/tcp

Этих строк полностью достаточно для защиты сервера и доступа всем к веб-серверу.

6. Запретить входящий ping (ICMP)

Даже если запрещен весь входящий трафик через утилиту ufw, компьютер все равно будет отвечать на команду ping которая идет извне. Для запрета пинга, необходимо отредактировать файл настройки ufw (через правила запретить ICMP на текущий момент нельзя).

Открываем файл /etc/ufw/before.rules

nano /etc/ufw/before.rules

Находим следующие строки и комментируем их, добавляя символ # перед ними

# ok icmp codes for INPUT
-A ufw-before-input -p icmp --icmp-type destination-unreachable -j ACCEPT
-A ufw-before-input -p icmp --icmp-type time-exceeded -j ACCEPT
-A ufw-before-input -p icmp --icmp-type parameter-problem -j ACCEPT
-A ufw-before-input -p icmp --icmp-type echo-request -j ACCEPT

# ok icmp code for FORWARD
-A ufw-before-forward -p icmp --icmp-type destination-unreachable -j ACCEPT
-A ufw-before-forward -p icmp --icmp-type time-exceeded -j ACCEPT
-A ufw-before-forward -p icmp --icmp-type parameter-problem -j ACCEPT
-A ufw-before-forward -p icmp --icmp-type echo-request -j ACCEPT

Получится должно следующим образом

Открыт файл /etc/ufw/before.rules через nano в Debian, закомментированы 8 строк для запрета пинга извне

Закрываем и сохраняем внесенные изменения в файл.

Перезагружаем все файлы и правила ufw

ufw reload

Проверяем что компьютер перестал отвечать на пинг.

7. Отключение файрвола и удаление всех правил

Отключаем ufw

ufw disable

Файрвол был выключен, доступ к компьютеру или серверу открыт по всем портам.

Если необходимо удалить все правила и вернуть исходное состояние файлов настройки файрвола, то выполняем команду сброса

ufw reset

После выполнения этой команды, все правила, которые ранее были добавлены, будут удалены, создана резервная копия предыдущих настроек и файрвол будет отключен.