Это предложенный канонический вопрос о понимании и отладке программного брандмауэра в системах Linux.
В ответ на ответ EEAA и комментарий @ Shog о том, что нам нужны подходящие канонические вопросы и ответы для закрытия общих относительно простых вопросов о iptables.
Что такое структурированный метод для устранения проблем с программным брандмауэром Linux, структурой фильтрации пакетов netfilter , обычно называемой пользовательским интерфейсом iptables ?
Каковы общие подводные камни, повторяющиеся вопросы и простые или немного более непонятные вещи, чтобы проверить, что случайный администратор брандмауэра может не заметить или иным образом извлечь выгоду из знания?
Даже если вы используете такие инструменты, как UFW , FirewallD (aka firewall-cmd
), Shorewall или аналогичные, вы можете извлечь выгоду, заглянув под капот без слоя абстракции, который предлагают эти инструменты.
Этот вопрос не предназначен в качестве практического руководства по созданию брандмауэров: ознакомьтесь с документацией по продукту для этого и, например, отправьте рецепты в iptables Trips & Tricks или найдите в тегах вопросы iptables ufw firewalld firewall-cmd для существующих часто встречающихся и пользующихся высокой оценкой результатов. Q & в.
net.netfilter.nf_conntrack_log_invalid
255 будет очень хорошо перехватывать недопустимые пакеты, что может помочь, если состояние netfilter с состоянием приводит к плохому поведению.Ответы:
В общем:
Для просмотра и изменения конфигурации брандмауэра требуются права администратора (
root
), как и открытие служб в ограниченном диапазоне номеров портов. Это означает, что вы должны войти в систему как пользовательroot
или использовать егоsudo
для запуска команды от имени пользователя root. Я постараюсь пометить такие команды как необязательные[sudo]
.Содержание:
-I
и-A
iptables -L -v -n
1. Порядок имеет значение или разница между
-I
и-A
Следует помнить, что правила брандмауэра проверяются в порядке их перечисления. Ядро прекратит обработку цепочки, когда сработает правило, которое разрешит или запретит пакет или соединение.
Я думаю, что наиболее распространенная ошибка для начинающих администраторов брандмауэра заключается в том, что они следуют правильным инструкциям, чтобы открыть новый порт, такой как приведенный ниже:
а затем обнаружите, что это не вступит в силу.
Причиной этого является то, что
-A
опция добавляет это новое правило после всех существующих правил и, поскольку очень часто последнее правило в существующем брандмауэре было таким, которое блокирует весь трафик, который явно не разрешен, что приводит кИли эквивалент в iptables-save:
и новое правило, открывающее TCP-порт 8080, никогда не будет достигнуто. (О чем свидетельствуют счетчики упорно оставшихся в 0 пакетов и нулевых байт).
Вставка правила с
-I
новым правилом была бы первой в цепочке и будет работать.2. Показать текущую конфигурацию брандмауэра
Моя рекомендация для администратора брандмауэра состоит в том, чтобы взглянуть на фактическую конфигурацию ядра Linux, а не пытаться диагностировать проблемы брандмауэра с помощью удобных для пользователя инструментов. Часто, когда вы понимаете основные проблемы, вы можете легко решить их в вопросе, поддерживаемом этими инструментами.
Команда
[sudo] iptables -L -v -n
твой друг (хотя некоторые люди любятiptables-save
лучше). Часто при обсуждении конфигураций полезно также использовать эту--line-numbers
опцию для нумерации строк. Ссылка на правило #X облегчает их обсуждение.Примечание: правила NAT, включаются в
iptables-save
выходной , но должны перечислены отдельно, добавив-t nat
опцию т.е.[sudo] iptables -L -v -n -t nat --line-numbers
.Многократный запуск команды и проверка на приращение счетчиков могут быть полезными инструментами, чтобы увидеть, действительно ли запускается новое правило.
В качестве альтернативы вывод команды
iptables-save
дает скрипт, который может восстановить указанную выше конфигурацию брандмауэра:Это вопрос предпочтения того, что вам будет легче понять.
3. Интерпретация результатов
iptables -L -v -n
Политика устанавливает действие по умолчанию в цепи использование , когда нет четких правил спичек. В
INPUT
цепочке, в которой установлено ПРИНЯТЬ весь трафик.Первое правило в цепочке INPUT сразу интересное: оно отправляет весь трафик (источник 0.0.0.0/0 и пункт назначения 0.0.0.0/0), предназначенный для TCP-порта 22 (
tcp dpt:22
), порт по умолчанию для SSH, в пользовательскую цель (fail2ban-SSH
) , Как следует из названия, это правило поддерживается fail2ban (продуктом безопасности, который, среди прочего, сканирует системные журналы на предмет возможных злоупотреблений и блокирует IP-адрес обидчика).Это правило было бы создано с помощью командной строки iptables, аналогичной
iptables -I INPUT -p tcp -m tcp --dport 22 -j fail2ban-SSH
или найденной в выходных данных iptables-save as-A INPUT -p tcp -m tcp --dport 22 -j fail2ban-SSH
. Часто вы можете найти любую из этих записей в документации.Счетчики показывают, что это правило соответствует 784 000 пакетов и 65 мегабайтам данных.
Трафик, соответствующий этому первому правилу, затем обрабатывается
fail2ban-SSH
цепочкой, которая в виде нестандартной цепочки попадает в список ниже цепочки OUTPUT.Эта цепочка состоит из двух правил, по одному для каждого обидчика (IP-адрес источника 117.253.221.166 или 58.218.211.166), который заблокирован (с помощью a
reject-with icm-port-unreachable
).Пакеты SSH, которые не получены от этих заблокированных хостов, еще не разрешены и не запрещены, и теперь, когда пользовательская цепочка завершена, будет проверено второе правило в цепочке INPUT.
Все пакеты, которые не были предназначены для порта 22, прошли первое правило в цепочке INPUT и также будут оцениваться в правиле INPUT # 2.
Правило INPUT номер 2 делает его предназначенным для использования в качестве межсетевого экрана с полным состоянием , который отслеживает соединения. Это имеет некоторые преимущества, только пакеты для новых соединений должны проверяться по полному набору правил, но как только разрешены дополнительные пакеты, принадлежащие установленному или связанному соединению, принимаются без дальнейшей проверки.
Правило ввода № 2 соответствует всем открытым и связанным соединениям, а пакеты, соответствующие этому правилу, не требуют дальнейшей оценки.
Примечание: изменения правил в конфигурации брандмауэра с отслеживанием состояния будут влиять только на новые соединения, а не на установленные.
Напротив, простой фильтр пакетов проверяет каждый пакет на полный набор правил без отслеживания состояния соединения. В таком брандмауэре не будут использоваться ключевые слова состояния .
Правило INPUT # 3 довольно скучно,
lo
разрешен весь трафик, соединяющийся с интерфейсом обратной связи ( или 127.0.0.1).Правила INPUT 4, 5 и 6 используются для открытия TCP-портов 22, 80 и 443 (порты по умолчанию для SSH, HTTP и HTTPS соответственно) путем предоставления доступа к НОВЫМ соединениям (существующие соединения уже разрешены правилом 2 INPUT).
В брандмауэре без сохранения состояния эти правила будут отображаться без атрибутов состояния:
или
Последнее правило INPUT # 7 - это правило, которое блокирует весь трафик, которому НЕ был предоставлен доступ в правилах INPUT 1-7. Довольно распространенное соглашение: все, что не разрешено, отрицается. Теоретически это правило можно было бы опустить, установив ПОЛИТИКУ по умолчанию ОТКАЗАТЬСЯ.
Всегда исследуйте всю цепочку.
4. Знай свое окружение
4.1. Настройки в программном брандмауэре не влияют на параметры безопасности, поддерживаемые в других местах сети, то есть, несмотря на открытие сетевой службы с
iptables
неизмененными списками контроля доступа на маршрутизаторах или других брандмауэрах в вашей сети, они все равно могут блокировать трафик ...4.2. Когда ни одна служба не прослушивает, вы не сможете подключиться и получить ошибку отказа в соединении , независимо от настроек брандмауэра. Следовательно:
[sudo] netstat -plnut
или альтернативно используетеss -tnlp
.[sudo] nc -l -p 123
илиopenssl s_server -accept 1234 [options]
если вам нужен прослушиватель TLS / SSL (проверьтеman s_server
параметры).telnet <IP of Server> 123
Илиecho "Hello" | nc <IP of Server> 123
или при тестировании защищенной службы TLS / SSLopenssl s_client -connect <IP of Server>:1234
, прежде чем пытаться сделать это с удаленного хоста.4.3. Понять протоколы, используемые вашими службами. Вы не можете правильно включить / отключить службы, которые вы недостаточно понимаете. Например:
/etc/services
не обязательно совпадает с реальным сервисом, использующим порт.4.4. Фильтр пакетов ядра - не единственное, что может ограничивать сетевое соединение:
getenforce
подтвердит, работает ли SELinux.ldd /path/to/service |grep libwrap
и/hosts.[allow|deny]
контрольных файлов.5.
INPUT
илиFORWARD
ЦепиКонцепция цепочек объясняется здесь более подробно, но суть в следующем:
INPUT
Цепь , где вы открываете и / или закрыть сетевые порты для служб работают локально, на машине , где вы выдаете команды Iptables.В этой
FORWARD
цепочке вы применяете правила для фильтрации трафика, который ядро перенаправляет на другие системы, на реальные системы, а также на контейнеры Docker и серверы виртуальных гостевых серверов, когда ваша машина Linux работает как мост, маршрутизатор, гипервизор и / или выполняет сетевой адрес. перевод и переадресация портов.Распространенным заблуждением является то, что, поскольку контейнер Docker или гость KVM работают локально, применяемые правила фильтрации должны быть в цепочке INPUT, но обычно это не так.
6. Ядро модулей
Поскольку фильтр пакетов работает в ядре Linux, он также может быть скомпилирован как динамический модуль, фактически несколько модулей. Большинство дистрибутивов включают netfilter в качестве модулей, и необходимые модули netfilter будут загружаться в ядро по мере необходимости, но для некоторых модулей администратор брандмауэра должен будет вручную убедиться, что они загружаются. Это в первую очередь относится к модулям отслеживания подключений,
nf_conntrack_ftp
которые могут быть загружены с помощьюinsmod
.Модули, загруженные в настоящее время в работающее ядро, могут отображаться с помощью
lsmod
.Способ обеспечения постоянной загрузки модулей при перезагрузке зависит от дистрибутива Linux.
источник
watch --difference -n 1 iptables -L FORWARD -v -n
. Позволяя инструменту периодически запускать команду и выделять изменения, это делает ее намного проще.iptables-save
выходные данные (предпочтительно с-c
) каждый раз по этому страшномуiptables -L
(с различными аргументами) выводу.Общие проблемы с разными протоколами
DNS: DNS по умолчанию использует порт 53 UDP, но сообщения, которые не помещаются в одну дейтаграмму UDP, будут передаваться с использованием протокола TCP (обычно для передачи зон и т. Д.), Требующего открытия порта 53 TCP также при запуске сервера имен ,
Электронная почта: многие интернет-провайдеры блокируют SMTP-трафик (или, по крайней мере, порт по умолчанию TCP 25), что делает невозможным прямой прием или отправку электронной почты, а их клиенты вынуждены использовать SMTP-ретранслятор ISP для всей исходящей электронной почты, а иногда и для входящей электронной почты. , Относится к §1.1.
FTP: FTP - это нечетный протокол, поскольку используются два соединения. Первым является управляющее соединение, по умолчанию FTP-сервер будет прослушивать TCP-порт 21 для этого. Управляющее соединение используется для аутентификации и выдачи команд. Фактическая передача файлов и такие вещи, как вывод списка каталогов, проходят через второе TCP-соединение, DATA-соединение, В активном FTP это соединение DATA будет инициировано с FTP-сервера с TCP-порта 20 и подключено к FTP-клиенту. Активный FTP не очень хорошо работает с пользователями за брандмауэрами и шлюзами NAT, поэтому он в основном вышел из употребления. Большинство FTP-серверов поддерживают пассивный FTP. При использовании пассивного FTP FTP-сервер открывает приемник для соединения DATA на втором порту, к которому затем может подключиться FTP-клиент. Проблема для брандмауэра в том, что порт DATA может быть любым доступным непривилегированным портом между 1024-65536.
В брандмауэре без сохранения состояния, который обычно разрешается путем ограничения количества пассивных портов, которые FTP-сервер может назначить, а затем явно открывает эти порты. т.е.
В брандмауэре с отслеживанием состояния вам не нужно явно открывать порт DATA, вспомогательный модуль netfilter распознает динамический порт, который назначен, и динамически открывает этот порт для правильного клиента, помечая соединение DATA как
RELATED
после которого оно будет соответствовать универсальному правилу :Для этого необходимо, чтобы загружался правильный модуль ядра, например , в случае FTP вручную, например
insmod nf_conntrack_ftp
, постоянная зависимость от перезагрузки зависит от дистрибутива.Примечание. Модуль отслеживания FTP-соединений не будет работать, если FTP используется с SSL, поскольку управляющее соединение будет зашифровано, и nf_conntrack_ftp больше не сможет прочитать ответ PASV.
NFS и аналогичные службы RPC . Проблема со службами RPC заключается в том, что они не используют определенный фиксированный порт. Они могут произвольно выбрать любой доступный порт, который затем будет зарегистрирован демоном RPC Portmap. Клиент, пытающийся подключиться, запросит демон Portmap и затем подключится напрямую к нужному порту. Это решило проблему исчерпания зарезервированных портов ...
С точки зрения брандмауэра должен быть открыт порт 111 TCP / UDP и фактический порт, который в данный момент использует служба RPC. Проблема открытия такого случайного порта в брандмауэре обычно решается путем ограничения службы RPC, такой как сервер NFS, на использование заранее определенного фиксированного порта.
источник
Iptables / Firewall "введение"
Брандмауэр - это сетевой фильтр на основе политик. Брандмауэры Linux построены вокруг Netfilter; инфраструктура обработки сетевых пакетов ядра, состоящая из нескольких модулей ядра, выполняющих определенные задачи:
Пользователи настраивают среду Netfilter в соответствии со своими потребностями брандмауэра, используя iptables из командной строки. С помощью iptables мы определяем правила, которые инструктируют ядро, что делать с IP-пакетами, когда они приходят, проходят или выходят из нашего Linux-бокса. Каждый основной процесс Netfilter представлен ТАБЛИЦЕЙ (FILTER, NAT, MANGLE) в iptables lingo. У них есть несколько определенных точек подключения на карте потоков сетевых пакетов, где они вызываются ядром для выполнения своих обязанностей. Некоторые специально расположенные последовательности вызовов TABLE обычно называются встроенными ЦЕПЬМИ, получающими имена PREROUTING, INPUT, FORWARD, OUTPUT и POSTROUTING. Легко запомнить, если мы связываем TABLE с «типом процесса», а CHAIN с «местоположением» на карте потока сетевых пакетов, где вызываются экземпляры этих процессов.
Поскольку IP-пакет принимается на сетевом интерфейсе или создается локальным процессом, пока он не будет окончательно доставлен или отброшен, механизм Netfilter будет последовательно тестировать и применять правила, содержащиеся в карте потока сетевых пакетов. В каждом блоке, идентифицированном парой TABLE @ CHAIN, пользователь может добавить одно или несколько из этих последовательных правил, содержащих критерии сопоставления IP-пакетов и соответствующий порядок действий. Существуют действия (например, ПРИНЯТЬ, УСТРАНИТЬ и т. Д.), Которые могут быть выполнены несколькими таблицами, а другие действия (т. Е. SNAT, DNAT и т. Д.) Являются специфичными для таблицы.
т. е. когда IP-пакет поступает от сетевого интерфейса, он сначала обрабатывается цепочкой PREROUTING, вызывая пользовательские правила таблицы MANGLE, если таковые имеются. Если нет правил, соответствующих текущему пакету, применяется соответствующий курс действий или «политика» по умолчанию для MANGLE @ PREROUTING. В этот момент, если пакет не был отброшен, процесс продолжится, теперь вызывая правила таблицы NAT в цепочке PREROUTING (см. Карту) и так далее. Чтобы упростить размещение правил, пользователи также могут создавать свои собственные пользовательские цепочки и «прыгать» в них из разных точек карты по своему желанию.
Хотя встроенные цепочки могут иметь определенные пользователем политики пакетов ACCEPT или DROP, определенные пользователем цепочки всегда имеют неизменную политику по умолчанию RETURN для вызывающей стороны для продолжения процесса.
Iptables команды
Основные команды iptables заполняют карту потока сетевых пакетов требуемыми правилами обработки.
Общее правило iptables можно записать так:
# iptables <table> <Add/Insert/Delete> <CHAIN> <PKT_MATCHING_CRITERIA> <ACTION>
Это можно прочитать как:
Вспомогательные команды iptables завершают сценарий, устанавливая условия по умолчанию, списочные правила, правила очистки и т. Д.
Iptables загружает наши команды в движок Netfilter во время выполнения, Netfilter немедленно применяет загруженные правила и настройки, но они не являются постоянными. После перезагрузки все ранее загруженные правила и настройки Netfilter будут потеряны. По этой причине существуют утилиты iptables, которые позволяют сохранить текущий активный набор правил в файл и перезагрузить его позже.
Сводка Iptables
Netfilter - чрезвычайно гибкая и мощная инфраструктура, но за это нужно платить; Iptables сложный. С точки зрения пользователя, некоторые термины, такие как TABLE, CHAIN, TARGET, не очень хорошо соответствуют концепции, которую они представляют, и поначалу не имеют особого смысла. Тема длинная, команды, кажется, имеют бесконечный список параметров. Что еще хуже, нет ни одной книги, которая действительно справлялась бы с Iptables. Они в основном делятся на две категории: «книга рецептов» или «книга справочников». Я думаю, что это введение дает вам снимок ландшафта Netfilter / Iptables, а также необходимую дозу предварительно обработанного содержимого страницы руководства. Если вы новичок в iptables, после прочтения этих параграфов вы будете готовы прочитать примеры iptables. С некоторой практикой вы скоро найдете свои собственные правила.
Брандмауэры
Брандмауэр в основном предназначен для динамического разрешения или запрета сетевого трафика на основе набора правил. На этом этапе легко понять, почему инфраструктура Linux Netfilter / Iptables идеально подходит для построения брандмауэра. Рассматривая карту потока сетевых пакетов, мы находим два особенно интересных места в таблице FILTER в цепочках INPUT и FORWARD; Мы можем принять решение о IP-адресе источника, IP-протоколе (UDP / TCP), порте назначения (80, 21, 443 и т. Д.) И т. Д., Если мы ПРИНИМАЕМ, ОТКАЗЫВАЕМ или просто УДАЛЯЕМ конкретный IP-пакет. Это то, что брандмауэр делает в 80% случаев, т.е. защищает веб-сервер от несанкционированных сетевых запросов. Другие 20% времени манипулируют сетевыми пакетами (NAT, MANGLE).
Сценарии межсетевых экранов
Существуют сотни различных макетов брандмауэров, отвечающих различным потребностям, но 3 из них можно считать наиболее типичными сценариями брандмауэра.
Я написал это для: http://www.vercot.com/~jeoss/howto/JeossEasyFirewall.html
источник