Основы работы с iptables в Linux

OSzone.net » Видео » Unix » Интернет » Firewall » Основы работы с iptables в Linux
Иcточник: http://knoppix.ru/
Опубликована: 05.03.2005

iptables - встроенный в ядро брандмауэр

При написании использовался Iptables Tutorial http://gazette.linux.ru.net/rus/articles/iptables-tutorial.html

Во все ядра Linux, начиная с 2.0, встроено средство для фильтрации сетевых пакетов. В 2.0 это ipfwadm, в 2.2 - ipchains, а в 2.4 и 2.6 - iptables. Мы будем рассматривать последний вариант.

Принцип фильтрации такой: когда через ядро проходит пакет, он проверяется на совпадение с одним или несколькими правилами. При этом в зависимости от этих правил он может быть пропущен (ACCEPT), отброшен (DROP) или отклонен (REJECT). Кроме того, он может быть отправлен на проверку в следующую цепочку правил. Здесь же можно указать, что факт прохождения пакета, подходящего под определенное правило, должен быть отмечен в syslog. Правила могут включать в себя проверку адреса/порта источника/получателя, протокола, флагов TCP и т.д. (об этом ниже).

Для изменения используемого набора правил используется программа, которая так и называется - iptables (думаю, она есть в Вашем дистрибутиве). Все правила хранятся в памяти ядра и при перезагрузке сбрасываются. Поэтому необходимо создать файл конфигурации, из которого правила фильтрации будут считываться при загрузке машины. Обычно это /etc/rc.d/rc.firewall. Это обычный скрипт оболочки, который вызывает /sbin/iptables с определенными параметрами, соответствующими составленным правилам. Поэтому в большинстве дистрибутивов для изменения конфигурации iptables необходимо отредактировать указанный файл и запустить его (этот файл, как правило, автоматически выполняется при загрузке машины). После чего можно посмотреть обновленную таблицу правил командой iptables -L.

Теперь более подробно. Изначально существуют 3 цепочки, через которые пакеты входят на фильтрацию. INPUT - для входящих пакетов, OUTPUT для исходящих и FORWARD для проходящих через данную машину к другой. Пакет, прошедший соответствующую цепочку, обычно (кроме совсем простых конфигураций) на основании некоторых правил отправляется в другую (в частности, мы будем сортировать пакеты по протоколу на 3 цепочки: tcp, udp и icmp). "По дороге" часть пакетов отбрасывается (на разных этапах по разным причинам), часть (опять же лишь подходящие под определенные правила) успешно выходит из фильтра. Оставшиеся (не подошедшие ни под одно правило) следуют действию по умолчанию для этой цепочки. Обычно таким действием делают DROP или REJECT, чтобы пропускать лишь пакеты, подошедшие под вполне определенные правила. Кстати, REJECT отличается тем, что вместо простого уничтожения пакета его отправителю присылается сообщение о недоступности компьютера получателя. Это создает дополнительный траффик, но в соответствующих случаях приводит к тому, что отправитель перестает посылать нам пакеты (DROP выглядит для отправителя как таймаут, т.е. пакеты просто уходят и не приходит никакого подтверждения, а при REJECT он может посчитать, что наш комьютер недоступен или не существует).

Рассмотрим синтаксис основных команд. Здесь - ACCEPT, DROP или REJECT.

Установка действия по умолчанию для стандартной цепочки:

iptables -P

Создание цепочки:

iptables -N

Добавление правила в цепочку:

iptables -A -j

Условия могут быть в т.ч. следующие:

-p --dport --sport -s -d -i - только для INPUT --icmp-type - только для icmp

При этом допустимо между ключом и значением ставить знак !, означающий инверсию. В одном правиле может быть сразу несколько условий.

Теперь разберем, как составляются простые правила, на примере моих настроек. Замечу, что это настройки для одинокой машины без локальной сети с доступом в Интернет по диалапу, так что:

а) все исходящие (т.е. созданные локальными процессами) пакеты будут выходить наружу беспрепятственно, т.к. своим программам я доверяю;

б) абсолютное большинство входящих соединений будет запрещено;

в) будет открыт лишь 21-й TCP-порт, необходимый для FTP.

Итак, рассмотрим мой /etc/rc.d/rc.firewall. Заметьте, что вложенные цепочки описываются снизу вверх, т.е. стандартные INPUT и OUTPUT будут описаны в конце.

 

         #!/bin/sh

# для удобства, особенно если интерфейсов несколько
INET_IFACE="ppp0"
# тоже для удобства
IPTABLES="/sbin/iptables"
# включаем пересылку пакетов
echo 1 > /proc/sys/net/ipv4/ip_forward

# стандартные действия
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -P FORWARD DROP

# удаляем все имеющиеся правила
$IPTABLES -F
$IPTABLES -X
# создаем свои цепочки
# отбрасываем tcp с неправильными флагами
$IPTABLES -N bad_tcp_packets
# tcp, прошедшие основную проверку
$IPTABLES -N allowed
# все пакеты соотв. протоколов
$IPTABLES -N tcp_packets
$IPTABLES -N udp_packets
$IPTABLES -N icmp_packets

# безусловно разрешаем соединения по локальному интерфейсу (loopback, 127.0.0.1)
$IPTABLES -A INPUT -i lo -j ACCEPT
$IPTABLES -A OUTPUT -o lo -j ACCEPT

# сюда пойдут все tcp-пакеты, и будут отброшены имеющие статус NEW, но не имеющие флагов SYN,ACK
# предохраняет от определенных типов атак, подробности в приложении B4 к Iptables Tutorial
$IPTABLES -A bad_tcp_packets -p tcp --tcp-flags SYN,ACK SYN,ACK -m state --state NEW -j DROP

# принимаем все пакеты, относящиеся к уже установленным соединениям
$IPTABLES -A allowed -p TCP --syn -j ACCEPT
$IPTABLES -A allowed -p TCP -m state --state ESTABLISHED,RELATED -j ACCEPT
# а все остальные из этой цепочки сбрасываем
$IPTABLES -A allowed -j DROP

# здесь можно открыть некоторые порты, т.к. по умолчанию мы закрыли всё
# открываем 21-й tcp (File Transfer Protocol [Control])
$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 21 -j allowed
# и принимаем входящие с 53-го udp (Domain Name Server)
$IPTABLES -A udp_packets -p UDP -s 0/0 --sport 53 -j ACCEPT

# настал черед ICMP
# разрешаем необходимые типы
$IPTABLES -A icmp_packets -p ICMP -s 0/0 --icmp-type 3 -j ACCEPT # Dest unreachable
$IPTABLES -A icmp_packets -p ICMP -s 0/0 --icmp-type 11 -j ACCEPT # Time exceeded
$IPTABLES -A icmp_packets -p ICMP -s 0/0 --icmp-type 12 -j ACCEPT # Parameter problem
# и отбрасываем пинг (в принципе, он и так отбрасывается действием
# по умолчанию, но это правило для возможного редактирования)
$IPTABLES -A icmp_packets -p ICMP -s 0/0 --icmp-type 8 -j DROP # Ping
# следующим правилом можно заменить предыдущее, тогда при пинговании
# нашей машины вместо сообщения о таймауте будет приходить сообщение
# Host unreachable
#$IPTABLES -A icmp_packets -p ICMP -s 0/0 --icmp-type 8 -j REJECT --reject-with icmp-host-unreachable

# разводим пакеты по соотв. цепочкам
# tcp уходит на доп. проверку
$IPTABLES -A INPUT -p tcp -j bad_tcp_packets
# все пакеты, относящиеся к уже установленным соединениям (для tcp
# из-за отдельной цепочки пришлось это правило еще раз указать выше)
$IPTABLES -A INPUT -p ALL -i $INET_IFACE -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A INPUT -p TCP -i $INET_IFACE -j tcp_packets
$IPTABLES -A INPUT -p UDP -i $INET_IFACE -j udp_packets
$IPTABLES -A INPUT -p ICMP -i $INET_IFACE -j icmp_packets



Вот и всё, собственно. Вообще iptables имеет огромное количество настроек фильтрации и маршрутизации, особенно необходимых для брандмауэра в локальной сети. Кроме того, не были рассмотрены возможности по отслеживанию пакетов с помощью syslog. За более подробной информацией отсылаю к вышеупомянутому Iptables Tutorial и другой документации в Интернете.

При частичной или полной перепечатке, переводе, переработке материалов cайта ссылка на http://linux.su/ обязательна (c) Linux.su 2003/04


Ссылка: http://www.oszone.net/2821/