Компоненты правил IPTables(специальные совпадения)
Метки: ICMP | IPTables | tcp | tcp-options | udp
Вторник, 17 февраля 2009 г.
Просмотров: 4303
Следующие совпадения можно применять только к определенному протоколу: специальные совпадения 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
- Компоненты правил IPTables(общие)
- Компоненты правил IPTables(специальные совпадения)