Если вы используете политику по умолчанию DROP или REJECT, вам необходимо разрешить клиентским программам взаимодействовать с внешними серверами. Для этого выполните следующие действия.
• Разрешите доступ к серверным портам внешних компьютеров. Соответствующее правило, включаемое в цепочку INPUT, должно создаваться с указанием опции --source-port, а при создании правила, помещаемого в цепочку OUTPUT, должна использоваться опция --destination-port. Для брандмауэра, совмещенного с маршрутизатором, необходимо также включить в цепочку FORWARD правила, созданные с помощью опций --source-port и --destination-port. Возможно, что наряду с номерами портов вам потребуется задать IP-адреса ваших компьютеров. Таким способом вам следует разрешить обращение вовне по каждому из протоколов, которые используются клиентами, выполняемыми в вашей сети.
• Разрешите доступ к непривилегированным портам компьютеров вашей сети. Номера непривилегированных портов лежат в диапазоне 1024-65535. В опциях --source-port и --destination-port указываются границы диапазона, разделенные двоеточием, например --source-port 1024:65535. Для принимаемых пакетов вы можете указать также опцию ! syn. Правилам, в которых указана опция --syn, соответствуют только пакеты, содержащие запросы на установление соединений, а символ ! означает отрицание, т.е. заданному правилу будут удовлетворять только пакеты, которые были переданы серверами в ответ на запросы клиентов.
При создании правил могут указываться IP-адреса или блоки IP-адресов. IP-адрес источника задается с помощью опции --source (-s), а IP-адрес назначения — посредством опции --destination (-d). Например, если вы хотите запретить взаимодействие с компьютерами сети 172.24.0.0/16, вам надо создать правила, которые отвергали бы пакеты, переданные из указанной сети, а также пакеты, адресованные компьютерам этой сети. Соответствующие команды имеют следующий вид:
# iptables -A INPUT -s 172.24.0.0/16 -j DROP
# iptables -A OUTPUT -d 172.24.0.0/16 -j DROP
Опции -s и -d часто используются вместе с опциями, определяющими номера портов. Таким образом, вы можете сформировать правила, согласно которым взаимодействовать по сети будут иметь право только определенные компьютеры, обращающиеся по определенным портам. Предположим, например, что вы создаете брандмауэр для защиты локальной сети, но хотите при этом разрешить удаленным пользователям, работающим в сети 10.34.176.0/24, обращаться к серверам SSH локальной сети (серверы SSH ожидают обращения через порт 22). Для этого надо определить следующие команды:
# iptables -A FORWARD -s 10.34.176.0/24 -p tcp \
--destination-port 22 -j ALLOW
# iptables -A FORWARD -d 10.34.176.0/24 -p tcp \
--source-port 22 -j ALLOW
Поскольку в данном примере модифицируется только цепочка FORWARD, пользователям не предоставляется доступ к серверу SSH компьютера, на котором выполняется брандмауэр (если такой сервер имеется на этой машине). Возможно, вы захотите создать правила, которые разрешали бы обращаться к этому серверу с компьютеров локальной сети. Если адрес вашей локальной сети 192.168.9.0/24, то соответствующие команды будут выглядеть так:
# iptables -A INPUT -s 192.168.9.0/24 -р tcp \
--destination-port 22 -j ALLOW
# iptables -A OUTPUT -d 192.168.9.0/24 -p tcp \
--source-port 22 -j ALLOW
При создании правил фильтрации можно указывать сетевой интерфейс, например ppp0 или eth1. Данный подход в основном используется на компьютерах с несколькими интерфейсами, выполняющих функции маршрутизаторов. Применение в составе правила сведений об интерфейсе позволяет противодействовать фальсификации адресов, в частности, включению в заголовки пакетов, приходящих извне, адресов компьютеров локальной сети. Правила, в которых интерфейс задается с помощью опции --in-interfасе (-i), как правило, помещаются в цепочки INPUT и FORWARD, а правила, создаваемые с использованием опции --out-interface (-о), обычно предназначены для включения в цепочки FORWARD и OUTPUT. Предположим, что адрес вашей локальной сети 192.168.9.0/24, маршрутизатор, совмещенный с брандмауэром, подключен к ней с помощью интерфейса eth1, а соединение маршрутизатора с Internet осуществляется посредством интерфейса eth0. Правила, препятствующие фальсификации адресов, имеют следующий вид:
# iptables -A INPUT -s 192.168.9.0/24 -i eth0 -j DROP
# iptables -A FORWARD -s 192.168.9.0/24 -i eth0 -j DROP
# iptables -A FORWARD -s !192.168.9.0/24 -i eth1 -j DROP
# iptables -A OUTPUT -s !192.168.9.0/24 -i eth1 -j DROP
Первые две команды отвергают поступающие извне (через интерфейс eth0) пакеты, адресованные маршрутизатору или компьютерам локальной сети, в которых указано, что они отправлены из локальной сети. Последние две команды блокируют пакеты, направленные в Internet (поступающие через интерфейс eth1), в которых указан IP-адрес источника, не совпадающий с адресами компьютеров локальной сети.
Одна из самых новых возможностей фильтрации пакетов, реализованных в системе Linux, позволяет учитывать при проверке пакетов состояние соединения. Средства, рассмотренные ранее в этой главе, позволяли обрабатывать отдельные пакеты, независимо от того, являлись ли они частью соединения или были специально сгенерированы для организации атаки. (Ранее уже встречалась опция --syn, позволяющая определить пакет, содержащий запрос на установление соединения. Существуют средства, которые предоставляют возможность включить свои пакеты в набор пакетов, передаваемых в рамках действующего соединения. Такое включение пакетов называется перехватом TCP- соединения.) Средства проверки пакетов с учетом состояния определяют принадлежность пакетов к текущему соединению, анализируя последовательные номера, IP-адреса, указанные в заголовках, и другие характеристики пакетов. Правила, реализующие такую проверку, позволяют отвергать посторонние пакеты, включенные в состав данных, которые передаются в рамках существующего соединения.
Для включения средств проверки пакетов с учетом состояния используется опция --state, предваряемая опцией -m состояние. Для опции --state можно задать одно или несколько значений. Если вы указываете несколько значений, они должны разделяться запятыми. Символ ! перед опцией --state изменяет ее действие на обратное. Ниже перечислены допустимые параметры опции --state.