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

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

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

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

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

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

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

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

Allow — пропустить (т. е., разрешить);

Deny — заблокировать (запретить);

Reject — отклонить и отправить обратно специальный код, сообщающий, что пакет был отклонен.

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

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

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

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

80 для HTTP,

443 для HTTPS,

20 и 21 для FTP,

25 для SMTP (отправка почты),

465 для SMTPS (отправка почты с шифрованием),

143 для IMAP (получение почты),

993 для IMAPS (получение почты с шифрованием) и т. д.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Хотите закрыть сразу диапазон портов? Пожалуйста:

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

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

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

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

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

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

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

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

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