Общий синтаксис команды IPTables.
Метки: IPTables | iptables-restore | iptables-save
Четверг, 12 февраля 2009 г.
Просмотров: 11019
Для изменения правил цепочек используется команда iptables. Детальное описание опций этой команды можно найти в соответствующем руководстве из справочной системы Linux (команда man iptables).
Iptables можно запускать просто из командной строки, рекомендуется создать bash-сценарий, содержащий команды iptables. Преимущества: во-первых, упрощается управление правилами, а во-вторых, правила применяются немедленно - одно за другим. Это удобно при удаленном управлении брандмауэром.
Первое правило написания правил для брандмауэра - это блокировка любого трафика, после разрешение некоторого трафика, удовлетворяющего определенным условиям. Если выполнять команды построчно, то первая команда блокировки завершит 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) отправителю будет отправлено 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.
- Общий синтаксис команды IPTables.