Настройка фаервола IPTables на Ubuntu 12.04

Published by Leave your thoughts

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

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

Примечание: Данное руководство охватывает безопасность IPv4. В системах Linux безопасность IPv6 поддерживается отдельно от IPv4. Так, брандмауэр iptables обслуживает только IPv4, а для поддержки безопасности IPv6 существует отдельный инструмент ip6tables. Если виртуальный выделенный сервер настроен для поддержки IPv6, нужно защитить и IPv4. Подробнее о IPv6 читайте в статье «Настройка и использование IPv6 на сервере Linux».

Команды iptables

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

-A: (Append), adds a rule to iptables
-L:  (List), shows the current rules
-m conntrack: allows rules to be based on the current connection state, elaborated in the the --cstate command.
--cstate: explains the states that connections can be in, there are 4: New, Related, Established, and Invalid
-p: (protocol), refers to the the protocol of the rule or of the packet to check.The specified protocol can be one of tcp, udp, udplite, icmp, esp, ah, sctp or the special keyword "all".
--dport: (port), refers to the the port through which the machine connects
-j: (jump), this command refers to the action that needs to be taken if something matches a  rule perfectly. It translates to one of four possibilities:
-ACCEPT: the packet is accepted, and no further rules are processed
-REJECT: the packet is rejected, and the              sender is notified, and no further rules are processed
-DROP: the packet is rejected, but the                 sender is not notified, and no further rules are processed
-LOG: the packet is accepted but logged, and the following rules are processed
-I: (Insert), adds a rule between two previous ones
-I INPUT 3: inserts a rule to make it the third in the list
-v: (verbose), offers more details about a rule

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

Чтобы просмотреть текущие правила iptables, введите:

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

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

sudo iptables -F

Чтобы ускорить работу iptables, нужно добавить в команду флаг –n. Эта опция отключает DNS-запросы и поиск обратных IP в наборе правил. Например, чтобы просмотреть правила, можно ввести:

iptables -L -n

Базовый фаервол

Изначально текущие правила разрешают все входящие и исходящие соединения. Такое поведение подвергает сервер опасности. При разработке таблицы правил следует помнить о том, что как только пакет принят (ACCEPTED), отклонён (REJECTED) или сброшен (DROPPED), он не будет проверяться остальными правилами. То есть правила, которые находятся в начале таблицы, имеют приоритет над остальными.

Во время создания правил нужно иметь в виду риск заблокировать себя на собственном сервере (например, запретив подключения SSH).

Для начала нужно разрешить все текущие соединения.

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

Данная команда состоит из следующих опций:

  • -A добавляет правило в таблицу.
  • INPUT определяет это правило в цепочку input.
  • m conntrack вместе с опцией —cstate ESTABLISHED,RELATED применяет результат данной команды к текущим соединениям и связанным с ними разрешённым соединениям.
  • -j ACCEPT переносит пакет в accept и принимает текущие соединения.

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

К примеру, чтобы заблокировать весь исходящий трафик, кроме портов 22 (SSH) и 80 (трафик веб-сервера), нужно сначала разрешить подключения к этим портам:

sudo iptables -A INPUT -p tcp --dport ssh -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT

Опция -p в этих командах задаёт протокол, при помощи которого будут созданы подключения (в данном случае – tcp), а опция —dport указывает порт, по которому будет передаваться пакет.

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

Чтобы заблокировать остальной трафик, создайте правило:

sudo iptables -P INPUT DROP

Итак, теперь список правил выглядит так:

sudo iptables -L
Chain INPUT (policy DROP)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere            ctstate RELATED,ESTABLISHED
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:http

Осталось добавить всего одно правило, которое настроит кольцевую проверку (или loopback). Имейте в виду, что без следующих опций это попадёт в конец списка и никогда не будет использовано, поскольку оно будет идти после правила блокировки всего трафика.

Чтобы избежать этого, нужно сделать это правило первым в списке при помощи опции INPUT.

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

  • -I INPUT 1 помещает правило в начало списка.
  • lo пропускает пакеты, которые используют интерфейс loopback.
  • -j ACCEPT будет принимать трафик loopback.

Итак, теперь все правила брандмауэра настроены. Полный список правил выглядит так (опция –v выведет дополнительные сведения):

sudo iptables -L -v
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target     prot opt in     out     source               destination
0     0 ACCEPT     all  --  lo     any     anywhere             anywhere
1289 93442 ACCEPT     all  --  any    any     anywhere             anywhere             ctstate RELATED,ESTABLISHED
2   212 ACCEPT     tcp  --  any    any     anywhere             anywhere             tcp dpt:ssh
0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere             tcp dpt:http
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target     prot opt in     out     source               destination
Chain OUTPUT (policy ACCEPT 157 packets, 25300 bytes)
pkts bytes target     prot opt in     out     source               destination

Однако правила iptables действительны в течение одной сессии и будут сброшены после перезагрузки сервера.

Сохранение правил iptables

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

Чтобы установить этот пакет, введите:

sudo apt-get install iptables-persistent

Во время установки программа спросит, нужно ли сохранить текущие правила iptables для IPv4 и IPv6; выберите yes.

После этого правила будут сохранены в /etc/iptables/rules.v4 и /etc/iptables/rules.v6.

После завершения установки запустите iptables-persistent:

sudo service iptables-persistent start

Теперь набор правил будет автоматически восстановлен после перезапуска сервера.

Tags: ,

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *


*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>