Настройка iptables в Debian

Справочник системного администратора

iptables — это межсетевой экран для операционных систем Linux. В этом руководстве представлено описание базовых настроек конфигурации этого мощного файрвола.

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

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

sudo apt-get install iptables

Прежде чем мы начнем вдаваться в подробности настройки iptables, назову одно золотое правило – настройку файрвола нужно производить по возможности локально, чтобы в случаях, когда вы случайно заблокируете себе доступ к машине, можно было вернуть все к исходному виду. Но часто бывает так, что без удаленной настройки не обойтись и тут следует быть максимально осторожным. Не даром среди айтишников есть такая забавная примета, которая гласит: “Удаленная настройка брандмауэра – к выезду на объект”.

Типы правил

Существует три типа правил iptables — input, forward и output.

Input — Такие цепочки используются для контроля поведения входящих соединений. К примеру, если пользователь попробует подключиться к серверу по SSH, то iptables сравнит его IP-адрес со своим списком, чтобы разрешить или запретить доступ.

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

Output — Такие цепочки используются для исходящих соединений.

Увидеть текущие настройки iptables по умолчанию можно с помощью данной команды:

sudo iptables -L

Chain INPUT (policy ACCEPT)
Chain FORWARD (policy ACCEPT)
Chain OUTPUT (policy ACCEPT)

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

sudo iptables --policy INPUT ACCEPT
sudo iptables --policy OUTPUT ACCEPT
sudo iptables --policy FORWARD ACCEPT

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

iptables --policy INPUT DROP
iptables --policy OUTPUT DROP
iptables --policy FORWARD DROP

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

Accept — разрешить соединение;
Drop — игнорировать соединение, вести себя так, будто его никогда не было. Действие подходит для случаев, когда нужно сделать так, чтобы источник запроса не узнал о его блокировке.
Reject — заблокировать соединение и отправить в ответ сообщение об ошибке. Действие подходит для тех случаев, когда владелец сервера хочет дать понять, что соединение заблокировано файрволом.

Разрешаем и блокируем конкретные соединения

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

Мы будем использовать команду iptables –A, чтобы добавлять правила к существующим цепочкам. iptables будет начинать с начала списка и проходить по всем правилам, пока не найдет совпадение. Если нужно поместить какое-то правило перед уже имеющимся, то можно использовать команду iptables -I [цепочка] [номер], чтобы указать номер позиции в списке, которую должно занять новое правило.

Соединения с одного IP-адреса

Правило ниже позволяет заблокировать все соединения с IP-адреса 192.168.0.10:

sudo iptables -A INPUT -s 192.168.0.10 -j DROP

Соединения с диапазона адресов

Правило ниже позволяет заблокировать соединения из диапазона IP-адресов 192.168.0.0/24. Для указания диапазона адресов можно использовать стандартную запись маски подсети через слэш или описывать ее в полном варианте:

sudo iptables -A INPUT -s 192.168.0.0/24 -j DROP

Соединения на конкретный порт

Ниже показано, как заблокировать SSH-соединения с хоста 192.168.0.10:

sudo iptables -A INPUT -p tcp --dport ssh -s 192.168.0.10 -j DROP

Вместо SSH можно указать любой протокол или номер порта. Часть кода –p tcp говорит iptables о типе соединения, которое использует протокол. Если вы блокировали протокол, который использует UDP вместо TCP, то тогда нужно было бы написать –p udp.

Вот так можно заблокировать SSH-соединения с любого IP-адреса:

sudo iptables -A INPUT -p tcp --dport ssh -j DROP

Состояния соединений

Как сказано выше, многие протоколы требуют двусторонних коммуникаций. Например, если нужно разрешить соединения по SSH, то добавить правила надо будет и в цепочку input и в цепочку output. Но что, если нужно только разрешить доступ только входящим соединениям? Разрешит ли добавление правила в цепочку output и исходящие SSH-соединения?

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

sudo iptables -A INPUT -p tcp --dport ssh -s 10.10.10.10 -m state --state NEW,ESTABLISHED -j ACCEPT

sudo iptables -A OUTPUT -p tcp --sport 22 -d 10.10.10.10 -m state --state ESTABLISHED -j ACCEPT

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

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

sudo /sbin/iptables-save

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

Для удаления всех сконфигурированных правил можно использовать такую команду:

sudo iptables -F

Tags: