Дерни за веревочку, дверца и откроется. (C) Бабушка
| Страница ДКД (Страница провайдера) | Линукс-Чайник (Оглавление) |
Firewall (в буквальном переводе огненная стена) - это название компьютера, фильтрирующего пакеты, которые проходят из вашей локальной сети в интернет и обратно, и таким образом осуществляющего защиту вашей локальной сети. К сожалению, пока нет русского эквивалента этому названию, поэтому в тексте название firewall оставленно без изменения - Прим. Пер.
Автор - Paul Dunne. Перевел - Владас Лапинскас
Эта статья описывает, как сконфигурировать Линукс для осуществления маршрутизации между локальной сетью и Интернет, и адресует к вопросам безопасности, поднимаемых таким соединением с использованием Линукса в качестве firewall. Эта статья является учебным пособием, которое поможет читателю установить, сконфигурировать и администрировать firewall на Линуксе. Предполагается некоторое понимание работы сетей TCP/IP, Линукса и firewall.
Остальные части этой статьи содержат следующее:
1. Введение
Предполагается, что вы знакомы с теорией firewall. Если это не так,
пожалуйста, ознакомтесь с хорошей коллекцией статей на
Исследовательском узеле фирмы AT&T . Подборка статей
на узле TIS так же достойна внимания
2. Маршрутизация
Наш компьютер с установленным Линуксом уже подключен к Интернет и к
локальной сети, но наша локальная сеть все еще не способна "общаться" с
Интернет, и наобарот. Чтобы добиться этого, мы должны разрешить
маршрутизацию на Линуксе, чтобы пакеты с одного сетевого интерфейса,
посланные к адресатам вне локальной сети, передавались бы
(ретранслировались) через другой сетевой интерфейс.
Есть 2 разных способа осуществить маршрутизацию, в зависимости того, были ли назначены адреса в локальной сети организацией InterNIC (организация, занимающаяся "раздачей" адресов в сети Интернет и ответственная за уникальность адреса в пределах этой сети. - Прим. Пер.), или локальная сеть использует "частные" адреса, разрешенные в RFC 1597.
Для целей этой статьи будем предполагать, что локальная сеть не имеет
собственных Интернет-адресов, и поэтому должна быть "спрятана" от Интернет.
Наш firewall будет служить, таким образом, двойной цели - предоставление
маршрутизации для "спрятанной" сети и как барьер безопасности.
3. Типы firewall
Есть 2 типа firewall. Первый - фильтрирующий, где маршрутизация пакетов
разрешается или запрещается в соответствии с набором правил. Второй тип -
прокси (от proxy - заместитель, а так же доверенный), который блокирует
полностью внутреннюю сеть от внешней, и предоставляет сервисы по запросу из
внутренней сети. Прокси-firewall подразделяется еще на 2 под-типа.
В нашей статье, мы будем устанавливать базовый фильтрирующий firewall. Более
детальная информация о других типах firewall доступна в
Firewalling and Proxy Server HOWTO.
4. Требования к железу
Любой компьютер, на который можно установить Линукс, сможет работать как
firewall. От некоторых параметров функционирование firewall зависит больше,
чем от других. Фильтрирующие firewall требуют много памяти для хранения
таблиц маршрутизации; требования со стороны прокси-firewall определяются
сервисами, которые он предоставляет. Например, прокси, предоставляющий
WWW-сервис, требует много памяти и высоко-производительных дисков, в
зависимости от того размеров кэша.
5. Конфигурация
Использование Линукса в качестве firewall может быть осуществлено либо при
помощи встроеных возможностей, или с помощью дополнительно устанавливаемых
пакетов. В этой статье мы рассмотрим как сделать Линукс пакет-фильтрирующим
маршрутизатором, без применения дополнительных пакетов программ.
5.1. Ядро системы
Ядро Линукса должно быть перекомпилировано со специально включенными опциями
для использования кода firewall. Большинство готовых ядер Линукса -- которые
обычно поставляются с дистрибутивами -- не содержат нужных нам опций, таким
образом, нам необходимо перекомпилировать ядро. Это простая задача, и мы
быстро пробежимся через все шаги. Более детально смотрите
Linux Kernel HOWTO.
Я должен так же указать, что было бы неплохо предварительно перейти на
последнюю стабильную версию ядра, в момент написания, это 2.0.30 (2.0.33 -
на момент перевода). Переход на новую версию может быть сделан 2 способами -
полностью скачать с Интернета последнюю версию исходников ядра, или скачать
все патчи между вашей версией и текущей стабильной версией, последовательно
их устанавливая. Первый способ - легче, а последний - дешевле, если вы
платите за Интернет. Зайдите на Linux v2
Information HQ за более детальной
информацией.
5.2. Конфигурирование ядра
Ядро Линукса конфигурируется при помощи команды "make config". Следующие
опции должны быть включены
CONFIG_FIREWALL=y CONFIG_INET=y CONFIG_IP_FORWARD=y CONFIG_SYN_COOKIES=y CONFIG_IP_FIREWALL=y CONFIG_IP_FIREWALL_VERBOSE=y CONFIG_IP_MASQUERADE=y CONFIG_IP_ACCT=y
(Все приводимые команды по конфигурированию и компиляции ядра следует
производить в директории, где находятся исходники ядра, обычно это
/usr/src/linux. Существуют так же более приятные программы конфигурации ядра
- для этого введите make menuconfig в консоли, или make xconfig под X-window
- Прим. Пер.)
5.3. Перекомпиляция ядра
Следующая последовательность комманд перекомпилирует ядро:
make dep && make clean && make zImage
5.4. Установка нового ядра
Последующая последовательность комманд копирует новое ядро и соответствующую
таблицу символов в корневую директорию, и запускает программу LILO (от LInux
LOader - загрузчик Линукса) чтобы загрузчик узнал о новом ядре:
cp /usr/src/linux/arch/i386/boot/zImage / cp /usr/src/linux/System.map / /sbin/lilo
Неплохая идея - скопировать новое ядро сначала на дискету, перегрузиться и убедиться, что все работает нормально. Вы сможете затем установить новое ядро на жесткий диск, как показано выше. (Более удобным, на мой взгляд, является вариант, когда несколько различных вариантов ядер хранятся на жестком диске, а при загрузке с помощью lilo можно выбирать нужное ядро - Прим. Пер.) Для дискеты вы можете использовать простую команду копирования, например:
cp /usr/src/linux/arch/i386/boot/zImage /dev/fd0
6. Где взять ipfwadm
Утилита ipfwadm(8) используется для администрирования служб (services)
firewall, предоставляемых ядром Линукс. Вы можете получить эту утилиту с
узла
X/OS site как в виде исходников, так и в откомпилированном виде. Эта
утилита очень легко компилируется и устанавливается.
7. Фильтрирующие наборы правил
Суть функционирования firewall содержится в наборах правил, которые
определяют, что происходит с пакетами. Есть четыре типа наборов правил:
управляющие входом (input), выходом (output), пересылкой (forwarding) и
отчетами. Наборы правил поддерживаются ipfwadm.
Вместо того, чтобы загружать вас огромным списком опций и аргументов, которые можно задавать программе ipfwadm мы постепенно познакомим вас с наиболее важными через примеры. Страница руководства (manual page) даст вам больше деталей о редко употребляемых аргументах.
В примере ниже мы построим firewall который присоединен к локальной сети через интерфейс 192.168.1.1, а к Интернет - через интерфейс 192.168.20.1. Пожалуйста, заметьте, что сеть 192.168.0.0 представляет собой специальный немаршрутизируемый адресный блок ("частные" адреса, о которых говорилось выше), который или не подсоединен к Интернет, или экранирован от контакта с Интернет при помощи firewall. Эти адреса не могут быть использованы в какой-либо сети, которая напрямую подключена к Интернет.
Отметьте также, что правила, которые приведены ниже, взяты из "rc скрипта" (rc скрипты исполняются при загрузке системы - Прим. Пер.) с моей личной машины, где следующие переменные определены в заголовке файла для удобства:
LOCALHOST=`hostname` # Имя локальной машины (firewall)
IFEXTERN="158.152.37.217" # Внешний интерфейс (адрес со стороны Интернет)
IFINTERN="192.168.1.1" # Внутренний интерфей (адрес в локальной сети)
LOCALNET="192.168.1.0/24" # Диапазон адресов машин в локальной сети
ANYWHERE="0.0.0.0/0" # "Любое место" - адреса любых машин в Интернет
UNPRIVPORTS="1024:65535" # Диапазон портов TCP/IP которые обычно
# ничем не заняты, кроме временных соединений
7.1. Блокировка
Блокирующие правила относятся к тому, что идет непосредственно из и в
firewall. Ниже я построю шаг за шагом набор блокирующих правил для нашего
базового firewall. С помощью ipfwadm, блокирующие правила контролируются
двумя параметрами: -I для входных правил и -O для исходящих.
Сначала заблокируем все! Идея в том, что мы сначала запрещаем доступ везде, а потом разрешим его там, где нужно.
# Конечно, мы параноики :-) ipfwadm -I -p deny # Запрещаем (deny) все входящие пакеты ipfwadm -O -p deny # Запрещаем все выходящие пакеты ipfwadm -F -p deny # Запрещаем любую пересылку
Опция -b означает, что правило двунаправленное (bidirectional), то есть оно будет применяться к IP пакетам в обоих направлениях. Опция -p означает поведение по умолчанию, когда не найдено никакого другого правила. Итак, теперь наш firewall будет отбрасывать входящие и выходящие пакеты. Конечно, это не то, чего мы добиваемся. Нам надо добавить некоторые правила чтобы выборочно разрешить сетевой траффик в и из firewall. Тем не менее, мы должны обезопасить сам firewall от спуфинга (spoofing, хакерский трюк, когда машина хакера выдает себя за машину с другим IP адресом. Приведенные ниже два правила запрещают входящие пакеты с адресом самого firewall - Прим.Пер.) Вот эти два правила дадут нам уверенность, что мы не станем жертвой такой аттаки:
# Обработка spoof-пакетов ipfwadm -I -a deny -V $IFEXTERN -S $LOCALNET -D $ANYWHERE ipfwadm -I -a deny -V $IFEXTERN -S $IFEXTERN -D $ANYWHERE
Для начала, мы можем разрешить пакеты между firewall и нашей локальной сетью:
# Неограниченный траффик в пределах локальной сети.. ipfwadm -I -a accept -V 192.168.1.1 -S 0.0.0.0/0 -D 0.0.0.0/0 ipfwadm -O -a accept -V 192.168.1.1 -S 0.0.0.0/0 -D 0.0.0.0/0
# Неограниченный траффик на самого себя (localhost) ipfwadm -I -a accept -V 127.0.0.1 -S 127.0.0.1 -D 127.0.0.1 ipfwadm -O -a accept -V 127.0.0.1 -S 127.0.0.1 -D 127.0.0.1
Здесь вы видите использование входных -I и выходных -O категорий для указания к какому направлению сетевого траффика применимо конкретное правило. В этом примере я подразумевал, что сетевая карта, через которую наш firewall подсоединен к локальной сети, имеет адрес 192.168.1.1. А сейчас мы сразу добавим доступ к службам SMTP, FTP, WWW и DNS:
# SMTP ipfwadm -I -a accept -P tcp -S $ANYWHERE -D $LOCALHOST smtp ipfwadm -O -a accept -P tcp -S $LOCALHOST $UNPRIVPORTS -D $ANYWHERE ipfwadm -O -a accept -P tcp -S $LOCALHOST smtp -D $ANYWHERE ipfwadm -I -a accept -P tcp -S $ANYWHERE -D $LOCALHOST $UNPRIVPORTS
# DNS ipfwadm -I -a accept -P tcp -S $ANYWHERE -D $LOCALHOST domain ipfwadm -I -a accept -P udp -S $ANYWHERE -D $LOCALHOST domain ipfwadm -O -a accept -P udp -S $LOCALHOST domain -D $ANYWHERE
# FTP ipfwadm -I -a accept -P tcp -S $ANYWHERE -D $LOCALHOST ftp ipfwadm -I -a accept -k -P tcp -S $ANYWHERE -D $LOCALHOST ftp-data ipfwadm -O -a accept -P tcp -S $LOCALHOST ftp -D $ANYWHERE
# WWW ipfwadm -I -a accept -P tcp -S $ANYWHERE -D $LOCALHOST www ipfwadm -O -a accept -P tcp -S $LOCALHOST www -D $ANYWHERE
Так как мы хотим разрешить пересылку траффика в и из локальной сети, мы должны добавить так же некоторые входные и выходные правила, вдобавок к правилам пересылки в следующей секции:
# Исходящие пакеты. ipfwadm -O -a accept -P tcp -S $LOCALNET $UNPRIVPORTS \ -D $ANYWHERE smtp ftp ftp-data www telnet domain ipfwadm -O -a accept -P tcp -S $IFEXTERN $UNPRIVPORTS \ -D $ANYWHERE smtp ftp ftp-data www telnet domain ipfwadm -O -a accept -P udp -S $LOCALHOST $UNPRIVPORTS \ -D $ANYWHERE domain
# Входящие пакеты. ipfwadm -I -a accept -k -P tcp -S $ANYWHERE ftp www telnet domain \ -D $LOCALNET $UNPRIVPORTS ipfwadm -I -a accept -k -P tcp -S $ANYWHERE ftp www telnet domain \ -D $IFEXTERN $UNPRIVPORTS ipfwadm -I -a accept -P tcp -S $ANYWHERE ftp-data -D $LOCALNET $UNPRIVPORTS ipfwadm -I -a accept -P tcp -S $ANYWHERE ftp-data -D $IFEXTERN $UNPRIVPORTS ipfwadm -I -a accept -P udp -S $ANYWHERE domain -D $LOCALHOST $UNPRIVPORT_PS Вначале мы разрешили входные TCP пакеты с любого компьютера (from anywhere) в нашу локальную сеть, если они обращаются к нашим разрешенным сервисам. Мы так же разрешили пакеты UDP к нашему серверу имен (dns). Опция -k говорит, что допустимы только пакеты с установленным битом подтверждения (ACK). Затем, у нас есть выходные правила, опять же - одни для TCP и другие для UDP. Они должны быть теперь легко понятны, так как являются зеркальным отражением входных правил.
Опять же, мы начнем с того, что запретим все перед тем, как специально разрешить некоторый тип траффика. i_P
pfwadm -F -p deny
Здесь опция -F означает, что это правило пересылки (forward). Как мы уже видели ранее, опция -p deny устанавливает политику запрещения всего, за исключением сервисов, которые мы разрешаем явно:
ipfwadm -F -m -a accept -P tcp -S $LOCALNET $UNPRIVPORTS \ -D $ANYWHERE ftp ftp-data www telnet ipfwadm -F -m -a accept -k -P tcp -S $ANYWHERE ftp www telnet \ -D $LOCALNET $UNPRIVPORTS ipfwadm -F -m -a accept -P tcp -S $ANYWHERE ftp-data \ -D $LOCALNET $UNPRIVPORTS
Здесь опция -m разрешает "маскировку" и опция -P обозначает, к какому
протоколу это относится. В качестве аргумента указывается диапазон
непривилегированных (non-privileged, или в правилах $UNPRIVPORTS) портов,
который разрешен для использования. Место назначения (destination) указано
как "ANYWHERE" - любое.
8. Отчеты
Правила отчетов используются для построения счетчиков байтов и пакетов для
выбранного траффика. Одно и то же правило может быть использовано как для
входных, так и для выходных пакетов. Каждый пакет сравнивается с правилом, и
если он ему удовлетворяет, соответствующие счетчики увеличиваются.
Программа ipfwadm использует опцию -A для правил отчетов. Направление можно указать явно, по умолчанию - в обе стороны. Например, следующее правило подсчитывает весь траффик локального Web сервера:
ipfwadm -A -a -b -P tcp -S 0.0.0.0/0 -D 192.168.1.2 www
Здесь мы полагаем, что машина с адресом 192.168.1.2 в локальной сети
является Web сервером.
Правило, которое я использую, намного проще:
ipfwadm -A -a -b
9. Заключение
Эта статья показывает, как настроить Линукс в комбинации
маршрутизатор-firewall, используя сетевые возможности, встроенные в ядро
Линукса. Мы не пытаемся предоставить полное, надежное решение, но для многих
узлов без повышенной секретности этого будет вполне достаточно. Для
дополнительной информации, начните с
Linux Journal Firewall Resources Resources
Copyright © 1995-1997 The McGraw-Hill Companies, Inc. All Rights Reserved.