Фаервол UFW. Базовая настройка.

Межсетевой экран, он же firewall (файрвол, фаервол или файервол) служит для автоматической обработки и фильтрации сетевого трафика. Поскольку не все данные, передаваемые по сети, полезны и безопасны, возникла необходимость проверять и обрабатывать их «на лету».

Коротко о UFW.

Чтобы лучше понять, о чем идет речь, представьте многоквартирный дом. Сотни или даже тысячи людей входят и выходят ежедневно. Среди них есть владельцы квартир, их домочадцы, гости, а также люди, которых никто не приглашал — грабители, мошенники и просто продавцы никому не нужных вещей, надоедающие жителям. Фаервол в данном примере — это строгий консьерж на входе. Он знает и без проблем пропускает каждого жильца, а тех, кого не знает — тщательно проверяет. Имущество и покой обитателей дома при этом находятся в безопасности.

В Linux для фильтрации трафика используется фаервол Netfilter, с 2000 года входящий в состав ядра. Управлять им позволяет известная многим утилита iptables. Она предоставляет очень гибкую систему настроек, но достаточно сложна в конфигурировании. Чтобы упростить пользователям жизнь, в Ubuntu была добавлена обертка для iptables — фаервол Uncomplicated Firewall (UFW) и графическая оболочка для него — GUI for Uncomplicated Firewall (GUFW). Чтобы лучше разобраться, мы начнем с консольной версии фаервола, а графическую рассмотрим в одной из следующих статей.

Включение фаервола и создание простейших правил.

По умолчанию в Ubuntu 16.04 UFW отключен. Для проверки его текущего состояния используйте команду:

sudo ufw status

Стремясь облегчить жизнь пользователям, разработчики сформировали конфигурацию фаервола, которая подходит для большинства домашних ПК. Поэтому на своем компьютере можете смело включать UFW командой:

sudo ufw enable

На сервере, особенно выполняющем какую-либо работу, лучше предварительно выяснить, какие правила фильтрации будут применены и, в случае необходимости, внести свои поправки.

Прежде всего, давайте разберемся с общими принципами работы UFW. Входящие и исходящие пакеты проверяются на предмет соответствия имеющимся правилам фильтрации, после чего выполняется действие, установленное для этого правила. Если подходящее правило не будет найдено, используется действие, установленное по умолчанию. Действия могут быть такими:

  • Allow — пропустить (т. е., разрешить);
  • Deny — заблокировать (запретить);
  • Reject — отклонить и отправить обратно специальный код, сообщающий, что пакет был отклонен.

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

sudo ufw status verbose

Результат будет примерно таким:

На скриншоте выше мы видим, что по умолчанию разрешен весь исходящий трафик и запрещен весь входящий. Созданные правила отменяют запрет входящего трафика для портов 80, 22 и 1194/udp.

Если вы настраиваете сервер, к которому подключились по SSH, прежде всего необходимо разрешить подключение к порту 22:

sudo ufw allow 22

С большой долей вероятности вам придется открыть некоторые из следующих портов:

  • 80 для HTTP,
  • 443 для HTTPS,
  • 20 и 21 для FTP,
  • 25 для SMTP (отправка почты),
  • 465 для SMTPS (отправка почты с шифрованием),
  • 143 для IMAP (получение почты),
  • 993 для IMAPS (получение почты с шифрованием) и т. д.

К счастью, запоминать все порты не обязательно, поскольку UFW имеет набор предустановленных правил для часто используемых сервисов. Благодаря этому мы можем разрешить FTP вот так:

sudo ufw allow ftp

Можно разрешить доступ к порту только с одного IP. К примеру, вы хотите сделать так, чтобы только вы могли подключиться по FTP к своему серверу. Тогда на сервере нужно включить фаервол и выполнить следующее:

sudo ufw allow ftp from ваш_ip

Имейте в виду.

Во-первых, IP должен быть внешним, во-вторых — статическим. Если вы допустите ошибку, то сами не сможете подключиться. У большинства провайдеров статический ip можно получить за небольшую отдельную плату.

Запрещающие правила создаются примерно таким же образом. Запретим доступ к порту 110:

sudo ufw deny 110

Запретим доступ к ftp c уведомлением о недоступности и комментарием:

sudo ufw reject ftp comment 'FTP temporarily closed. Please, come back tomorrow.'

Удаление правил UFW.

Если вы хотите отметить разрешающее правило, не нужно создавать запрещающее, просто удалите его. Например, если по умолчанию входящий трафик запрещен, но вы разрешили подключение к порту 443, а теперь хотите отозвать свое разрешение, выполните в консоли:

sudo ufw delete allow 443

Есть и другой способ: вывести все правила нумерованным списком, после чего указать номер правила, которое вы желаете удалить. Выведем список и удалим правило под номером 1:

sudo ufw status numbered
sudo ufw delete 1

Настройки по умолчанию и восстановление исходного состояния.

Если для передаваемых данных не находится соответствующего правила, используются правила, установленные по умолчанию. В Ubuntu 16.04 после включения фаервола весь входящий трафик блокируется (deny), а исходящий пропускается (accept) без каких-либо препятствий. Другими словами, исходящие данные фильтруются по принципу черного списка (разрешено все, что не запрещено отдельными правилами), а входящие — по принципу белого (запрещено все, что не было прямо разрешено).

Напомню, что просмотреть текущие настройки при включенном фаерволе позволяет команда:

sudo ufw status verbose

О настройках по умолчанию вам поведает строка, которая начинается с «Default: ». Если ваша система настроена иначе, следующие две команды установят стандартную конфигурацию:

sudo ufw default allow outgoing
sudo ufw default deny incoming

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

sudo ufw reset

Для подтверждения нажмите y, после чего все правила будут удалены, а фаервол — выключен, поскольку по умолчанию он находится именно в таком состоянии. Это именно то, что нужно, если в процессе настройки или экспериментов вы запутались и теперь у вас что-то не работает.

На скриншотах — состояние фаервола до и после сброса.

Настройка правил с указанием направления, протокола, порта и IP.

UFW позволяет создавать правила с несколькими дополнительными условиями. В прошлой статье я уже демонстрировал, как создать правило для конкретного IP-адреса. Кроме этого вы можете указать протокол, порт и IP как отправителя, так и получателя.

В качестве первого примера возьмем типичную ситуацию: у вас есть компьютер с Ubuntu, на котором настроены нужные вам сервисы — FTP, Samba или что-нибудь еще. Вы хотите без проблем получать доступ ко всем этим сервисам из своей домашней сети (с ПК, смартфона и т. д. ), но оставить закрытым доступ извне.

В таком случае укажем IP-адреса нашей домашней сети в качестве разрешенных:

sudo ufw allow from 192.168.0.1/24

В список разрешенных при этом попадут IP-адреса с 192.168.0.1 по 192.168.0.254 включительно.

Усложним задачу и разрешим доступ из домашней сети только к порту, используемому для FTP:

sudo ufw allow from 192.168.0.1/24 to any port 21

Пусть вас не вводит в заблуждение словосочетание «to any port». Это две отдельные части команды, одна из которых означает IP-адрес, к которому выполняется обращение (в данном случае to any, то есть, к любому), а вторая определяет номер порта (port 21).

Сделаем наше правило еще более конкретным и укажем протокол:

sudo ufw allow from 192.168.0.0/24 to any port 21 proto tcp

В случае необходимости можно заблокировать доступ с нашего компьютера к конкретному IP или даже к конкретному порту неугодившего нам IP:

sudo ufw deny out to xxx.xxx.xx.x port 123

Указывая параметр out, мы сообщаем, что хотим блокировать именно исходящие пакеты. Поскольку они, как вы помните, разрешены у нас по умолчанию, наше правило будет единственным исключением.
Хотите закрыть сразу диапазон портов? Пожалуйста:

sudo ufw deny out to xxx.xxx.xx.x port 123:456 proto udp

Теперь udp-пакеты к портам 123 - 456 на указанном IP отправлены не будут.

Ограничение доступа.

Особенность UFW заключается в том, что каждое новое правило добавляется в конец списка существующих правил. При поступлении пакета правила проверяются одно за другим до тех пор, пока не будет найдено подходящее. Теперь представим ситуацию, при которой вы сначала добавили общее разрешающее правило, а затем — более конкретное запрещающее. В таком случае последнее правило не будет работать, поскольку пакет пройдет благодаря предыдущему правилу.

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

sudo ufw insert 1 deny from 123.12.12.12 to any port 80

Теперь все запросы сначала будут проверяться на соответствие запрещенному IP, и лишь после этого — проходить далее, согласно правилу №3.

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

Чтобы запретить более 6 попыток подключения к SSH за 30 секунд, выполните:

sudo ufw limit ssh

Все лишние попытки будут заблокированы и процесс подбора пароля сильно осложнится.

Вот и всё. Для большинства домашних компьютеров этого вполне достаточно и более тонкая настройка просто не нужна.