Ключевые слова:iptables, firewall, linux, (найти похожие документы)
From: SG <sg@sg.tomsk.ru.>
Newsgroups: email
Date: Mon, 1 May 2006 18:21:07 +0000 (UTC)
Subject: Простое управление сложным фаерволом (netfilter/iptables)
Наверное каждый системный администратор хотя бы раз сталкивался с
громоздкими настройками фаервола. Не несколько строчек для защиты своего
персонального компьютера или сервера приложений, а сотни строк в каждой
таблице на маршрутизаторе сети. Кто сталкивался - тот знает, как
"удобно" править и как "легко" окинуть взором структуру этого
нагромождения правил в разных таблицах и цепочках. Кроме этого довольно
часто встречается ситуация, когда нужно добавить созданные скриптами
правила в netfilter. Обычно, в таких ситуациях получаются размазанные по
различным скриптам, хранящихся в невообразимых местах (у кого какая
фантазия :) наборы правил. И что же делать с этим ужасом, когда
требуется внести какие-то изменения и применить их? Каждый решает эту
проблему по-своему, но обычно каждое изменение уникально в том смысле,
что администратор забудет запустить вон тот скрипт или не в том порядке.
И неизвестно, что будет после ребута... А если вдруг этот администратор
куда-то делся и его заменяет другой... Какая до боли знакомая
ситуация? :)
В большинстве основанных на rpm дистрибутивах для пакета iptables
существует набор стартовых скриптов и конфигов типа:
/etc/init.d/iptables
/etc/sysconfig/iptables-ipv4.d/*
/etc/sysconfig/iptables*
В других дистрибутивах тоже должна быть какая-то точка отсчета. Но
проблема заключается в том, что правила netfilter загружаются с помощью
утилиты iptables-restore, которая крайне примитивная и например не
понимает присоединение дополнительных файлов правил с помощью директивы
include.
Я решил все эти проблемы простым способом: организовал дерево каталогов
и файлов с правилами, а собирается все это в стандартный конфиг, который
используется стартовым скриптом /etc/init.d/iptables. В результате
получилась удобная структура конфигов, которую можно легко понять, в
которую можно быстро вносить изменения и в которую могут добавляться
правила, сгенеренные какими-то скриптами.
Вот пример этого:
/etc/sysconfig/iptables-ipv4.d/
rules.create - скрипт для создания конфига
start - стандартный конфиг, который создается этим скриптом и используется
стандартным стартовым скриптом (/etc/init.d/iptables)
/etc/sysconfig/iptables-ipv4.d/filter/
begin
end
forward
input
output
/etc/sysconfig/iptables-ipv4.d/mangle/
begin
end
forward
input
output
postrouting
prerouting
/etc/sysconfig/iptables-ipv4.d/nat/
begin
end
output
postrouting
prerouting
Это шаблон, который должен быть всегда. Пусть большая часть файлов будет
поначалу пустая, но они должны быть.
begin - начало таблицы, тут описываются дефолтные правила. Пример для filter:
*filter
:INPUT ACCEPT
:FORWARD ACCEPT
:OUTPUT ACCEPT
end - этот файл завершает таблицу. Обычно там:
COMMIT
Остальные файлы по имени стандартных цепочек. Ну и разумеется, вы можете
там создавать свои файлы с таким же именем, как и название цепочки. Так
же можно поделить большую стандартную цепочку на несколько мелких.
Например:
forward.begin
forward.net1
forward.net2
forward.netXX
forward.end
Другие скрипты могут создавать свои файлы-правила и все они будут
собраны в одном конфиге.
Вот мой пример таблицы filter:
begin
drop-and-log-it
end
external
forward
input
noexternal
noexternal-in
output
tomsknet
tomsknet-in
Ну а теперь сам скрипт, который собирает это дерево. Ничего сложного.
Разумеется, каждый должен сам его доделывать под свои дополнительные
цепочки:
#!/bin/bash
path="/etc/sysconfig/iptables-ipv4.d"
rules="$path/start"
cat $path/mangle/begin >$rules
cat $path/mangle/prerouting >>$rules
cat $path/mangle/postrouting >>$rules
cat $path/mangle/input >>$rules
cat $path/mangle/output >>$rules
cat $path/mangle/forward >>$rules
cat $path/mangle/end >>$rules
cat $path/nat/begin >>$rules
cat $path/nat/prerouting >>$rules
cat $path/nat/postrouting >>$rules
cat $path/nat/output >>$rules
cat $path/nat/end >>$rules
cat $path/filter/begin >>$rules
cat $path/filter/input >>$rules
cat $path/filter/output >>$rules
cat $path/filter/forward >>$rules
cat $path/filter/end >>$rules
В этот скрипт можно добавить какие-то дополнительные действия. Например,
у меня там генерится цепочка, которая пропускает трафик в городские сети
(бесплатный).
Попробуйте и часть ваших проблем и проблем ваших заместителей уйдет в прошлое.
Фигня все это при грамотном распределении рулей по цепочкам, нормальном их именовании и соментариях (ipt_comment) достаточно короткой памятки с принципами...