Различия
Здесь показаны различия между двумя версиями данной страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
wiki:iptables [2013/10/05 22:20] [Логирование и трассировка] |
wiki:iptables [2016/03/02 11:32] (текущий) |
||
---|---|---|---|
Строка 1: | Строка 1: | ||
====== Iptables ====== | ====== Iptables ====== | ||
- | Iptables — утилита [[командная_строка|командной строки]], является стандартным интерфейсом управления работой [[firewall|межсетевого экрана]] (брандмауэра) Netfilter для ядер Linux, начиная с версии 2.4. С её помощью администраторы создают и изменяют правила, управляющие фильтрацией и перенаправлением пакетов. Для работы с семейством протоколов IPv6 существует отдельная версия утилиты — Ip6tables. Для использования утилиты Iptables требуются привилегии суперпользователя (root). | + | Iptables — утилита [[командная_строка|командной строки]], является стандартным интерфейсом управления работой [[firewall|межсетевого экрана]] (брандмауэра) Netfilter для ядер Linux, начиная с версии 2.4. С её помощью администраторы создают и изменяют правила, управляющие фильтрацией и перенаправлением пакетов. Для работы с семейством протоколов IPv6 существует отдельная версия утилиты — Ip6tables. Для использования утилиты Iptables требуются привилегии [[суперпользователь_в_ubuntu|суперпользователя]] (root). |
===== Основные понятия ===== | ===== Основные понятия ===== | ||
Строка 14: | Строка 14: | ||
* Пользовательская цепочка — цепочка, созданная пользователем. Может использоваться только в пределах своей таблицы. Рекомендуется не использовать для таких цепочек имена в верхнем регистре, чтобы избежать путаницы с базовыми цепочками и встроенными действиями. | * Пользовательская цепочка — цепочка, созданная пользователем. Может использоваться только в пределах своей таблицы. Рекомендуется не использовать для таких цепочек имена в верхнем регистре, чтобы избежать путаницы с базовыми цепочками и встроенными действиями. | ||
- Таблица — совокупность базовых и пользовательских цепочек, объединенных общим функциональным назначением. Имена таблиц (как и модулей критериев) записываются в нижнем регистре, так как в принципе не могут конфликтовать с именами пользовательских цепочек. При вызове команды iptables таблица указывается в формате -t имя_таблицы. При отсутствии явного указания, используется таблица filter. | - Таблица — совокупность базовых и пользовательских цепочек, объединенных общим функциональным назначением. Имена таблиц (как и модулей критериев) записываются в нижнем регистре, так как в принципе не могут конфликтовать с именами пользовательских цепочек. При вызове команды iptables таблица указывается в формате -t имя_таблицы. При отсутствии явного указания, используется таблица filter. | ||
- | |||
- | В системе netfilter, пакеты пропускаются через цепочки. Цепочка является упорядоченным списком правил, а каждое правило может содержать критерии и действие или переход. Когда пакет проходит через цепочку, система netfilter по очереди проверяет, соответствует ли пакет всем критериям очередного правила, и если так, то выполняет действие (если критериев в правиле нет, то действие выполняется для всех пакетов проходящих через правило). Вариантов возможных критериев очень много. Например, пакет соответствует критерию --source 192.168.1.1 если в заголовке пакета указано, что отправитель — 192.168.1.1. Самый простой тип перехода, --jump, просто пересылает пакет в начало другой цепочки. Также при помощи --jump можно указать действие. Стандартные действия доступные во всех цепочках — ACCEPT (пропустить), DROP (удалить), QUEUE (передать на анализ внешней программе), и RETURN (вернуть на анализ в предыдущую цепочку). Например, команды | ||
- | |||
- | <code bash>iptables -A INPUT --source 192.168.1.1 --jump ACCEPT | ||
- | iptables -A INPUT --jump other_chain</code> | ||
- | |||
- | означают "добавить к концу цепочки INPUT следующие правила: пропустить пакеты из 192.168.1.1, а всё, что останется — отправить на анализ в цепочку other_chain". | ||
Синтаксический анализ: | Синтаксический анализ: | ||
Строка 34: | Строка 27: | ||
[17:1020] -A INPUT -i em1 -p tcp -m tcp --dport 22 -j ACCEPT | [17:1020] -A INPUT -i em1 -p tcp -m tcp --dport 22 -j ACCEPT | ||
COMMIT</code> | COMMIT</code> | ||
+ | |||
+ | ==== Архитектура ==== | ||
+ | |||
+ | В системе netfilter, пакеты пропускаются через цепочки. Цепочка является упорядоченным списком правил, а каждое правило может содержать критерии и действие или переход. Когда пакет проходит через цепочку, система netfilter по очереди проверяет, соответствует ли пакет всем критериям очередного правила, и если так, то выполняет действие (если критериев в правиле нет, то действие выполняется для всех пакетов проходящих через правило). Вариантов возможных критериев очень много. Например, пакет соответствует критерию --source 192.168.1.1 если в заголовке пакета указано, что отправитель — 192.168.1.1. Самый простой тип перехода, --jump, просто пересылает пакет в начало другой цепочки. Также при помощи --jump можно указать действие. Стандартные действия доступные во всех цепочках — ACCEPT (пропустить), DROP (удалить), QUEUE (передать на анализ внешней программе), и RETURN (вернуть на анализ в предыдущую цепочку). Например, команды | ||
+ | |||
+ | <code bash>iptables -A INPUT --source 192.168.1.1 --jump ACCEPT | ||
+ | iptables -A INPUT --jump other_chain</code> | ||
+ | |||
+ | означают "добавить к концу цепочки INPUT следующие правила: пропустить пакеты из 192.168.1.1, а всё, что останется — отправить на анализ в цепочку other_chain". | ||
+ | |||
+ | ==== Цепочки ==== | ||
+ | |||
+ | Существует 5 типов стандартных цепочек, встроенных в систему: | ||
+ | |||
+ | * PREROUTING — для изначальной обработки входящих пакетов. | ||
+ | * INPUT — для входящих пакетов адресованных непосредственно локальному процессу (клиенту или серверу). | ||
+ | * FORWARD — для входящих пакетов перенаправленных на выход (заметьте, что перенаправляемые пакеты проходят сначала цепь PREROUTING, затем FORWARD и POSTROUTING). | ||
+ | * OUTPUT — для пакетов генерируемых локальными процессами. | ||
+ | * POSTROUTING — для окончательной обработки исходящих пакетов. | ||
+ | |||
+ | Также можно создавать и уничтожать собственные цепочки при помощи утилиты iptables. | ||
+ | |||
+ | ==== Таблицы ==== | ||
+ | |||
+ | Цепочки организованны в 4 таблицы: | ||
+ | |||
+ | * raw — просматривается до передачи пакета системе определения состояний. Используется редко, например для маркировки пакетов, которые НЕ должны обрабатываться системой определения состояний. Для этого в правиле указывается действие NOTRACK. Содержит цепочки PREROUTING и OUTPUT. | ||
+ | * mangle — содержит правила модификации (обычно заголовка) IP‐пакетов. Среди прочего, поддерживает действия TTL (Time to live), TOS (Type of Service), и MARK (для изменения полей TTL и TOS, и для изменения маркеров пакета). Редко необходима и может быть опасна. Содержит все пять стандартных цепочек. | ||
+ | * nat — просматривает только пакеты, создающие новое соединение (согласно системе определения состояний). Поддерживает действия DNAT, SNAT, MASQUERADE, REDIRECT. Содержит цепочки PREROUTING, OUTPUT, и POSTROUTING. | ||
+ | * filter — основная таблица, используется по умолчанию если название таблицы не указано. Содержит цепочки INPUT, FORWARD, и OUTPUT. | ||
+ | |||
+ | Цепочки с одинаковым названием, но в разных таблицах — совершенно независимые объекты. Например, raw PREROUTING и mangle PREROUTING обычно содержат разный набор правил; пакеты сначала проходят через цепочку raw PREROUTING, а потом через mangle PREROUTING. | ||
+ | |||
+ | ==== Состояния ==== | ||
+ | |||
+ | В системе netfilter, каждый пакет проходящий через механизм определения состояний, может иметь одно из четырёх возможных состояний: | ||
+ | |||
+ | * NEW — пакет открывает новый сеанс. Классический пример — пакет TCP с флагом SYN. | ||
+ | * ESTABLISHED — пакет является частью уже существующего сеанса. | ||
+ | * RELATED — пакет открывает новый сеанс, связанный с уже открытым сеансом. Например, во время сеанса пассивного FTP, клиент подсоединяется к порту 21 сервера, сервер сообщает клиенту номер второго, случайно выбранного порта, после чего клиент подсоединяется ко второму порту для передачи файлов. В этом случае второй сеанс (передача файлов по второму порту) связан с уже существующим сеансом (изначальное подсоединение к порту 21). | ||
+ | * INVALID — все прочие пакеты. | ||
===== Диаграмма прохождения таблиц и цепочек ===== | ===== Диаграмма прохождения таблиц и цепочек ===== | ||
Строка 47: | Строка 81: | ||
===== Базовая конфигурация ===== | ===== Базовая конфигурация ===== | ||
- | При использовании IPv6-адресации конфигурацию для IPv6 следует выполнять независимо от IPv4. | + | Ниже приведён пример базовой статической конфигурации iptables. При сохранении и загрузке подобной конфигурации необходимо принимать во внимание возможность внесения в неё изменений со стороны других сервисов, например [[Fail2ban]]. Кроме того, при использовании IPv6-адресации конфигурацию для IPv6 следует выполнять независимо от IPv4. |
- | + | ||
- | Ниже приведён пример базовой статической конфигурации iptables для обоих случаев. | + | |
==== IPv4 ==== | ==== IPv4 ==== | ||
Строка 88: | Строка 119: | ||
#-A OUTPUT -j REJECT --reject-with icmp-host-prohibited | #-A OUTPUT -j REJECT --reject-with icmp-host-prohibited | ||
COMMIT</code> | COMMIT</code> | ||
+ | |||
+ | Дополняем нужными правилами с учётом iptables-save. | ||
Сохраняем и закрываем: <key>Ctrl</key>+<key>O</key>, <key>Enter</key>, <key>Ctrl</key>+<key>X</key> | Сохраняем и закрываем: <key>Ctrl</key>+<key>O</key>, <key>Enter</key>, <key>Ctrl</key>+<key>X</key> | ||
Строка 133: | Строка 166: | ||
#-A OUTPUT -j REJECT --reject-with icmp6-adm-prohibited | #-A OUTPUT -j REJECT --reject-with icmp6-adm-prohibited | ||
COMMIT</code> | COMMIT</code> | ||
+ | Дополняем нужными правилами с учётом ip6tables-save. | ||
Сохраняем и закрываем: <key>Ctrl</key>+<key>O</key>, <key>Enter</key>, <key>Ctrl</key>+<key>X</key> | Сохраняем и закрываем: <key>Ctrl</key>+<key>O</key>, <key>Enter</key>, <key>Ctrl</key>+<key>X</key> | ||
Строка 138: | Строка 172: | ||
Делаем скрипт исполняемым и загружаем правила iptables: | Делаем скрипт исполняемым и загружаем правила iptables: | ||
- | <code bash>sudo chmod +x /etc/network/if-up.d/iptables-rules | + | <code bash>sudo chmod +x /etc/network/if-up.d/ip6tables-rules |
- | sudo /etc/network/if-up.d/iptables-rules</code> | + | sudo /etc/network/if-up.d/ip6tables-rules</code> |
===== Дополнительные правила ===== | ===== Дополнительные правила ===== | ||
Строка 194: | Строка 228: | ||
#-A OUTPUT -p udp -m conntrack --ctstate NEW -m udp --sport 67 --dport 68 -j ACCEPT</code> | #-A OUTPUT -p udp -m conntrack --ctstate NEW -m udp --sport 67 --dport 68 -j ACCEPT</code> | ||
- | ===== Логирование и трассировка ===== | + | ===== Тестирование и отладка ===== |
+ | |||
+ | Просмотр текущей конфигурации для IPv4 и IPv6: | ||
+ | <code=bash>sudo iptables-save | ||
+ | sudo ip6tables-save</code> | ||
+ | |||
+ | ==== Логирование ==== | ||
+ | |||
+ | FIXME | ||
+ | |||
+ | ==== Трассировка ==== | ||
FIXME | FIXME | ||
Строка 209: | Строка 253: | ||
sudo modprobe ip</code> | sudo modprobe ip</code> | ||
- | Часто используемые модули: nf_conntrack_ftp, nf_conntrack_pptp, nf_conntrack_tftp. | + | Часто используемые модули: nf_conntrack_ftp, nf_conntrack_pptp, nf_conntrack_tftp, nf_nat_pptp. |
Автозагрузка модулей: | Автозагрузка модулей: | ||
Строка 215: | Строка 259: | ||
<code bash>man modules-load.d</code> | <code bash>man modules-load.d</code> | ||
- | ===== Другие инструменты ===== | ||
- | |||
- | <note>Todo</note> | ||
- | |||
- | * [[Fail2ban]] — средство дополнительной защиты сервисов от брутфорса, может динамически изменять конфигурацию iptables. Этот момент следует учитывать при сохранении/загрузке собственной статической конфигурации. | ||
===== Ссылки ===== | ===== Ссылки ===== | ||
* [[wpru>Netfilter]] | * [[wpru>Netfilter]] | ||
+ | * [[wpru>Список портов TCP и UDP|Список портов TCP и UDP (ru)]] [[http://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers|(en)]] | ||
* [[http://www.opennet.ru/docs/RUS/iptables/|Iptables Tutorial (ru)]] [[http://www.frozentux.net/iptables-tutorial/iptables-tutorial.html|(en)]] | * [[http://www.opennet.ru/docs/RUS/iptables/|Iptables Tutorial (ru)]] [[http://www.frozentux.net/iptables-tutorial/iptables-tutorial.html|(en)]] | ||
* [[http://www.opennet.ru/man.shtml?topic=iptables&category=8&russian=0|Iptables Manual (ru)]] [[http://ipset.netfilter.org/|(en)]] | * [[http://www.opennet.ru/man.shtml?topic=iptables&category=8&russian=0|Iptables Manual (ru)]] [[http://ipset.netfilter.org/|(en)]] | ||
* [[http://en.wikibooks.org/wiki/Iptables|Communication Networks/IP Tables (en)]] | * [[http://en.wikibooks.org/wiki/Iptables|Communication Networks/IP Tables (en)]] | ||
+ | * [[https://help.ubuntu.com/community/IptablesHowTo|Iptables HowTo (en)]] | ||
* [[http://forum.ubuntu.ru/index.php?topic=99586.0|Автозагрузка правил iptables ]] | * [[http://forum.ubuntu.ru/index.php?topic=99586.0|Автозагрузка правил iptables ]] | ||
* [[http://forum.ubuntu.ru/index.php?topic=230519.0|Обсуждение статьи]] | * [[http://forum.ubuntu.ru/index.php?topic=230519.0|Обсуждение статьи]] |