Утилита 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, чтобы согласится и включить файрвол.
Firewall был активирован, включен и добавлен в автозагрузку.
3. Проверка статуса ufw и вывод списка правил
Проверяем состояние, настройки и список правил ufw
ufw status verbose
В моем случае: разрешен любой исходящий трафик, запрещен любой входящий трафик кроме 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
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
Запрещаем группе 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 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
Получится должно следующим образом
Закрываем и сохраняем внесенные изменения в файл.
Перезагружаем все файлы и правила ufw
ufw reload
Проверяем что компьютер перестал отвечать на пинг.
7. Отключение файрвола и удаление всех правил
Отключаем ufw
ufw disable
Файрвол был выключен, доступ к компьютеру или серверу открыт по всем портам.
Если необходимо удалить все правила и вернуть исходное состояние файлов настройки файрвола, то выполняем команду сброса
ufw reset
После выполнения этой команды, все правила, которые ранее были добавлены, будут удалены, создана резервная копия предыдущих настроек и файрвол будет отключен.