Файервол

Материал из FedoraMD.org Wiki
Перейти к навигации Перейти к поиску

ВНИМАНИЕ: команды предваряемые символом '#' должны выполняться с правами root (Суперпользователь). Открыв терминал (или находясь в консоли) с правами обычного пользователя, введите команду $ su - для повышения уровня привелегий. Символы '$' и '#' в начале строки не являются частью команды и не должны вводится. Прочие команды могут выполняться с правами обыкновенного пользователя.


В большинстве случаев, начинающий пользователь Linux немного знает об iptables, например как с помощью iptables создать firewall (огненную стену). Главная цель firewall это ограничения доступа к Вашему компьютеру из внешней сети. Однако утверждение что iptables это firewall под Linux неправильно! iptables позволяет не только создать firewall, с его помощью можно сделать NAT-сервер (позволяет локальную сеть выводить в интернет), маркировать пакеты в пределах компьютера, изменять поля в пакетах и многое другое. Важно отметить что с помощью iptables нельзя ограничивать скорость трафика, этой задачей занимается iproute2.

Сориентируем начинающего пользователя какой программный пакет используются для работы с пакетами, а какой для управления трафиком: iptables предназначен для обработки пакетов, под словом обработка понимается такие задачи как фильтрование пакетов, создание firewall, NAT-сервера, маркировка пакетов и так далее. iproute2 используется для управления трафиком. Управление трафиком это ограничение скоростей, задание алгоритмов обработки пакетов в зависимости от их приоритетов. Для управления трафиком в большинстве случаев iproute2 использует маркировку пакета которая была сделана iptables.

Для управления трафиком с помощью iproute2 используется команда tc, а для обработки пакетов с помощью iptables - команда iptables.

Прежде чем использовать iptables необходимо иметь ясное представление о том, через какие этапы обработки проходит пакет. Поскольку Linux есть UNIX-овая система в ней изначально заложены возможности работы не только как десктопа, но и как сетевого сервера. В задачи сервера входит обработка трех типов пакетов:

  1. INTERNET --> Программа работающая на компьютере
  2. Программа работающая на компьютере --> INTERNET
  3. INTERNET <--> Локальная вычислительная сеть транзитные пакеты

Для эффективной обработки пакетов в iptables выделено три основных этапа обработки. Этапом обработки в iptables называется чепочки. В iptables есть три основных цепочки:

  • INPUT правила для входящих пакетов.
  • OUTPUT правила для исодящих пакетов.от локальных процессов
  • FORWARD правила для транзитных пакетов

В каждую из этих трех цепочек можно добавлять свои команды фильтрации. Есть следующие команды фильтрации: DROP (уничтожить пакет), REJECT (уничтожить пакет и послать сообщение источнику об этом), ACCEPT (пакет принимается прародительской цепочкой (INPUT, OUTPUT или FORWARD) и прекращает прохождения по всем цепочкам у которых прародителем является одна из основных цепочек: INPUT, OUTPUT или FORWARD). В каждую из цепочек INPUT, OUTPUT или FORWARD можно добавить свою цепочку переход на которую будет при выполнение опреленных параметров пакета (таких как адрес источника, порт и так далее). Для возврата из своей цепочки в родительскую используется команда RETURN.

В состав пакета iptables входят две очень удобные утилиты, особенно если вам приходится иметь дело с большими наборами правил. Называются они iptables-save и iptables-restore. Первая из них сохраняет, а вторая восстанавливает наборы правил в/из файла. По своему формату файл с набором правил похож на обычные файлы сценариев командной оболочки (shell), в чем вы сможете убедиться чуть ниже.

Один из плюсов использования утилит iptables-save и iptables-restore состоит в высокой скорости загрузки и сохранения больших наборов правил. Главный недостаток, связанный с установкой наборов правил из сценариев командной оболочки состоит в том, что команда iptables копирует набор правил из пространства ядра в пространство пользователя, вставляет, добавляет или изменяет правило и, наконец, весь набор правил копируется обратно в пространство ядра. Эта последовательность действий выполняется для каждого правила, которое вставляется или изменяется в наборе правил.

Эта проблема легко решается с помощью iptables-save и iptables-restore Утилита iptables-save записывает набор правил в обычный текстовый файл в особом формате. Утилита iptables-restore загружает набор правил из файла. Главное преимущество этих утилит состоит в том, что они производят сохранение/восстановление всего набора правил за одно обращение. iptables-save "в один присест" получает из пространства ядра и записывает в файл весь набор правил, а iptables-restore загружает из файла и переписывает за одно обращение в пространство ядра набор правил для каждой таблицы. Или другими словами -- вместо того, чтобы обращаться огромное число раз к ядру для того чтобы получить набор правил, а затем опять записать его в пространство ядра не меньшее число раз, можно просто сохранить набор правил в файл, а затем загружать его из файла, при этом число перемещений наборов в ядро будет зависеть только от числа используемых таблиц.

Вы уже наверняка поняли, что эти утилиты могут представлять для вас интерес, особенно если вам приходится загружать огромные наборы правил. Однако использование этих утилит имеет и свои отрицательные стороны, которые мы рассмотрим в следующем разделе.

У вас может сложиться впечатление, что iptables-restore может обрабатывать своего рода сценарии. Пока не может и вероятнее всего -- никогда не сможет. В этом и состоит главный недостаток iptables-restore. Чтобы было более понятно -- представьте себе случай, когда брандмауэр получает динамический IP-адрес и вы хотите вставить его значение в свои правила во время загрузки системы. Решить эту проблему с помощью iptables-restore практически невозможно.

Как одно из решений можно предложить написать небольшой скрипт, который определяет значение IP-адреса и затем вставляет его в набор правил (например, с помощью sed) на место некоторого ключевого слова. Здесь вам потребуется создать временный файл, в котором производятся изменения и который затем загружается с помощью iptables-restore. Однако такой вариант решения порождает свои проблемы -- вам придется отказаться от утилиты iptables-save поскольку она может затереть, созданную вручную, заготовку файла с правилами для iptables-restore. Вобщем -- довольно неуклюжее решение.

Еще один вариант -- хранить в файле для iptables-restore только статические правила, а затем с помощью небольшого скрипта добавлять правила с динамическими параметрами. Конечно же вы уже поняли, что это решение такое же неуклюжее как и первое. Вам придется смириться с тем, что iptables-restore не очень хорошо подходит для случая с динамически назначаемым IP-адресом и вообще для случаев, когда вам потребуется динамически изменять набор правил в зависимости от конфигурации системы и т.п..

Еще один недостаток iptables-restore и iptables-save в том, что их функциональность не всегда соответствует описанной. Проблема состоит в том, что не многие пользуются этими утилитами, еще меньше людей вовлечено в процесс поиска ошибок в этих программах. Поэтому, при использовании некоторых, вновь появившихся, критериев или действий вы можете столкнуться с неожиданным поведением своих правил. Несмотря на возможное существование некоторых проблем, я все же настоятельно рекомендую к использованию эти два инструмента, которые прекрасно работают в большинстве случаев, исключение могут составлять лишь некоторые новые критерии и действия.