iptables — часть ядра, применяющаяся для управления сетевым трафиком и его фильтрации. Особенно большое значение iptables имеет для телефонии, Linux маршрутизаторах и веб-серверах. Рассмотрим пример базовой настройки iptables firewall.
Для демонстрации используем Debian/Ubuntu.
Для CentOS можно создавать те же настройки при условии что нет пакета firewalld. О том что он не используется будет говорить пустой вывод rpm -qa | grep firewalld
Существует пять цепочек: INPUT, PREROUTING, FORWARD, POSTROUTING, OUTPUT.
Для них можно задать различные политики основываясь на протоколе, адресах отправителя и получателя, используемых портах и т.п. iptables в целом является очень обширной темой и охватить все вопросы в рамках одной статьи очень сложно. Сосредоточимся на базовых настройках.
Настройки производятся для сервера, на котором работает веб-сервер, обслуживающий пользовательские запросы. Из других важных служб — только SSH, все остальные добавляются аналогично. Различаются только номера портов.
! Все команды выполняются от имени системного пользователя root или пользователя с sudo
Прежде всего проверяем, что никаких правил iptables нет, список пуст.
Если есть существующие правила, но их наличие не проверено могут быть негативные последствия, конфликты старых и новых правил и влияние на сервисы в результате.
О том как удалить правила 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.
Она нужна для того чтобы правила добавлялись после перезагрузки сервера. При добавлении правил просто в консоли они будут в силе до ближайшей перезагрузки.