Как установить фаервол, используя iptables на Ubuntu 14.04

Обсудить

Введение

Установка хорошего фаервола – это обязательная мера, которую нужно принять для защиты любой современной операционной системы. Большинство дистрибутивов Linux поставляются с разными утилитами, которые можно использовать для настройки фаервола. В данном руководстве будет использоваться утилита под названием iptables.

Iptables – это стандартная фаервол-утилита, которая по умолчанию входит в состав большинства дистрибутивов Linux. Необходимо отметить, что iptables – это утилита командной строки для управления Netfilter, брандмауэром, встроенным в ядро Linux. Он позволяет управлять фильтрацией и перенаправлением пакетов – администраторы создают правила, согласно которым происходит обработка пакетов.

В данном руководстве будет рассказано, как создать базовые правила для Ubuntu 14.04.

Обратите внимание, что в статье пойдет речь только о безопасности IPv4. Защита IPv6 настраивается по-другому.

Требования

Вам понадобится пользователь с административными правами для выполнения команд sudo.

Основные команды iptables

Рассмотрим основные команды, которые используются для установки различных правил и для работы с iptables в целом.

Во-первых, все команды iptables должен использовать только пользователь с административными (root) правами. В этом руководстве будет использоваться пользователь с sudo-правами, так как это предпочтительный вариант при работе на ОС Ubuntu 14.04. Однако при желании вы можете использовать и суперпользователя.

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

$ sudo iptables –L

Вы получите примерно такой вывод на экране:

Chain INPUT (policy ACCEPT)
target prot opt source destination 

Chain FORWARD (policy ACCEPT)
target prot opt source destination 

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

По умолчанию существует три цепочки правил – INPUT (входящие пакеты), FORWARD (транзитные пакеты) и OUTPUT (исходящие пакеты). У всех по умолчанию проставлено действие ACCEPT (пропуск пакета). Также можно увидеть заголовки колонок, но самих правил нет, т.к. Ubuntu не поставляется с каким-то пакетом правил по умолчанию.

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

$ sudo iptables –S

Вывод будет следующим:

-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT

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

Допустим, у вас уже есть какие-то правила. Для того, чтобы убрать их и начать заново, используйте команду с ключом –F:

$ sudo iptables –F

При этом важно помнить, что даже если вы удалите все правила из своих цепочек, это никак не повлияет на порядок действий, политику (policy). Поэтому, если вы работаете удаленно, перед удалением правил убедитесь, что политика по умолчанию на входящие и исходящие пакеты (INPUT и OUTPUT) – это пропуск (ACCEPT). Сделать это можно следующей командой:

$ sudo iptables -P INPUT ACCEPT
$ sudo iptables -P OUTPUT ACCEPT
$ sudo iptables –F

Ключ –P устанавливает политику для стандартной цепочки.

Создание первого правила

Перейдем к настройке фаервола. Мы будем работать с цепочкой INPUT, так как именно она отвечает за входящие пакеты. Для начала нужно поработать с SSH-соединением, а именно создать правило, разрешающее это соединение.

Полностью оно выглядит следующим образом:

$ sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

Разберем составляющие этой команды:

  • -A INPUT: ключ –A говорит о том, что правило будет добавлено в конец написанной цепочки. То есть эта часть команды означает, что мы хотим добавить новое правило, оно будет добавлено в конец цепочки и действует для INPUT.
  • -m conntrack: conntrack отвечает за отслеживание состояния соединения и классификацию пакетов, а ключ –m используется при добавлении новых условий для того, чтобы загрузить нужное для этих условий расширение.

Таким образом, в этой части команды речь идет о том, что нам нужно получить доступ к функционалу, за который отвечает модуль conntrack.

  • --ctstate: ввод этой команды возможен при отсылке к модулю conntrack. Эта команда позволяет задать список возможных состояний соединений.

В данном случае мы задаем параметр ESTABLISHED для того, чтобы разрешить те пакеты, которые относятся к уже установленным соединениям. Следующее соединение – RELATED – указывает пакеты, которые логически связаны с уже установленными соединениями. Оба этих условия подходят под нашу SSH-сессию.

  • -j ACCEPT: в этой части указывается цель подходящих пакетов. В данном случае сообщается, что пакеты, подходящие под уже заявленные до этого критерии, будут приняты и пропущены.

Итак, мы ставим это правило первым, так как важно убедиться, что все соединения, которые вы уже используете, подходят под критерии, принимаются и выходят из цепочки до того, как они достигают каких-то других правил (в частности, правил блокировки – DROP).

Теперь можно проверить внесенные изменения:

$ sudo iptables –L

Вывод будет примерно такой:

Chain INPUT (policy ACCEPT)
target prot opt source destination 
ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED

Chain FORWARD (policy ACCEPT)
target prot opt source destination 

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

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

Допуск других важных соединений

Мы уже задали, что iptables должен держать открытыми все соединения, которые уже установлены, и допускать новые соединения, которые как-то связаны с предыдущими. Тем не менее необходимо создать еще несколько правил для того, чтобы были установлены другие новые соединения, которые не подходят под предыдущие критерии.

В частности, необходимо, чтобы были всегда открыты два порта: SSH-порт (по умолчанию это обычно порт 22) и порт веб-сервера, который стандартно имеет 80 порт.

Поэтому нужно добавить следующие правила:

$ sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
$ sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT

Эти правила похожи на первое правило, но выглядят более простыми. Новые опции, которые мы используем:

  • -p tcp: данная часть помечает все пакеты, если использованный протокол TCP. Соединение через этот протокол используется большинством приложений.
  • --dport: поставить эту опцию можно только в том случае, если вы указали часть команды выше. Она указывает порт: первое правило показывает, что оно работает для TCP-пакетов для порта 22, а второе – для TCP-пакетов для порта 80.

Если еще одно правило, которое нужно добавить для того, чтобы сервер функционировал корректно. Сервисы компьютера могут взаимодействовать между собой, посылая сетевые пакеты друг другу. Они делают это, используя loopback-интерфейс, который перенаправляет трафик обратно к себе, а не на другие компьютеры.

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

Правило, которое нужно добавить, выглядит так:

$ sudo iptables -I INPUT 1 -i lo -j ACCEPT

Расшифровка его частей такая:

  • -I INPUT 1: эта часть говорит iptables вставить правило. В отличие от ключа –A, который отправляет правило в конец цепочки, ключ –I вставляет правило в то место цепочки, куда вы хотите его поместить. В данном случае правило будет самым первым правилом в цепочке INPUT, а остальные правила будут идти уже после него. Это необходимо сделать, так как это базовое правило и оно не должно зависеть от остальных правил.
  • -i lo: эта часть правила проверяет, соответствует ли интерфейс пакета loopback-интерфейсу.

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

$ sudo iptables –S

Вывод будет выглядеть следующим образом:

-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT

Создание правила блокировки

На данный момент уже создано несколько правил, но все они направлены на пропуск пакетов, а не на блокировку.

После того, как пакет проходит всю цепочку INPUT и не попадает ни под одно из четырех правил, с ним будет выполнено действие по умолчанию – пропуск пакета – и необходимо это изменить.

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

Первый способ, как можно это сделать, это просто поменять стандартную политику цепочки INPUT при помощи следующей команды:

$ sudo iptables -P INPUT DROP

В этом случае все пакеты, которые пройдут цепочку INPUT, будут заблокированы. Важно не забывать, что эта политика блокировки пакетов останется даже в том случае, если вы удалите все правила.

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

Однако такое решение может также иметь неприятные последствия, если у вас нет других способов получить доступ к серверу.

Альтернативный способ – это оставить стандартную политику без изменений, но при этом добавить новое правило, согласно которому будет блокироваться любой дошедший до конца цепочки пакет.

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

$ sudo iptables -P INPUT ACCEPT

Теперь вы можете в конец цепочки добавить правило, согласно которому пакет, дошедший до конца цепочки, будет заблокирован:

$ sudo iptables -A INPUT -j DROP

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

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

Но это также означает и то, что любое дополнительное правило должно быть добавлено перед правилом блокировки пакетов. Сделать это можно либо временно удалив правило блокировки:

$ sudo iptables -D INPUT -j DROP
$ sudo iptables -A INPUT new_rule_here
$ sudo iptables -A INPUT -j DROP

Либо можно вставить новое правило, указав номер строки, на которой оно будет расположено. Например, для вставки правила на 4 строчку, нужно использовать команду:

$ sudo iptables -I INPUT 4 новое_правило

Если вы не помните, на каких строчках располагаются какие правила, вам поможет следующая команда:

$ sudo iptables -L --line-numbers

Вывод будет примерно таким:

Chain INPUT (policy DROP)
num target prot opt source destination 
1 ACCEPT all -- anywhere anywhere 
2 ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED
3 ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
4 ACCEPT tcp -- anywhere anywhere tcp dpt:http

Chain FORWARD (policy ACCEPT)
num target prot opt source destination 

Chain OUTPUT (policy ACCEPT)
num target prot opt source destination

Это поможет вам добавить новое правило на нужную строчку.

Сохранение настроек iptables

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

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

Есть несколько способов сделать это, однако наиболее простой – это использовать пакет iptables-persistent. Его можно загрузить из репозитория Ubuntu:

$ sudo apt-get update
$ sudo apt-get install iptables-persistent

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

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

Сохранение изменений

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

$ sudo invoke-rc.d iptables-persistent save

Заключение

Теперь у вас есть базовые знания относительно того, как можно настроить фаервол, который будет отвечать вашим требованиям. Существует множество других утилит-брандмауэров, но iptables – это один из лучших инструментов, потому что он относится к Netfilter, а также используется на огромном количестве систем.

Сервер Timeweb

Комментарии

С помощью соцсетей
У меня нет аккаунта Зарегистрироваться
Нажимая кнопку «Зарегистрироваться», я даю согласие на обработку своих персональных данных, указанных в форме регистрации.
С помощью соцсетей
У меня уже есть аккаунт Войти
Нажимая кнопку «Зарегистрироваться», я даю согласие на обработку своих персональных данных, указанных в форме регистрации.
Инструкции по восстановлению пароля высланы на Ваш адрес электронной почты.
Пожалуйста, укажите email, который Вы использовали для входа на сайт.