Различия
Здесь показаны различия между двумя версиями данной страницы.
| Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
|
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|Обсуждение статьи]] | ||