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

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

Общий синтаксис команды IPTables.

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

Для изменения правил цепочек используется команда iptables. Детальное описание опций этой команды можно найти в соответствующем руководстве из справочной системы Linux (команда man iptables).

     Iptables можно запускать просто из командной строки, рекомендуется создать bash-сценарий, содержащий команды ipta­bles. Преимущества: во-первых, упрощается управление правилами, а во-вторых, правила применяются немедленно - одно за другим. Это удобно при удаленном управлении брандмауэ­ром.


     Первое правило написания правил для брандмауэра - это блокировка любого трафика, после разрешение некоторого трафика, удовлетворяющего определенным условиям. Если выполнять ко­манды построчно, то первая команда блокировки завершит SSH-соединение, и брандмауэр станет недоступен по сети.

     Недостаток использования сценариев для IPTables в том, что для каждой команды iptables набор правил должен быть из­влечен из ядра и изменен в соответствии с командой. При добавле­нии большого числа команд это занимает немало времени. Для решения этой проблемы есть две утилиты iptables-save и iptables-restore. Первая команда сохраняет набор правил в текстовом файле, а вторая восстанавли­вает набор правил из текстового файла.

     Iptables-save выводит набор правил на вывод STDOUT (консоль), следовательно, нужно использовать перенаправле­ние ввода/вывода для сохранения вывода программы в обычном файле:

# iptables-save > fw.rules

# cat fw.rules

# Generated by iptables-save v1.2.9 on Thu Feb 02 14:45:18 2008

*filter

:INPUT DROP [20575:2040223]

:FORWARD DROP [0:0]

:OUTPUT ACCEPT [650:130512]

:allowed - [0:0]

-A INPUT -d 127.0.0.1 -i lo -j ACCEPT

-A INPUT -i eth0 -j ACCEPT

COMMIT

# Completed on Thu Feb 02 14:45:18 2008

     Для восстановления набора правил из текстового файла исполняется команда:

# iptables-restore < fw.rules

     Утилиты iptables-save и iptables-restore ускоряют процесс сохранения/загрузки правил брандмауэра и делают его более гибким. Как правило, команда iptables-save вставляется в сценарий, вызываемый при завершении работы системы, а команда iptables-restore - в сценарий за­грузки системы.

     Описание синтаксиса.

     Рассмотрим синтаксис команды iptables:

iptables -t <таблица> <команды> -j <цель>

     Параметр -t задает название таблицы, над которой нужно выполнить действие (filter, NAT или mangle). Дальше идет список команд, которые выполняются над цепочками внутри указанной табли­цы. Нередко используемыми командами являются:

-А <цепочка> <правила>: добавляет правило к цепочке, например:

     # iptables -t filter -A INPUT -p tcp -dport 111 -j DROP

(это правило запрещает все входящие TCP-соединения по порту 111). Порядок, в котором добавляются правила, чрезвычайно важен. Применение правил начинается сверху вниз (с первого добавленного до последнего добавлен­ного правила цепочки, при условии, что вначале цепочка была пуста), новое правило добавляется в конец цепочки.

-D <цепочка> <позиция в цепочке> <правило>: удаляет прави­ло из цепочки. При удалении можно написать как само правило, так и его номер в цепочке:

     # iptables -D INPUT -7

Можно также задать само правило:

     # iptables -D INPUT -p tcp -dport 111 -j DROP

     Если это правило встречается в цепочке больше одного раза, будет удалено первое попавшееся правило при просмотре сверху вниз.

     

-L <цепочка>: используется для просмотра всех правил. Если зада­на цепочка - для просмотра правил указанной цепочки:

# iptables -L

Chain INPUT (policy ACCEPT)

target prot opt source destination

Chain FORWARD (policy ACCEPT)

target prot opt source destination

ACCEPT all - anywhere anywhere

Chain OUTPUT (policy ACCEPT)

target prot opt source destination

     Если с помощью параметра -t не задана таблица, то в команде -L будет использована таблица filter. В листинге выведена таблица filter.

     Можно указать как таблицу, так и цепочку, например:

# iptables -L PREROUTING -t nat

Chain PREROUTING (policy ACCEPT)

target prot opt source destination

DNAT tcp - anywhere anywhere tcp dpt:http

to:172.16.0.1

     По умолчанию iptables показывает IP-адреса узлов в символьные имена, что замедляет вывод правил. Для того, чтобы iptables не разре­шал IP-адреса в имена компьютеров, служит опция -n.

-F <цепочка>: удаляет все правила или выбранную цепочку (если цепочка не указана, то все цепочки,). Таблица всегда указыва­ется с помощью опции -t.

-Р <цепочка> <цель|действие>: задает действие по умолча­нию для выбранной цепочки. В вышеприведенных примерах для цепочек по умолчанию используется действие ACCEPT. При добавлении правила необходимую цель можно указать с помощью -j.

     Наиболее часто используемыми действиями являются:

  • ACCEPT - если пакет совпадает с правилом, он будет принят.

  • REJECT - отклонить пакет и отправить ICMP-сообщение об ошиб­ке назад отправителю.
  • DROP - отбросить пакет и ничего не посылать в ответ.
  • LOG - протоколировать детали пакета, если пакет совпадает с правилом. Данное действие является пассивным - нужно оп­ределить еще одно действие ACCEPT/DROP, если нужно, чтобы пакет был принят/отброшен.
     REJECT или DROP?

     В обоих этих случаях пакет будет отброшен. Разница между ними заключается в том, что в первом случае (при использовании REJECT) отправителю будет отправлено ICMP-сообщение "Port unreachable" («Порт недоступен»), а во втором случае ничего отправляться не будет. Во втором случае отправитель будет ждать ответа, пока не решит, что пакет потерян.

     Если надо отклонить (REJECT) все входящие соединения к Web-серверу, то пользователи сразу получат сообщение «В соединении отказано» (Connection refused). Если же выбрано действие DROP, то пользователи будут ждать, пока не выйдет таймаут - они получат сообщение «Таймаут соединения» (Connection Time Out).

     Более корректным является действие REJECT, но в этом случае возвращенное ICMP-сообщение может предоставить крекеру полезную для него информацию. С точки зрения безопасности нужно использовать действие DROP.

     Хотя ICMP-сообщение «Порт недоступен» корректно, для закрытых TCP-портов нужно использовать ответ с установ­ленным флагом RST (reset). Этот метод используется почти все­ми современными реализациями TCP-стека. Отправка сообщения «Порт недоступен» сообщит злоумышленнику, что в сети установлен брандмауэр. Действие REJECT можно контролировать с по­мощью опции -reject-with:

# iptables -A INPUT -p tcp -i <внутренний интерфейс> -dport 22 -j REJECT -reject-with tcp-reset

     Здесь действие REJECT вместо ICMP-сообщения «Порт недоступен» будет использовать ответ tcp-reset.