Личный блог Suvan`a.

Работая и играя с Linux... И что из этого иногда получается.

Компоненты правил IPTables(специальные совпадения)

Рубрика: Безопасность -> Брандмауэр
Метки: | | | |
Вторник, 17 февраля 2009 г.
Просмотров: 9346

Следующие совпадения можно применять только к определенному протоколу: специальные совпадения TCP к TCP-пакетам, UDP к UDP-пакетам и ICMP к ICMP-пакетам соответственно. Из-за этого их выделили в отдельную группу компонент правил IPTables. Их так и называют - специальные совпадения протокола(TCP, UDP или ICMP).

     В документе Iptables Tutorial эти совпадения называют неявными критериями выделения пакета. Под этим там понимаются те критерии, которые явно не выражены и становятся доступны только после указания критерия, например -p tcp

     Эти критерии можно подгрузить и явным образом, указав ключа -m (-match), к примеру -m tcp.

     Рассмотрим эти специальные совпадения.


     Специальные совпадения протокола TCP.

     Следующие опции используются применительно только к TCP-пакетам, так как они используют нестандартные значения, которые есть только в заголов­ке TCP-пакета: порты отправителя и получателя, TCP-опции и ТСР-флаги (к примеру, ASK,SYN). Для использования этих опций прежде нужно указать протокол TCP (может быть указан явно (-р tcp) или неявно (-р icmp)).

--sport (--source-port) <порт>

     Опция --sport задает порт отправителя. Порт может быть задан как чис­лом, к примеру 22, так и соответствующим этому числу именем, в частности ssh (имена портов и их номера указаны в файле /etc/services).

# iptables -A INPUT -p tcp —-sport 22 -j REJECT

# iptables -A INPUT -p tcp —-sport ssh -j REJECT

     Эти правила служат одной цели (отклонение входящего TCP-трафика, идущего от 22-го порта удаленной машины), но второе правило лучше читаемо. Трудно запомнить, какой порт использует каждый сервис. Поэтому предпочтительней указывать имена портов вместо номеров, тем более что это несущественно понижает производительность, и повышается читабельность правил фильтра пакетов.

     С помощью опции --sport также можно задать диапазон портов:

# iptables -A OUTPUT -p tcp --sport 0:1024 -j REJECT

     Это правило будет отклонять все исходящие TCP-пакеты с номерами портов от 0 до 1024. Можно не указывать одно из значений - тогда будет использоваться, соответственно, наименьшее или наибольшее значение:

# iptables -A OUTPUT -p tcp --sport :1024 -j REJECT

     Это правило подобно предыдущему. Вот еще пример использования данной опции:

# iptables -A OUTPUT -p tcp --sport 40000: -j ACCEPT

     Данное правило разрешает порты с номерами от 40000 до 65535 (наиболь­шее значение порта).

     При указании номера порта (или его имени) также можно указывать отрицание. Рассмотрим такой пример, который допускает использование всех портов, кроме 80:

# iptables -A OUTPUT -p tcp --sport ! 80 -j ACCEPT

     Если нужно, можно комбинировать (!) и диапазон портов, например:

# iptables -A OUTPUT -р tcp --sport ! 1024:40000 -j LOG

     В данном случае будут протоколироваться (LOG) порты с номерами от 0 до 1023 и от 40001 до 65535.

     Также можно указывать порты через запятую, к примеру --sport 21,22,80. Но этот синтаксис уже относится к явным совпадениям компонентов правил. Указывается с помощью расширения --multiport.

Если же по ошибке указать неправильный порядок портов, к примеру --sport 100:50, то IPTables сам поменяет их места­ми.

--dport (--destination-port) <порт>

     Данная опция описывает порт или диапазон портов получателя. Все, что было написано для --sport, справедливо и для --dport.

     Эту опцию можно использовать, если нужно запретить пользователям внутренней сети использовать определенные приложения, к примеру, нужно запретить пользователям внутренней сети подключаться к внешним (в Интернете) IRC-серверам. IRC использует диапазон номеров портов от 6667 до 66670:

# iptables -A OUTPUT -p tcp --dport 66670:66670 -j REJECT

--tcp-flags <маска> <флаги>

     Опция --tcp-flags определяет маску и флаги, установленные в ТСР-заголовке, которые должны совпасть с правилом.

     Первый аргумент - это разделенный запятыми список флагов, которые будем сравнивать, а второстепенный - список флагов, которые должны быть установ­лены (то есть флаги, которые перечислены в первом аргументе, но не пере­числены во втором, должны быть сброшены, то есть, не установлены).

     Допустимые флаги: SYN, ACK, FIN, RST, IRG, PSH. Можно также использовать ALL (все) или NONE (ни один).

     Рассмотрим пример, в маске которого указаны флаги SYN, ACK, FIN, RST, но толь­ко один из них - SYN - должен быть установлен:

# iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST SYN -j ACCEPT

В этом правиле также можно использовать отрицание.

# iptables -A FORWARD -p tcp --tcp-flags ! SYN,ACK,FIN,RST SYN -j ACCEPT

    Здесь, наоборот флаги ACK,FIN,RST должны быть установлены, a SYN - нет.

--syn

     Опция --syn крайне полезна для контроля входящих попыток соединения. На первой стадии установки TCP-соединения отправляется пакет с флагом SYN. Если запретить этот флаг, то все входящие соеди­нения будут запрещены. Для этой цели можно было бы ис­пользовать и предыдущую опцию, но эта опция пишется короче:

# iptables -A FORWARD -p tcp --syn -j ACCEPT

# iptables -A FORWARD -p tcp ! --syn -j ACCEPT

--tcp-option <число>

     TCP-опции --tcp-option - это необязательная часть TCP-заголовка, дающая некоторые возможности, к примеру установку размера окна, выборочное подтверждение, а также обмен временными метками. Для фильтра TCP-опций нужно знать их номера (http://www.iana.org/ assignments/tcp-parameters):

# iptables -A INPUT -p tcp --tcp-option 8 -j LOG

     Здесь протоколируются TCP-опции с номером 8 (временная метка).

     Специальные совпадения протокола UDP.

     UDP - это протокол, не требующий соединения, следовательно, с ним нельзя ис­пользовать флаги, связанные с протоколом TCP. Поскольку адреса отправителя и получателя - это прерогатива протокола IP, все, что осталось протоколу UDP, - это номера портов отправителя и получателя. Как и в случае с протоколом TCP, для установки этих значений используются следующие опции:

--sport (--source-port) <порт>

     Опция --sport задает исходный порт, с которого был отправлен пакет. Значения такие же, как и для протокола TCP. Пример:

# iptables -A INPUT -p udp --sport 53 -j ACCEPT

     В этом примере разрешаются все входящие пакеты с порта DNS-сервера 53.

     При составлении правил для UDP обязательно нужно указывать опцию -p udp.

--dport (--destination-port) <порт>

     Опция --dport задает порт, на который адресован пакет. Значения такие же, как и для протокола TCP. Пример:

# iptables -A INPUT -p udp --dport 53 -j ACCEPT

     В этом примере разрешаются пакеты, входящие на порт DNS-сервера 53.

     Как и ранее, символ ! инвертирует совпадение, например: --source-port ! 53 задает любой порт, кроме 53.

     Специальные совпадения протокола ICMP.

     Этот протокол используется для передачи сообщений об ошибках и для управления соединением. У ICMP-пакетов нет портов отправителя/получателя, следовательно все, что нужно - это установить образец для сравнения типа ICMP-сообщений:

--icmp-type <номер>

Как пример, следующее правило будет блокировать все входящие IСМР-пакеты типа 8 (echo requests - пинг):

# iptables -A INPUT -p icmp --icmp-type 8 -j DROP

     Очень важно: для всем перечисленных специальных совпадений действуют все те же правила, что и для общих. То есть, можно указывать интерфейс, адрес отправителя и адрес получателя.

     Примеры:

# iptables -A INPUT -p UDP -i eth0 -s 0.0.0.0/0 -j ACCEPT

# iptables -A INPUT -p TCP -i eth1 -d 172.16.0.1 --dport 8080 -s 172.16.1.84 -j ACCEPT

# iptables -A FORWARD -s 192.168.0.2 -d 172.16.0.1 -i eth1 -p tcp --dport 8080 -j ACCEPT

# iptables -A INPUT -p TCP -i eth1 -d 172.16.0.1 --dport 8080-s 192.168.0.2 -j ACCEPT

# iptables -A OUTPUT -p TCP -o eth1 -s 172.16.0.1 --sport 8080-d 192.168.0.2 -j ACCEPT