# iptables -A INPUT -m state -p tcp --dport 80 \
--state NEW,ESTABLISHED,RELATED -j ACCEPT
# iptables -A OUTPUT -m state -p tcp --sport 80 \
--state ESTABLISHED,RELATED -j ACCEPT
Эти правила включают проверку входящих и исходящих пакетов. Для проверки пакетов, передаваемых с компьютера, значение NEW
опции --state
не задано, так как новое соединение может устанавливаться только по инициативе клиента. Эти правила препятствуют перехвату существующих соединений с Web-сервером.
На заметку
Проверка пакетов с учетом состояния может осуществляться только в тех системах, в которых используется версия ядра 2.4.x. Предыдущими версиями ядра такая возможность не поддерживается. Это может стать одним из стимулов перехода к использованию iptables
.
Использование дополнительных опций
Программа iptables
поддерживает большое количество опций, которые могут быть использованы для создания брандмауэров. Например, посредством опции --new-chain
( -N
) можно создать новую цепочку, указав опцию --fragment
( -f
), можно создать правило, которое будет применяться ко второму и к последующим фрагментам фрагментированного пакета, а опция --tcp-flags
дает возможность организовать проверку на присутствие флагов в составе TCP-пакета. Дополнительную информацию об этих и о других опциях вы можете получить на страницах справочной системы Linux, посвященных iptables
.
Сценарий для создания брандмауэра
В завершение разговора о средствах фильтрации пакетов рассмотрим сценарий, который создает брандмауэр. Код сценария представлен в листинге 25.1. Данный сценарий предназначен для компьютера, на котором выполняется Web-сервер и который поддерживает SSH-соединения с компьютерами, подключенными к локальной сети.
Внимание
Сценарии брандмауэров, предназначенные для практического применения, содержат гораздо больший объем кода по сравнению представленным в листинге 25.1. Для удобства чтения в данном листинге при вызове iptables
не указывается путь к файлу. В реальных сценариях это недопустимо. Не указывая путь к файлу, вы создаете угрозу безопасности системы. Код, приведенный в листинге 25.1, может послужить основой для создания более сложных сценариев.
Листинг 25.1. Простой сценарий, использующий iptables
для создания брандмауэра
#!/bin/sh
iptables -F INPUT
iptables -F OUTPUT
iptables -F FORWARD
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
# Разрешить NDS-трафик
iptables -A INPUT -p udp --sport 53 -j ACCEPT
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
# Разрешить обмен клиентов с локальной сетью
iptables -A INPUT -m state -p tcp --dport 1024:65535 \
--state ESTABLISHED,RELATED -s 192.168.9.0/24 -j ACCEPT
iptables -A OUTPUT -m state -p tcp --sport 1024:65535 \
! --state INVALID -d 192.168.9.0/24 -j ACCEPT
# Разрешить все HTTP-соединения
iptables -A INPUT -m state -p tcp --dport 80 \
! --state INVALID -j ACCEPT
iptables -A OUTPUT -m state -p tcp --sport 80 \
--state ESTABLISHED, RELATED -j ACCEPT
# Разрешить обращения к SSH-серверу
# из локальной сети (192.168.9.0/24)
iptables -A INPUT -m state -p tcp --dport 22 \
! --state INVALID 192.168.9.0/24 -j ACCEPT
iptables -A OUTPUT -m state -p tcp --sport 22 \
--state ESTABLISHED,RELATED -d 192.168.9.0/24 -j ACCEPT
# Разрешить прохождение локального трафика через интерфейс lo
iptables -A INPUT -s 127.0.0.1 -i lo -j ACCEPT
iptables -A OUTPUT -d 127.0.0.1 -o lo -j ACCEPT
Ниже описаны некоторые особенности кода, приведенного в листинге 25.1.
• Удаление существующих правил и установка политики по умолчанию. В первых шести строках программа iptables
вызывается для удаления правил, присутствующих в цепочках, и установки политики по умолчанию. В качестве политики по умолчанию задается действие DROP
. Несмотря на то что компьютер не выполняет маршрутизацию пакетов, политика по умолчанию задается также и для цепочки FORWARD
. Это делается на случай, если на компьютере будет установлен еще один сетевой интерфейс.
• Взаимодействие с сервером DNS. Для того чтобы компьютер мог взаимодействовать с сервером DNS, две строки, следующие за комментариями "Разрешить NDS-трафик", предоставляют компьютеру возможность обращаться к удаленным серверам DNS (UDP-порт 53). Возможности соединения не ограничиваются одним адресом; компьютеру разрешено взаимодействовать с любым сервером имен. Если понадобится, вы можете наложить более жесткие ограничения.
• Обмен с клиентами локальной сети. Строки, следующие за комментариями "Разрешить обмен клиентов с локальной сетью", открывают путь трафику, связанному с непривилегированными портами (1024-65535). В цепочки INPUT
и OUTPUT
включены правила проверки пакетов с учетом состояния. Заметьте, что правило в цепочке INPUT
запрещает установление новых соединений, поэтому, даже если на компьютере будет находиться сервер, принимающий обращения через непривилегированные порты, другие компьютеры не смогут обратиться к нему. Цепочки INPUT
и OUTPUT
ограничивают взаимодействие компьютерами локальной сети. При создании реального брандмауэра следует рассмотреть возможность замены этих правил более конкретными, которые разрешали бы прохождение данных между непривилегированными локальными портами и портами, используемыми для поддержки отдельных протоколов.
Читать дальше