Ferm — это низкоуровневое дополнение к iptables, позволяющее организовать своего рода циклы по спискам параметров iptables. Это оказывается особенно полезным при настройке сложных правил межсетевого экрана, для написания которых с помощью одного лишь iptables приходится до тошноты повторять -t filter -A INPUT -p tcp --state NEW .
, затем делать то же самое для -p udp, в общем кто плавал - знает. Ferm хорош тем, что, сохраняя всю гибкость iptables, позволяет добиться тех же эффектов с меньшими усилиями.
Так, например, чтобы разрешить новые подключения к портам ftp, ssh и http и запретить все остальное (кроме связанных), можно написать следующий конфиг: chain INPUT {
policy DROP;
mod state state (RELATED ESTABLISHED) ACCEPT;
proto tcp dport (http ftp ssh) ACCEPT;
}
Удивительно, но поиск выдает только одну статью по Ferm, которая не имеет никакого отношения к самому Ferm. Либо все уже все знают и всем это очевидно, либо наоборот. Исходя из последнего, я и решил написать эту тему.
Почему это необходимо?
Для простых случаев это вообще не обязательно.Но у меня есть, например, программный роутер с двумя аплинками.
Конфигурация межсетевого экрана состоит из 102 правил.
Многие из них повторяются с разницей в один параметр.
Если, не дай Бог, я захочу что-то в нем изменить, у меня будет резь в глазах и минимум 20 минут попыток вспомнить, что, где и как.
Согласитесь, это неприятно.
Ferm в данном случае нас спасает не только более читабельным, но и несколько более компактным синтаксисом.
Например, на том же сервере Ferm.conf (без комментариев и пустых строк) это 84 строки, при этом еще и настройка ip6tables. Каждая отдельная линия короче.
8960 символов для iptables против 2998 символов для Ferm. Учитывая, что при использовании Ferm практически нет ограничений на возможности iptables, выигрыш очевиден.
Помимо всего прочего, Ferm предлагает достаточно расширенные возможности по написанию правил скриптов, в т.ч.
вызов внешних программ и условных операторов.
Но это уже немного выходит за рамки темы.
Как это работает?
Ferm по своей сути представляет собой Perl-скрипт, который преобразует формат конфигурации Ferm в вызовы iptables (или формат iptables-save/restore).Соответственно, работает он очень просто: читает конфиг в предопределённых соглашениях и вызывает iptables с соответствующими параметрами.
В общем, особой магии нет.
Формат конфига (кратко)
В целом конфиг представляет собой распечатку списков в форме, слегка напоминающей C. Разделителем инструкций является точка с запятой.Вложенные списки организуются с помощью фигурных скобок.
Простое перечисление – круглые.
Еще не ясно? Давайте посмотрим на пример.
Допустим, у нас есть правило iptables iptables --protocol tcp -j ПРИНЯТЬ В ферме это будет транслироваться как протокол TCP ACCEPT; Разрывы строк здесь не важны, важна только точка с запятой.
Таблица и цепочка в данном случае по умолчанию (-t filter -A INPUT).
Определение таблицы и цепочки производится с использованием ключевых слов table и Chain. Например, таблица nat цепочка PREROUTING протокол tcp dport 12345 DNAT для 1.2.3.4; В общем случае правило состоит из местоположения (таблицы, цепочки), самого правила (протокол tcp, dport 12345) и действия (DNAT до 1.2.3.4).
На само правило распространяются те же ограничения, что и при использовании «чистого» iptables. Здесь ключевыми словами являются таблица, цепочка, протокол, dport и DNAT. После них идут параметры.
Теперь добавим немного волшебства.
В качестве параметров для ключевых слов можно указать не только реальные значения, но и списки значений (или функций, или переменных, но это опять же выходит за рамки темы):
таблица nat цепочка протокол PREROUTING (tcp udp) dport (12345 54321) DNAT для 1.2.3.4;
А теперь еще немного магии — поскольку не всего можно добиться списками параметров, можно определить список ключевых слов:
таблица nat Chain PREROUTING {протокол TCP dport 12345 DNAT для 1.2.3.4; протокол udp dport 54321 DNAT для версии 1.2.3.4; }
С чего начать?
Если мне удалось вас заинтересовать, значит цель темы достигнута.Начать можно с сайта проекта: Ferm.foo-projects.org В Debian, Gentoo и Fedora Ferm устанавливается из репозиториев.
Стоит прочитать man Ferm, он очень подробный, что является несомненным плюсом.
Стоит посмотреть примеры (у меня они были в /usr/share/doc/ferm-*/examples, у вас могут быть другие) Помимо прочего, стоит знать еще две вещи: импорт существующей конфигурации и параметров командной строки.
Импортировать
В комплект поставки Ferm входит утилита import-ferm, которая принимает выходные данные iptables-save и записывает их в формат Ferm. Если этой утилите передать что-то на стандартный ввод, она интерпретирует это как выходные данные iptables-save и не будет ничего вызывать.Если вы не отправите его, он вызовет iptables-save. На стандартный вывод получаем Ferm-конфиг, который позже можно будет загрузить обратно.
В целом все очень дружелюбно.
Параметры командной строки
Что может быть очень полезно.--noexec Не вызывает iptables. Имеет смысл с --lines --линии Показывает сгенерированную конфигурацию iptables (и выполняет ее! просто чтобы посмотреть, используйте с --noexec) --интерактивный Применяет конфигурацию и запрашивает ввод пользователя.
Если нет ввода в течение 30 секунд, он возвращает старые настройки.
ОЧЕНЬ полезно при редактировании правил на удаленной машине в три часа ночи :) --быстро медленно Первый включает режим работы через iptables-restore, второй — режим работы через вызов iptables. С версии 2.0 по умолчанию используется быстрый, соответственно раньше - медленный.
Есть некоторые предостережения относительно экранирования символов в iptables-restore, поэтому в редких случаях --slow может быть более стабильным.
--slow --lines выведет строку непосредственно перед вызовом, что крайне удобно для отладки.
Ну и обязательный параметр — путь к конфигу.
Остальное описано в инструкции.
P.S.
Если тема интересна, могу углубиться в формат конфига фермы.Однако надо иметь в виду, что это будет во многом вольный перевод/пересказ человеческих ферм и примеров.
Теги: #linux #брандмауэр #настройка Linux #iptables #ferm
-
Пишем Наш Первый Драйвер Для Windows
19 Oct, 24 -
Подросток Улучшает Производительность Ruby
19 Oct, 24 -
Дача Зимой: Быть Или Не Быть?
19 Oct, 24 -
Лента - "Маджонг"
19 Oct, 24 -
Лебедев Сотрудничает С Thinkgeek?
19 Oct, 24