iptables firewall — пример настройки


iptables — часть ядра, применяющаяся для управления сетевым трафиком и его фильтрации. Особенно большое значение iptables имеет для телефонии, Linux маршрутизаторах и веб-серверах. Рассмотрим пример базовой настройки iptables firewall.


Для демонстрации используем Debian/Ubuntu.

Для CentOS можно создавать те же настройки при условии что нет пакета firewalld. О том что он не используется будет говорить пустой вывод rpm -qa | grep firewalld



Существует пять цепочек: INPUTPREROUTINGFORWARD, POSTROUTING, OUTPUT.



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


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



! Все команды выполняются от имени системного пользователя root или пользователя с sudo



Прежде всего проверяем, что никаких правил iptables нет, список пуст.


iptables firewall - пример настройки


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

О том как удалить правила iptables можно прочитать по ссылке.



Затем зададим политику по умолчанию для всех входящих и исходящих соединений (в том числе для того которое используем — если настройка производится удаленно по SSH)

iptables -P INPUT ACCEPT

iptables -P OUTPUT ACCEPT



Увидеть политику по умолчанию нельзя выполнив iptables -L, нужно использовать ключ -S

iptables -S



Разрешим все подключения (входящий трафик) для loopback интерфейса или lo. Это трафик, генерируемый на самом хосте службами, существующими на нем же.

iptables -A INPUT -i lo -j ACCEPT



Ключ -A (add) добавляет новое правило в firewall, с -i можно указать интерфейс, -j (jump) указывает как обрабатывать пакеты. В данном случае в соответствии с правилом пакеты нужно принимать.



Для понимания следующей команды нужно иметь представление о типах соединений, это NEW, ESTABLISHED и RELATED. Значения NEW, ESTABLISHED следуют из названий, RELATED означает, что соединение связано с уже имеющимся, но при этом открывает новый поток передачи данных.



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

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



Здесь имеет смысл проявить осторожность и попробовать подключиться по SSH к тому же серверу после завершения настройки, но до прекращения сессии. Если случайно закрыть SSH доступ совсем,  текущее соединение не прервется — оно является ESTABLISHED.


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

conntrack — модуль, позволяющий использовать состояния.



Открываем доступ для основных служб в iptables firewall


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



Разрешаем доступ по SSH для всех принимая пакеты, которые направляются на стандартный порт, если служба работает на другом порту правило потребуется скорректировать.

iptables -A INPUT -p tcp --dport 22 -j ACCEPT



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



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

iptables -A INPUT -m multiport -p tcp --dports 80,443 -j ACCEPT


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



Меняем политику по умолчанию и отбрасываем все остальные входящие пакеты

iptables -P INPUT DROP



Также запрещаем любую переадресацию трафика

iptables -P FORWARD DROP




Так как описано выше делают чаще всего, но у этого решения есть недостаток. iptables -P INPUT DROP означает, что все соединение будут отвергаться по умолчанию и если выполнить iptables -F — к серверу нельзя будет подключиться, потребуется аварийный режим и загрузочный USB.



Лучшая практика

Удаляем последнее правило, задающее политику по-умолчанию

iptables -D INPUT -j DROP

Добавляем правило, по которому будут отбрасываться пакеты.

iptables -A INPUT -j DROP



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




Весь исходящий трафик имеет смысл разрешить

iptables -P OUTPUT ACCEPT



Также при необходимости разрешаем пробрасывать трафик с одного интерфейса на другой

iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT



Просматриваем настройки firewall

iptables-save


iptables firewall


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

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