iptables –A INPUT –p tcp –m state –state RELATED,ESTABLISHED –j ACCEPT.
Правило усложнилось тремя новыми опциями. Параметр –p показывает, что рулес применяется к TCP-протоколу (без этого флажка нельзя заюзать модуль state). Опция –m позволяет подключать дополнительные модули. Третий параметр state относится к одноименному модулю. Он показывает, что правило обрабатывает пакеты определенного вида.
Следующий шаг направлен на настройку соединения с сервисами. Допустим, на сервере установлен proftpd, postfix и popa3d. На самом деле, сервисов может быть и больше, суть в том, чтобы не забыть о каждом из них. Итак, предположим, что postfix должен принимать данные от узла 192.168.1.1. К proftpd имеют право подключаться только клиенты сегмента 192.168.0.0/24, а снимать почту могут все. Давай оформим такую политику в виде трех несложных правил. Для удобства рекомендую создать дополнительную цепь services и подключить ее к основной INPUT.
Листинг
iptables –N services
iptables –A INPUT –j services
iptables –A services –p tcp –dport 25 –s 192.168.1.1 –j ACCEPT
iptables –A services –p tcp –dport 21 –s 192.168.0.0/24 –j ACCEPT
iptables –A services –p tcp –dport 110 –j ACCEPT
Флаг –s отвечает за IP-адрес отправителя. Он может принимать значение как отдельной станции, так и целого сегмента. Теперь, когда цепь INPUT полностью настроена, можно менять ее политику и тестировать созданные правила. Последний штрих достигается следующей командой:
iptables –P INPUT DROP
Можно сказать, что теперь твой сервер защищен от посторонних глаз. Однако существует много способов обхода фаерволов, один из которых заключается в написании connback-сценария. Последний сам соединяется с хакерской машиной. Чтобы пресечь подобные действия, необходимо фильтровать исходящий трафик. Менять политику цепи не стоит, нужно просто добавить несколько ограничивающих правил с участием модуля owner.
Фаервол покажет, кто хозяин!
Библиотека owner.so является весьма полезной. Она создана для того, чтобы запретить локальному пользователю обращаться к ресурсам сети. Часто хакеры совершают свои злодеяния с веба, и стандартная настройка брандмауэра не спасает. В случае если ты подвяжешь модуль owner, можно сделать так, чтобы процесс httpd не мог открывать порты, а тем более коннектиться на чужие машины. Это достигается всего двумя командами:
iptables –A OUTPUT -m owner -uid-owner 99 -p tcp -dport 80 -j ACCEPT
iptables -A OUTPUT -m owner -uid-owner 99 –j DROP
Модуль позволяет анализировать UID локального пользователя. Если он равен 99 (что соответствует логину nobody), правило запретит обращение к неизвестным портам. Второе правило запрещает любые действия под nobody. Оно должно располагаться ниже первого, потому что iptables анализирует рулесы по принципу от частного к общему.
Существует еще одна проблема, с которой ты можешь столкнуться. В случае если на твоем сервере прописаны другие пользователи и ты не хочешь, чтобы они прокачивали через машину фильмы и музыку, придется добавить несколько правил, которые аналогичны предыдущему. Пришло время урезать сетевые права пользователя по самые уши :). Необходимо помнить, что юзеру надо разрешить пропуск RELATED– и ESTABLISHED-пакетов, в противном случае он не сможет заливать файлы на локальный FTP.
iptables –A OUTPUT –p tcp –m state –state ! RELATED,ESTABLISHED –m owner –uid-owner 31337 –j DROP.
Этот рулес позволит фильтровать все пакеты, посланные юзером 31337. Помимо uid ты можешь ограничивать и gid, а также мутить доступ к произвольной сетевой команде. Если ты заинтересовался этим модулем, можешь ознакомиться со всеми его параметрами, набрав команду iptables –help –m owner.
Модификация пакетов
Настало время поговорить о второй таблице iptables, которая называется nat. Эта чудесная таблица содержит три цепочки: PREROUTING, OUTPUT и POSTROUTING. Правила, расположенные в этих цепях, нужны для корректировки пакета. Например, ты хочешь, чтобы машина с IP-адресом 192.168.0.2 выходила в интернет напрямую. Для этого достаточно воспользоваться маскарадингом, добавив всего одно правило в таблицу POSTROUTING.
iptables –t nat –A POSTROUTING –s 192.68.0.2 –j MASQUERADE
Суть маскарадинга заключается в замене локального IP на адрес шлюза. Получается, что конечный узел фактически соединится не с локальной машиной, а с маршрутизатором. Последний будет форвардить все пришедшие пакеты узлу с адресом 192.168.0.2.
Вообще, использовать NAT в крупной сети не рекомендуется. Если какой-нибудь юзер стянет пару гигов с порносайта, администратор не определит виновника. Поэтому вместо NAT используется прокси-сервер. При переходе на прокси возникает одна проблема: админа ломает бегать по всем машинам и прописывать адрес проксика в настройки браузера. К счастью, не все так плохо: можно просто оформить редирект портов, а затем немного настроить конфиг squid. В этом случае клиент соединится с прокси-сервером, сам того не желая :). Для выполнения редиректа вписывай легкое правило в цепь PREROUTING.
Читать дальше