Различия
Показаны различия между двумя версиями страницы.
Предыдущая версия | |||
— | iptables [2024/06/19 07:09] (текущий) – [Скрипт для очистки правил iptables] darkfire | ||
---|---|---|---|
Строка 1: | Строка 1: | ||
+ | ====== Руководство по iptables: Настройка и оптимизация фаервола Linux ====== | ||
+ | ~~Title: Руководство по iptables: Настройка и оптимизация фаервола Linux ~~ | ||
+ | {{htmlmetatags> | ||
+ | metatag-description=(Узнайте все о iptables, мощном инструменте управления брандмауэром Linux. Научитесь настраивать фаервол, | ||
+ | }} | ||
+ | **iptables** - утилита командной строки, | ||
+ | |||
+ | iptables может отслеживать состояние соединения и перенаправлять, | ||
+ | |||
+ | * [[Правила iptables для FTP]] | ||
+ | * [[ipset]] | ||
+ | * [[VoIP и iptables]] | ||
+ | * [[http:// | ||
+ | * [[ufw]] | ||
+ | * [[firewalld]] | ||
+ | * [[nftables]] | ||
+ | |||
+ | |||
+ | |||
+ | ====== Примеры запуска iptables ====== | ||
+ | Вывести все правила в iptables, возможны несколько вариантов: | ||
+ | <file bash> | ||
+ | iptables -S | ||
+ | iptables -nL -v | ||
+ | iptables -nL -v --line-number | ||
+ | </ | ||
+ | |||
+ | * -v - задает расширенный вывод, включающий в себя счетчики пакетов и байт | ||
+ | * -х - показывать точные значения счетчиков | ||
+ | * -т - не делать обратного преобразования IP в [[DNS|DNS]] | ||
+ | * --line-numbers нумерует правила, | ||
+ | * -j используется для задания цели, например ACCEPT, ULOG, DROP и другие | ||
+ | * Опция -L определяет вывод статистики для цепочки (chain), если конкретная цепочка не задана, | ||
+ | |||
+ | Ключ -D удалить правило по номеру, | ||
+ | <file bash> | ||
+ | iptables -nL -v --line-numbers | grep 10.9.0.4 | ||
+ | 4 0 0 DROP all 10.9.0.40 | ||
+ | |||
+ | iptables -D FORWARD 4 | ||
+ | </ | ||
+ | |||
+ | Получить справочную информацию по любому из дополнительных критериев | ||
+ | <file bash> | ||
+ | iptables -m limit -h | ||
+ | </ | ||
+ | |||
+ | Обнуление всех счетчиков в заданной цепочке. Если имя цепочки не указывается, | ||
+ | <file bash> | ||
+ | iptables -vL -Z INPUT | ||
+ | </ | ||
+ | |||
+ | Отобразить все цепочки правил в NAT-таблице | ||
+ | <file bash> | ||
+ | iptables -t nat -L | ||
+ | </ | ||
+ | Закрыть 80 порт и установить первым правилом | ||
+ | <file bash> | ||
+ | iptables -I INPUT 1 -p tcp --dport 80 -j DROP | ||
+ | </ | ||
+ | Открыть все для ip 10.10.205.223 и установить первым правилом | ||
+ | <file bash> | ||
+ | iptables -I INPUT 1 -s 10.10.205.223 -j ACCEPT | ||
+ | </ | ||
+ | * Очистить все правила iptables и задать по умолчанию: | ||
+ | <file bash> | ||
+ | iptables -F | ||
+ | |||
+ | iptables -P INPUT ACCEPT | ||
+ | iptables -P FORWARD ACCEPT | ||
+ | iptables -P OUTPUT ACCEPT | ||
+ | </ | ||
+ | |||
+ | ===== Как сохранять и восстанавливать правила iptables ===== | ||
+ | |||
+ | <file bash> | ||
+ | iptables-apply - перезагружает правила из конфига (/ | ||
+ | iptables-restore | ||
+ | iptables-save - сохраняет в указаный файл. | ||
+ | </ | ||
+ | ====== Утилиты netfilter/ | ||
+ | {{ : | ||
+ | **nfnetlink** -интерфейс, | ||
+ | * **iptstate** — в какой-то мере аналог утилиты **conntrack**, | ||
+ | # aptitude install iptstate | ||
+ | # iptstate -D 1720 | ||
+ | </ | ||
+ | * **conntrack** - инструмент, | ||
+ | # aptitude install conntrack | ||
+ | </ | ||
+ | * **conntrackd** демон, обеспечивающий синхронизацию таблиц состояний с другими хостами, | ||
+ | * **l7-filter**-userspace — демон, позволяющий определить протокол 7-го (прикладного) уровня модели [[OSI]], которому принадлежит полученный пакет, на основании анализа его содержимого при помощи регулярных выражений. Результат анализа возвращает в маркировке пакета. Полезен при фильтрации и шейпинге трафика протоколов, | ||
+ | |||
+ | ====== Ссылки на инструменты для управления netfilter/ | ||
+ | |||
+ | * [[https:// | ||
+ | |||
+ | Инструменты для управления netfilter/ | ||
+ | * Shorewall или более точно Shoreline Firewall — инструмент для настройки файрвола в Linux, обвязка к старому доброму iptables для обеспечения упрощённых методов конфигурирования. | ||
+ | * [[ufw]] | ||
+ | * firestarter | ||
+ | * fwbuilder | ||
+ | * Arno-iptables-firewall это скрипт для настройки сетевого экрана (брандмауэра) как для одной так и для нескольких подсетей с поддержкой DSL/ADSL. | ||
+ | |||
+ | ====== Архитектура netfilter/ | ||
+ | В системе [[netfilter]], | ||
+ | iptables -A INPUT --source 192.168.1.1 --jump ACCEPT | ||
+ | iptables -A INPUT --jump other_chain | ||
+ | </ | ||
+ | <note important> | ||
+ | * **Синтаксис правил**: | ||
+ | В общем виде правила записываются примерно так: | ||
+ | < | ||
+ | iptables [-t table] command [match] [target/ | ||
+ | </ | ||
+ | Нигде не утверждается, | ||
+ | |||
+ | Если в правило не включается спецификатор [-t table], то по умолчанию предполагается использование таблицы filter, если же предполагается использование другой таблицы, | ||
+ | |||
+ | Далее, непосредственно за именем таблицы, | ||
+ | |||
+ | Раздел match задает критерии проверки, | ||
+ | |||
+ | И наконец target указывает, | ||
+ | |||
+ | * Для добавления правила в цепочку используется ключ -A< | ||
+ | iptables -A INPUT правило | ||
+ | </ | ||
+ | iptables -t nat -A INPUT правило | ||
+ | </ | ||
+ | * Цель по умолчанию задается с помощью ключа -P:< | ||
+ | iptables -P INPUT DROP | ||
+ | </ | ||
+ | * Ключ -I вставляет новое правило в цепочку.< | ||
+ | iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT | ||
+ | </ | ||
+ | ====== Ключевые понятия iptables ====== | ||
+ | Ключевыми понятиями iptables являются: | ||
+ | * **Критерий** — логическое выражение, | ||
+ | * **Действие**(цель) — описание действия, | ||
+ | * **ACCEPT** - пропустить, | ||
+ | * **DROP** - удалить, | ||
+ | * **QUEUE** - передать на анализ внешней программе; | ||
+ | * **RETURN** - вернуть на анализ в предыдущую цепочку | ||
+ | * **REJECT** - пакет отклоняется. В отличие от DROP, где пакет просто отбрасывается, | ||
+ | * **Счетчик** — компонент правила, | ||
+ | * **Правило** — состоит из критерия, | ||
+ | * **Цепочка** — упорядоченная последовательность правил. Цепочки можно разделить на пользовательские и базовые. | ||
+ | * **Базовая цепочка** — цепочка, | ||
+ | * **Пользовательская цепочка** — цепочка, | ||
+ | * **Таблица** — совокупность базовых и пользовательских цепочек, | ||
+ | ===== Критерии ===== | ||
+ | * **Общие критерии** - не зависят от типа протокола и не требуют загрузки специального модуля. | ||
+ | * **-p, --protocol** -критерий для определения типа протокола. | ||
+ | * **[!] -s, --src, --source адрес[/ | ||
+ | * **-d, --dst, --destination** IP-адрес(а) получателя. Имеет синтаксис схожий с критерием --source, за исключением того, что подразумевает адрес места назначения. Символ ! используется для логической инверсии критерия. | ||
+ | * **[!] -i, --in-interface имя_интерфейса** Определяет входящий сетевой интерфейс. Если указанное имя интерфейса заканчивается знаком «+» (например, | ||
+ | * **[!] -o, --out-interface имя_интерфейса** Определяет исходящий сетевой интерфейс. Синтаксис аналогичен -i. Критерий можно использовать в цепочках FORWARD, OUTPUT и POSTROUTING. | ||
+ | * **-f, --fragment** - Правило распространяется на все фрагменты фрагментированного пакета, | ||
+ | * addrtype — позволяет проверить тип адреса источника и/или назначения с точки зрения подсистемы маршрутизации сетевого стека ядра. Допустимые типы адресов: | ||
+ | iptables -I INPUT -m addrtype --src-type LOCAL ! -i lo -j DROP | ||
+ | </ | ||
+ | * **Неявные критерии** - должен быть указан протокол (ключ -p). | ||
+ | * Для -p [[tcp]] | ||
+ | * **--sport, --source-port** - Исходный порт, с которого был отправлен пакет. В качестве параметра может указываться номер порта или название сетевой службы. Соответствие имен сервисов и номеров портов вы сможете найти в файле / | ||
+ | * **--dport, --destination-port** Порт или диапазон портов, | ||
+ | * **--tcp-flags** Определяет маску и флаги tcp-пакета. В качестве аргументов критерия могут выступать флаги SYN, ACK, FIN, RST, URG, PSH, а так же зарезервированные идентификаторы ALL и NONE. ALL -- значит ВСЕ флаги и NONE - НИ ОДИН флаг. Так, критерий --tcp-flags ALL NONE означает -- " | ||
+ | iptables -I INPUT -m conntrack --ctstate NEW,INVALID -p tcp --tcp-flags SYN,ACK SYN,ACK -j REJECT --reject-with tcp-reset | ||
+ | </ | ||
+ | * **--syn** | ||
+ | * **--tcp-option** | ||
+ | * Для -p [[udp]]: Получение UDP пакетов не требует какого либо подтверждения со стороны получателя. Если они потеряны, | ||
+ | * **--sport, --source-port** | ||
+ | * **--dport, --destination-port** | ||
+ | * Для -p [[icmp]]: | ||
+ | * **--icmp-type** | ||
+ | * Для -p sctp: | ||
+ | * **--sport, --dport, --chunk-types** | ||
+ | * Для -p DCCP: | ||
+ | * **--sport, --dport, --dccp-types** | ||
+ | |||
+ | ==== Явные критерии ==== | ||
+ | Перед использованием этих расширений, | ||
+ | ==== Критерий Comment ==== | ||
+ | Критерий Comment позволяет создавать подписи к правилам, | ||
+ | < | ||
+ | iptables -A INPUT -m conntrack --ctstate INVALID -m comment --comment " | ||
+ | </ | ||
+ | ==== Критерий Limit ==== | ||
+ | Критерий limit должен подгружаться явно ключом -m limit. Прекрасно подходит для правил, | ||
+ | |||
+ | limit — позволяет ограничить количество пакетов в единицу времени. Параметры: | ||
+ | * --limit количество[/ | ||
+ | * --limit-burst количество — задает длину очереди, | ||
+ | |||
+ | Критерий -limit использует модель «дырявого ведра», | ||
+ | |||
+ | iptables -I INPUT -m limit --limit 3/min --limit-burst 5 -j LOG --log-level DEBUG --log-prefix "INPUT packet: " | ||
+ | предполагает очередь на пять пакетов, | ||
+ | |||
+ | Типичная ошибка новичков — использовать limit для ограничения TCP-трафика, | ||
+ | < | ||
+ | iptables -A INPUT -p tcp --dport 80 -m limit --limit 10000/sec --limit-burst 10000 -j ACCEPT | ||
+ | iptables -P INPUT DROP | ||
+ | </ | ||
+ | Это пример попытки защитить web-сервер от DDoS-атаки, | ||
+ | < | ||
+ | iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate ESTABLISHED, | ||
+ | iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW -m limit --limit 32/sec --limit-burst 32 -j ACCEPT | ||
+ | iptables -P INPUT DROP | ||
+ | </ | ||
+ | Теперь мы ограничиваем количество не всех пакетов, | ||
+ | ==== Критерий hashlimit ==== | ||
+ | **hashlimit** — позволяет применять ограничения, | ||
+ | ==== Критерий MAC ==== | ||
+ | [[MAC]] (Ethernet Media Access Control) критерий используется для проверки исходного MAC- адреса пакета. | ||
+ | |||
+ | Модуль расширения должен подгружаться явно ключом -m mac. | ||
+ | |||
+ | Ключи: | ||
+ | * --mac-source - MAC адрес сетевого узла, передавшего пакет. MAC адрес должен указываться в форме XX: | ||
+ | < | ||
+ | iptables -A INPUT -m mac --mac-source 00: | ||
+ | </ | ||
+ | |||
+ | ==== Критерий Mark ==== | ||
+ | Критерий mark предоставляет возможность " | ||
+ | * --mark | ||
+ | < | ||
+ | iptables -t mangle -A INPUT -m mark --mark 1 | ||
+ | </ | ||
+ | Критерий производит проверку пакетов, | ||
+ | |||
+ | маркируем пакет | ||
+ | <file bash> | ||
+ | iptables -t mangle -A PREROUTING -i eth0 -p tcp --dport 25 -j MARK --set-mark 888 | ||
+ | </ | ||
+ | далее при помощи утилит пакета [[iproute]]2 пересылаем пакет в таблицу маршрутизации mytable | ||
+ | <file bash> | ||
+ | ip rule add fwmark 888 table mytable | ||
+ | </ | ||
+ | | ||
+ | Если указана маска, то перед сравнением с заданным значением маркировка каждого пакета комбинируется с этой маской посредством логической операции AND, то есть проверяется условие x & маска == значение (где x — маркировка текущего пакета). Такой подход позволит сравнивать значения отдельных бит. Например, | ||
+ | < | ||
+ | -m mark --mark 64/64 | ||
+ | </ | ||
+ | будет отлавливать пакеты, | ||
+ | Еще один пример — | ||
+ | < | ||
+ | -m mark --mark 2/3 | ||
+ | </ | ||
+ | будет определять пакеты, | ||
+ | ==== Критерий connmark ==== | ||
+ | **connmark** — полностью аналогичен mark, но проверяет не маркировку пакета (nfmark), а маркировку соединения (ctmark). Также имеет параметр --mark с аналогичным синтаксисом. | ||
+ | ==== Критерий connlimit ==== | ||
+ | **connlimit** — позволяет ограничивать количество одновременно открытых соединений с каждого IP-адреса (или подсети). | ||
+ | < | ||
+ | # Разрешаем только одно одновременное соединение с одного айпи на smtp | ||
+ | iptables -A FORWARD -p tcp --syn --dport smtp -m connlimit --connlimit-above 1 -j DROP | ||
+ | |||
+ | # allow 2 telnet connections per client host | ||
+ | iptables -p tcp --syn --dport 23 -m connlimit --connlimit-above 2 -j REJECT | ||
+ | |||
+ | # you can also match the other way around: | ||
+ | iptables -p tcp --syn --dport 23 -m connlimit ! --connlimit-above 2 -j ACCEPT | ||
+ | |||
+ | # limit the nr of parallel http requests to 16 per class C sized | ||
+ | # network (24 bit netmask) | ||
+ | iptables -p tcp --syn --dport 80 -m connlimit --connlimit-above 16 \ | ||
+ | --connlimit-mask 24 -j REJECT | ||
+ | # Ставим ограничение на 5 соединений на 80 порт. | ||
+ | iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 5 -j REJECT | ||
+ | </ | ||
+ | ==== Критерий recent ==== | ||
+ | **recent** - это специальный критерий, | ||
+ | # limit ssh-port connections per minute | ||
+ | $IPT -I INPUT -p tcp --dport 22 -i $IFACE_EXT -m state --state NEW -m recent --set | ||
+ | $IPT -I INPUT -p tcp --dport 22 -i $IFACE_EXT -m state --state NEW -m recent --update --seconds 60 --hitcount 2 -j DROP | ||
+ | $IPT -A INPUT -p tcp -m tcp -i $IFACE_EXT --dport 22 -j ACCEPT | ||
+ | </ | ||
+ | ==== Критерий Multiport ==== | ||
+ | Расширение multiport позволяет указывать в тексте правила несколько портов и диапазонов портов. | ||
+ | |||
+ | Вы не сможете использовать стандартную проверку портов и расширение -m multiport (например --sport 1024:63353 -m multiport --dport 21,23,80) одновременно. Подобные правила будут просто отвергаться iptables. Выделяет не один порт, как --dport или --sport, а несколько по списку (до 15 штук). Можно задавать диапазоны как первый_порт: | ||
+ | |||
+ | * [!]--source-ports port1, | ||
+ | < | ||
+ | iptables -A INPUT -p tcp -m multiport --source-port 22, | ||
+ | </ | ||
+ | Служит для указания списка исходящих портов. С помощью данного критерия можно указать до 15 различных портов. Названия портов в списке должны отделяться друг от друга запятыми, | ||
+ | * [!]--destination-ports port1, | ||
+ | < | ||
+ | iptables -A INPUT -p tcp -m multiport --destination-port 22, | ||
+ | </ | ||
+ | Служит для указания списка входных портов. Формат задания аргументов полностью аналогичен -m multiport --source-port. | ||
+ | * [!]--ports port1, | ||
+ | < | ||
+ | iptables -A INPUT -p tcp -m multiport --port 22, | ||
+ | </ | ||
+ | Данный критерий проверяет как исходящий так и входящий порт пакета. Формат аргументов аналогичен критерию --source-port и --destination-port. Обратите внимание на то что данный критерий проверяет порты обеих направлений, | ||
+ | ==== Критерий iprange ==== | ||
+ | iprange — позволяет указать диапазон IP-адресов, | ||
+ | * [!] --src-range адрес[-адрес] — позволяет указать диапазон исходных адресов. Например, | ||
+ | < | ||
+ | iptables -I INPUT -m iprange --src-range 192.168.0.8-192.168.0.25 -j DROP | ||
+ | </ | ||
+ | заблокирует все пакеты, | ||
+ | * [!] --dst-range адрес[-адрес] — позволяет указать диапазон адресов назначения. | ||
+ | |||
+ | ==== Критерий Owner ==== | ||
+ | |||
+ | |||
+ | Расширение owner предназначено для проверки " | ||
+ | |||
+ | Таблица ключи критерия Owner | ||
+ | |||
+ | <file bash> | ||
+ | Ключ --uid-owner | ||
+ | Пример iptables -A OUTPUT -m owner --uid-owner 500 | ||
+ | Описание Производится проверка " | ||
+ | Ключ --gid-owner | ||
+ | Пример iptables -A OUTPUT -m owner --gid-owner 0 | ||
+ | Описание Производится проверка " | ||
+ | Ключ --pid-owner | ||
+ | Пример iptables -A OUTPUT -m owner --pid-owner 78 | ||
+ | Описание Производится проверка " | ||
+ | Ключ --sid-owner | ||
+ | Пример iptables -A OUTPUT -m owner --sid-owner 100 | ||
+ | Описание Производится проверка Session ID пакета. Значение SID наследуются дочерними процессами от " | ||
+ | </ | ||
+ | ==== Критерий State ==== | ||
+ | Идеологический предшественник критерия conntrack. Имеет единственный параметр --state, аналогичный параметру --ctstate критерия conntrack (но, в отличие от него, не поддерживающий состояния DNAT и SNAT). | ||
+ | Долгое время был основным критерием определения состояния, | ||
+ | |||
+ | Критерий state используется совместно с кодом трассировки соединений и позволяет нам получать информацию о признаке состояния соединения, | ||
+ | |||
+ | Ключ --state | ||
+ | Пример iptables -A INPUT -m state --state RELATED, | ||
+ | Разрешаем прохождение statefull-пакетов. Эта цепочка обязательная в любых настройках iptables, она разрешает прохождение пакетов в уже установленных соединениях(ESTABLISHED), | ||
+ | | ||
+ | ==== Критерий TOS ==== | ||
+ | |||
+ | |||
+ | Критерий TOS предназначен для проведения проверки битов поля TOS. TOS -- Type Of Service -- представляет собой 8-ми битовое, | ||
+ | |||
+ | От переводчика: | ||
+ | |||
+ | Данное поле служит для нужд маршрутизации пакета. Установка любого бита может привести к тому, что пакет будет обработан маршрутизатором не так как пакет со сброшенными битами TOS. Каждый бит поля TOS имеет свое значение. В пакете может быть установлен только один из битов этого поля, поэтому комбинации не допустимы. Каждый бит определяет тип сетевой службы: | ||
+ | |||
+ | Минимальная задержка Используется в ситуациях, | ||
+ | |||
+ | Максимальная пропускная способность Указывает, | ||
+ | |||
+ | Максимальная надежность Выбирается максимально надежный маршрут во избежание необходимости повторной передачи пакета. Примером могут служить PPP и SLIP соединения, | ||
+ | |||
+ | Минимальные затраты Применяется в случаях, | ||
+ | |||
+ | Обычный сервис В данной ситуации все биты поля TOS сброшены. Маршрутизация такого пакета полностью отдается на усмотрение провайдера. | ||
+ | |||
+ | Таблица 6-14. Ключи критерия TOS | ||
+ | |||
+ | Ключ --tos | ||
+ | Пример iptables -A INPUT -p tcp -m tos --tos 0x16 | ||
+ | Описание Данный критерий предназначен для проверки установленных битов TOS, которые описывались выше. Как правило поле используется для нужд маршрутизации, | ||
+ | ==== Критерий TTL ==== | ||
+ | [[TTL]] (Time To Live) является числовым полем в IP заголовке. При прохождении очередного маршрутизатора, | ||
+ | |||
+ | От переводчика: | ||
+ | |||
+ | Ключи критерия TTL | ||
+ | |||
+ | Ключ --ttl | ||
+ | Пример iptables -A OUTPUT -m ttl --ttl 60 | ||
+ | Описание Производит проверку поля TTL на равенство заданному значению. Данный критерий может быть использован при наладке локальной сети, например: | ||
+ | ==== Критерий " | ||
+ | |||
+ | |||
+ | Критерий unclean не имеет дополнительных ключей и для его использования достаточно явно загрузить модуль. Будьте осторожны, | ||
+ | |||
+ | ===== Действие ===== | ||
+ | Действия могут быть терминальными и нетерминальными. | ||
+ | * **Терминальными** называются действия, | ||
+ | * **Нетерминальными**, | ||
+ | |||
+ | ===== Цепочка. Таблица. ===== | ||
+ | **Существует пять типов стандартных цепочек, | ||
+ | |||
+ | * **PREROUTING** — для изначальной обработки входящих пакетов. | ||
+ | * **INPUT** — для входящих пакетов адресованных непосредственно локальному процессу (клиенту или серверу). | ||
+ | * **FORWARD** — для входящих пакетов перенаправленных на выход (заметьте, | ||
+ | * **OUTPUT** — для пакетов генерируемых локальными процессами. | ||
+ | * **POSTROUTING** — для окончательной обработки исходящих пакетов. | ||
+ | Также можно создавать и уничтожать собственные цепочки при помощи утилиты iptables. | ||
+ | |||
+ | **Цепочки организованны в таблицы**: | ||
+ | * **raw** — просматривается до передачи пакета системе определения состояний. Используется редко, например для маркировки пакетов, | ||
+ | * **mangle** — содержит правила модификации (обычно заголовка) IP‐пакетов. Среди прочего, | ||
+ | * **nat** — просматривает только пакеты, | ||
+ | * **filter** — основная таблица, | ||
+ | * **security** - Предназначена для изменения маркировки безопасности (меток [[SELinux]]) пакетов и соединений. Данная таблица добавлена в ядро Linux в версии 2.6.27. Ранее операции с метками безопасности выполнялись в таблице mangle, и в целях обратной совместимости все действия, | ||
+ | Цепочки с одинаковым названием но в разных таблицах — совершенно независимые объекты. Например, | ||
+ | |||
+ | ====== Обработка пакета ====== | ||
+ | Схематично обработку пакета можно изобразить следующим образом: | ||
+ | < | ||
+ | PACKET IN ---> | ||
+ | - mangle | ||
+ | - nat (dst) | ||
+ | | ||
+ | | ||
+ | | ||
+ | - mangle | ||
+ | - filter | ||
+ | | ||
+ | | ||
+ | | ||
+ | </ | ||
+ | **Входящий пакет** начинает обрабатываться брандмауэром с цепочки PREROUTING в таблице mangle. Затем он обрабатывается правилами цепочки PREROUTING таблицы nat. На этом этапе проверяется, | ||
+ | |||
+ | **Если целью пакета является другой компьютер**, | ||
+ | |||
+ | **Если назначением пакета является сам компьютер с брандмауэром**, | ||
+ | - mangle PREROUTING | ||
+ | - nat PREROUTING | ||
+ | - mangle INPUT | ||
+ | - filter INPUT | ||
+ | |||
+ | **Когда приложение, | ||
+ | |||
+ | * ??? какая правильна последовательность прохождения пакета на выходе? | ||
+ | - mangle OUTPUT | ||
+ | - nat OUTPUT | ||
+ | - filter OUTPUT | ||
+ | ====== Немного о протоколе TCP/IP ====== | ||
+ | [[TCP]]/IP является протоколом, | ||
+ | < | ||
+ | A: SYN пакет | ||
+ | Б: ACK пакет, SYN пакет | ||
+ | A: ACK пакет | ||
+ | </ | ||
+ | После чего соединение считается установленным (ESTABLISHED). iptables различает эти состояния как NEW и ESTABLISHED. | ||
+ | |||
+ | **FIN** (англ. final, бит) — флаг, будучи установлен, | ||
+ | ====== Механизм определения состояний ====== | ||
+ | |||
+ | Компонент netfilter, обеспечивающий отслеживание состояния соединений и классификацию пакетов с точки зрения принадлежности к соединениям, | ||
+ | * Отслеживание состояний отдельных соединений с тем, чтобы классифицировать каждый пакет либо как относящийся к уже установленному соединению, | ||
+ | * Отслеживание связанных соединений, | ||
+ | |||
+ | ===== Критерии состояния соединения ===== | ||
+ | ===== conntrack ===== | ||
+ | Основной критерий, | ||
+ | * **[!] --ctstate маска** | ||
+ | Маска содержит перечисление через запятую список возможных состояний соединения. Пакет считается удовлетворяющим критерию, | ||
+ | Возможные состояния: | ||
+ | * **NEW** — соединение не открыто, | ||
+ | * **ESTABLISHED** — пакет относится к уже установленному соединению. Обычно такие пакеты принимаются без дополнительной фильтрации, | ||
+ | * **RELATED** — пакет открывает новое соединение, | ||
+ | * **INVALID** — пакет по смыслу должен принадлежать уже установленному соединению (например, | ||
+ | < | ||
+ | iptables -I INPUT -m conntrack --ctstate INVALID -j DROP | ||
+ | </ | ||
+ | * **UNTRACKED** — отслеживание состояния соединения для данного пакета было отключено. Обычно оно отключается с помощью действия NOTRACK в таблице raw. | ||
+ | * **DNAT** — показывает, | ||
+ | * **SNAT** — показывает, | ||
+ | |||
+ | ====== iptables NAT ====== | ||
+ | |||
+ | Описание технологии, | ||
+ | * **SNAT** (source NAT) - используется для реального IP | ||
+ | * **DNAT** - иcпользуется для проброса портов в паре с SNAT | ||
+ | * **Маскарадинг** (Masquerading) - NAT для динамического внешнего IP. Тип трансляции сетевого адреса, | ||
+ | <file bash> | ||
+ | # для постоянного IP (10.5.21.24) | ||
+ | $IPT -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT --to-source 10.5.21.24: | ||
+ | $IPT -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 10.5.21.24 | ||
+ | # для динамического IP | ||
+ | $IPT -t nat -A POSTROUTING -o eth0 -j MASQUERADE | ||
+ | # проброс порта 3389 | ||
+ | $IPT -t nat -A PREROUTING -p tcp --dport 3389 -j DNAT \ | ||
+ | --to-destination 172.16.23.24: | ||
+ | </ | ||
+ | $IPT -t nat -A PREROUTING -i $ISP_Valor -p tcp -m tcp --dport 51413 -j DNAT --to 10.26.95.251: | ||
+ | $IPT -A FORWARD -p tcp -m tcp -d 10.26.95.251 --dport 51413 -j ACCEPT | ||
+ | $IPT -t nat -A PREROUTING -i $ISP_Valor -p udp -m udp --dport 51413 -j DNAT --to 10.26.95.251: | ||
+ | $IPT -A FORWARD -p udp -m udp -d 10.26.95.251 --dport 51413 -j ACCEPT | ||
+ | </ | ||
+ | |||
+ | Маскарадинг в основе своей представляет то же самое, что и SNAT только не имеет ключа --to-source. Маскарадинг умеет работать с динамически получаемыми IP, например в случае когда провайдер выдает IP по [[DHCP]]. Если у вас статическое IP подключение, | ||
+ | |||
+ | Действие MASQUERADE допускается указывать только в цепочке POSTROUTING таблицы nat, так же как и действие SNAT. В цепочке PREROUTING мы будем менять информацию о получателе пакета (DNAT), а в цепочке POSTROUTING - об отправителе (SNAT). | ||
+ | |||
+ | < | ||
+ | iptables -t nat -A POSTROUTING -s 192.168.46.0/ | ||
+ | </ | ||
+ | **Обязательно выставить значение в 1**< | ||
+ | # sysctl net.ipv4.ip_forward | ||
+ | net.ipv4.ip_forward = 0 | ||
+ | </ | ||
+ | # sysctl -w net.ipv4.ip_forward=1 | ||
+ | net.ipv4.ip_forward = 1 | ||
+ | </ | ||
+ | * **Запрет NAT**. Если нужно запретить какому-нибудь серому хосту хождение в Интернет по портам 80, 443, можно написать так: | ||
+ | < | ||
+ | $IPT -A FORWARD -p tcp -m multiport --port 80,443 -s 192.168.1.11 -j DROP | ||
+ | </ | ||
+ | |||
+ | ====== LOG: Протоколирование правил Iptables ====== | ||
+ | Журналы брандмауэра имеют важное значение для обнаружения признаков «взлома», | ||
+ | * **LOG** — позволяет записывать информацию о пакетах в журнал ядра ([[syslog]]). | ||
+ | Например, | ||
+ | < | ||
+ | iptables -A INPUT -p tcp -m multiport --dports 22, | ||
+ | </ | ||
+ | мы добавим строку | ||
+ | < | ||
+ | iptables -A INPUT -p tcp -m multiport --dports 22, | ||
+ | | ||
+ | </ | ||
+ | то для каждого нового соединения к нашему хосту из нашей подсети в системном журнале будет появляться запись примерно такого вида: | ||
+ | < | ||
+ | Jul 16 20:10:40 interdictor kernel: New connection from ours: | ||
+ | IN=eth0 OUT= MAC=00: | ||
+ | DST=10.134.0.65 LEN=48 TOS=0x00 PREC=0x00 TTL=112 ID=38914 DF | ||
+ | PROTO=TCP SPT=31521 DPT=8080 WINDOW=65535 RES=0x00 SYN URGP=0 | ||
+ | </ | ||
+ | |||
+ | Такая запись содержит очень много полезной информации. Начинается она с даты и времени получения пакета. Затем идет имя нашего хоста (interdictor) и источник сообщения (для сообщений фаервола это всегда ядро). Потом идет заданный нами префикс (New connection from ours:), после чего следуют данные о самом пакете: | ||
+ | |||
+ | **Указав соответствующие параметры действия LOG, можно дополнить эту информацию номером [[TCP]]-последовательности (опция --log-tcp-sequence), | ||
+ | |||
+ | Параметр --log-prefix позволяет задать поясняющую надпись, | ||
+ | |||
+ | Данная запись появится в журналах / | ||
+ | |||
+ | < | ||
+ | # | ||
+ | $IPT -A INPUT -j LOG --log-level INFO --log-prefix "-P INPUT DROP: " | ||
+ | $IPT -A INPUT -j DROP | ||
+ | </ | ||
+ | При количестве пакетов больше 5, правило сработает один раз в секунду. Остальные попытки в log файл записываться не будут. Так можно уменьшить объем лог файла. | ||
+ | < | ||
+ | $IPT -A INPUT -i eth0 -m limit --limit-burst 5 --limit 1/s \ | ||
+ | -j LOG --log-level debug --log-prefix " | ||
+ | |||
+ | $IPT -A OUTPUT -o eth0 -m limit --limit-burst 5 --limit 1/s \ | ||
+ | -j LOG --log-level debug --log-prefix " | ||
+ | </ | ||
+ | |||
+ | ====== ULOG: Протоколирование правил Iptables ====== | ||
+ | **ULOG** -демон ulogd, установка для Debian - дистрибутивов.< | ||
+ | apt install ulogd | ||
+ | </ | ||
+ | В стандартных репозиториях CentOS пакета ulogd нет. Нужно использовать сторонний [[YUM]] репозиторий ftp.pbone.net | ||
+ | < | ||
+ | # wget ftp:// | ||
+ | # rmp -i ulogd-1.24-2.el5.re.x86_64.rpm | ||
+ | </ | ||
+ | |||
+ | Перепишем вышеприведенные примеры при помощи ULOG.< | ||
+ | $IPT -A INPUT -i eth0 -m limit --limit 3/m --limit-burst 5 -j ULOG --ulog-prefix " | ||
+ | </ | ||
+ | * --ulog-prefix " | ||
+ | После установки ulogd создает два лога: | ||
+ | - / | ||
+ | - / | ||
+ | |||
+ | <note tip>ULOG в связке с [[MySQL|MySQL]] пишет только те столбцы, | ||
+ | * **Анализ syslogemu.log**. Вариант №1. Подсчитать количество попыток для каждого правила с --ulog-prefix "DROP INVALID:"< | ||
+ | # cat syslogemu.log | grep "DROP INVALID:" | ||
+ | ... | ||
+ | 41 178.150.98.36 | ||
+ | 45 66.249.71.173 | ||
+ | 52 87.250.255.243 | ||
+ | 93 95.108.158.233 | ||
+ | root@:/ | ||
+ | </ | ||
+ | * * **Анализ syslogemu.log**. Вариант №2.< | ||
+ | root@cz5093:/ | ||
+ | 1 82.144.192.104 | ||
+ | 1 95.108.214.15 | ||
+ | 1 95.108.215.14 | ||
+ | 4 178.151.96.166 | ||
+ | 4 94.179.56.223 | ||
+ | 10 62.141.67.251 | ||
+ | </ | ||
+ | |||
+ | ====== Пример 1. Конфиг. файл iptables ====== | ||
+ | <file bash> | ||
+ | # mkdir / | ||
+ | # ln -s / | ||
+ | # touch / | ||
+ | # chmod +x / | ||
+ | # nano / | ||
+ | #!/bin/sh | ||
+ | |||
+ | IPT="/ | ||
+ | IFACE_EXT=" | ||
+ | IFACE_LOC=" | ||
+ | |||
+ | # Flushing iptable rules. | ||
+ | $IPT -F | ||
+ | $IPT -t nat -F | ||
+ | $IPT -t mangle -F | ||
+ | $IPT -X | ||
+ | $IPT -t nat -X | ||
+ | $IPT -t mangle -X | ||
+ | |||
+ | # Default politics | ||
+ | $IPT -P INPUT DROP | ||
+ | $IPT -P FORWARD DROP | ||
+ | $IPT -P OUTPUT | ||
+ | |||
+ | # Loopback interface | ||
+ | $IPT -A INPUT -i $IFACE_LOC -j ACCEPT | ||
+ | # SSH | ||
+ | $IPT -A INPUT -p tcp -m tcp -i $IFACE_EXT --dport 22 -j ACCEPT | ||
+ | # ICMP: разрешить все | ||
+ | $IPT -A INPUT -p icmp -i $IFACE_EXT -j ACCEPT | ||
+ | # SNMP: разрешить запросы с IP 10.10.10.226 | ||
+ | $IPT -A INPUT -p udp -m udp -s 10.10.10.226 --dport 161 -j ACCEPT | ||
+ | |||
+ | # Это правило обязательно если INPUT DROP. | ||
+ | # Разрешаем прохождение statefull-пакетов. Эта цепочка обязательная в любых настройках iptables, | ||
+ | # она разрешает прохождение пакетов в уже установленных | ||
+ | # соединениях(ESTABLISHED), | ||
+ | $IPT -A INPUT -i $IFACE_EXT -m state --state ESTABLISHED, | ||
+ | |||
+ | # allow nginx | ||
+ | iptables -A INPUT -p tcp -m multiport --destination-port 80,443 -j ACCEPT | ||
+ | # протколирование последнего правила в этом примере -P INPUT DROP | ||
+ | $IPT -A INPUT -j LOG --log-level INFO --log-prefix "-P INPUT DROP: " | ||
+ | |||
+ | # for Debian | ||
+ | / | ||
+ | # for RedHat | ||
+ | #/ | ||
+ | #/ | ||
+ | |||
+ | </ | ||
+ | ====== Пример 2. REJECT вместо DROP ====== | ||
+ | Все новые входящие соединения, | ||
+ | <file bash> | ||
+ | # log | ||
+ | $IPT -A INPUT -i $ISP_Gat -m limit --limit 3/m --limit-burst 5 -j ULOG --ulog-prefix " | ||
+ | |||
+ | $IPT -A INPUT -p tcp -j REJECT --reject-with tcp-reset | ||
+ | $IPT -A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable | ||
+ | $IPT -A INPUT -j REJECT --reject-with icmp-proto-unreach | ||
+ | </ | ||
+ | ====== Пример 3. iptables CentOS OpenVZ ====== | ||
+ | <file bash iptables.sh> | ||
+ | #!/bin/sh | ||
+ | |||
+ | IPT="/ | ||
+ | IFACE_EXT=" | ||
+ | IFACE_LOC=" | ||
+ | |||
+ | # Flushing iptable rules. | ||
+ | $IPT -F | ||
+ | $IPT -t nat -F | ||
+ | $IPT -t mangle -F | ||
+ | $IPT -X | ||
+ | $IPT -t nat -X | ||
+ | $IPT -t mangle -X | ||
+ | |||
+ | # Default politics | ||
+ | $IPT -P INPUT DROP | ||
+ | $IPT -P FORWARD DROP | ||
+ | $IPT -P OUTPUT ACCEPT | ||
+ | |||
+ | # INPUT | ||
+ | # allow local, internal and already established connections | ||
+ | $IPT -A INPUT -m conntrack --ctstate ESTABLISHED, | ||
+ | $IPT -A FORWARD -m conntrack --ctstate ESTABLISHED, | ||
+ | #$IPT -A OUTPUT -m conntrack --ctstate ESTABLISHED, | ||
+ | $IPT -A INPUT -i $IFACE_LOC -j ACCEPT | ||
+ | # Ping allow | ||
+ | $IPT -A INPUT -p icmp -j ACCEPT | ||
+ | # SSH allow | ||
+ | $IPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT | ||
+ | |||
+ | # The rest deny | ||
+ | $IPT -A INPUT -p tcp -j REJECT --reject-with tcp-reset | ||
+ | $IPT -A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable | ||
+ | $IPT -A INPUT -j REJECT --reject-with icmp-proto-unreach | ||
+ | |||
+ | # FORWARD | ||
+ | $IPT -A FORWARD -s 10.161.85.101/ | ||
+ | $IPT -A FORWARD -d 10.161.85.101/ | ||
+ | $IPT -A FORWARD -s 10.161.85.102/ | ||
+ | $IPT -A FORWARD -d 10.161.85.102/ | ||
+ | $IPT -A FORWARD -j REJECT --reject-with icmp-host-prohibited | ||
+ | |||
+ | # POSTROUTING | ||
+ | $IPT -t nat -A POSTROUTING -s 10.161.85.101/ | ||
+ | |||
+ | # for RedHat | ||
+ | / | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | ====== Пример 4. User defined chains. Пользовательские цепочки. ====== | ||
+ | |||
+ | Одна из мощных возможностей iptables - это возможность создавать **пользовательские цепочки (user defined chains)**, в дополнение к встроенным (INPUT, FORWARD и OUTPUT). По общему согласию, | ||
+ | |||
+ | **Пример.** Создадим правило, | ||
+ | <file bash> | ||
+ | # User defined chain. forward-ports | ||
+ | # Создание цепочки | ||
+ | $IPT -N forward-ports | ||
+ | # Создание правила по умолчанию | ||
+ | $IPT -A forward-ports -j RETURN | ||
+ | # Заполнение правилами пользовательской цепочки | ||
+ | $IPT -I forward-ports 1 -d xxx.xxx.xxx.xxx -m comment --comment " | ||
+ | $IPT -I forward-ports 1 -d xxx.xxx.xxx.xxx -m comment --comment "KVM vm" -j DROP | ||
+ | $IPT -I forward-ports 1 -d xxx.xxx.xxx.xxx -m comment --comment " | ||
+ | # правило переправления из цепочки FORWARD в нашу созданную цепочку forward-ports | ||
+ | $IPT -I FORWARD -p tcp -m multiport --dports 22:80 -j forward-ports | ||
+ | </ | ||
+ | ===== Скрипт для очистки правил iptables ===== | ||
+ | Скрипт для полной очистки правил [[iptables]]. Правила [[netfilter]] устанавливаются в режим разрешить все на вход и выход этого компьютера, | ||
+ | <file bash cleariptable> | ||
+ | #!/bin/sh | ||
+ | # | ||
+ | iptables -F | ||
+ | iptables -t nat -F | ||
+ | iptables -t mangle -F | ||
+ | iptables -X | ||
+ | iptables -t nat -X | ||
+ | iptables -t mangle -X | ||
+ | |||
+ | # IPv6 | ||
+ | #ip6tables --flush | ||
+ | # Flush all IPv6 rules. | ||
+ | ip6tables -F | ||
+ | |||
+ | # default ACCEPT for ssh | ||
+ | iptables -P INPUT ACCEPT | ||
+ | iptables -P OUTPUT ACCEPT | ||
+ | iptables -P FORWARD ACCEPT | ||
+ | </ | ||
+ | ====== Пример 5. Как перенаправить пакет с IP:PORT на localhost: | ||
+ | Например у вас [[MySQL|MySQL]] настроен стандартно на localhost порт 3306, но тут появляется | ||
+ | |||
+ | <file bash> | ||
+ | iptables -t nat -I PREROUTING -p tcp -d $внешний_IP/ | ||
+ | </ | ||
+ | Включаем NAT, не забудьте заменить eth0 на имя своего внешнего интерфейса | ||
+ | <file bash> | ||
+ | sysctl -w net.ipv4.conf.eth0.route_localnet=1 | ||
+ | </ | ||
+ | ====== Пример 6. Настройка IPv6-файрвола (ip6tables) ====== | ||
+ | Поскольку при использовании [[IPv6|IPv6]] каждый из компьютеров вашей локальной сети будет иметь белый маршрутизируемый IP-адрес, | ||
+ | |||
+ | |||
+ | <file bash> | ||
+ | sudo ip6tables -A INPUT -i lo -j ACCEPT | ||
+ | sudo ip6tables -A INPUT -m conntrack --ctstate ESTABLISHED, | ||
+ | sudo ip6tables -A INPUT -p icmp -j ACCEPT | ||
+ | sudo ip6tables -A INPUT -p tcp --dport ssh -j ACCEPT | ||
+ | sudo ip6tables -A INPUT -p tcp --dport http -j ACCEPT | ||
+ | sudo ip6tables -A INPUT -p tcp --dport https -j ACCEPT | ||
+ | sudo ip6tables -A INPUT -j DROP | ||
+ | </ | ||
+ | Просмотр конфигурации IPv6 | ||
+ | <file bash> | ||
+ | ip6tables -L -v | ||
+ | </ |
📌 Удобный подбор VPS по параметрам доступен на DIEGfinder.com - официальном инструменте проекта DIEG. Это часть единой экосистемы, созданной для того, чтобы помочь быстро найти подходящий VPS/VDS сервер для любых задач хостинга.
📌 Для тестирования скриптов, установщиков VPN и Python-ботов рекомендуем использовать надежные VPS на короткий срок. Подробнее о быстрой аренде VPS для экспериментов - читайте здесь.
💥 Подпишись в Телеграм 💥 и задай вопрос по сайтам и хостингам бесплатно!7 Самых Популярных Статей
- Как запустить скрипты и веб-приложения на Python
- Что такое страны TIER 1,2,3
- 7 способов сравнения файлов по содержимому в Windows или Linux
- Установка и тестирование веб-панели HestiaCP
- Nginx простые примеры конфигурации
- top, htop, atop определение загрузки ОС (Load average, LA)
- Использование rsync в примерах
7 Самых Популярных Обзоров
- Хостинг для Python-скриптов и приложений
- ТОП 4 лучших антидетект браузеров (Бесплатные & Платные)
- Подборка купонов (промокоды) на хостинг, антидетект браузеры
- Обзор THE.Hosting (PQ Hosting): надежный хостинг с профессиональной поддержкой
- Хостинг в России
- Хостинг в Европе
- Обзор браузера Dolphin {anty} для мультиаккаунтинга