Мини-HOWTO: Мост + Firewall + DSL

Derek Ney

Перевод: Станислав Рогин, ASPLinux

Аннотация

Настройка моста+firewall на Linux-системе, использующей DSL-соединение


Содержание
Введение
Мосты, Firewall-ы, и DSL-соединения
Настройка
Проблемы

Введение

История

Этот документ был начат 10 декабря 1999 автором Derek Ney derek@hipgraphics.com после трех дней настройки моста и firewall (после перехода с PPP-сети на DSL-соединение).


Новые версии

Самую свежую версию этого документа можно найти в различных форматах на домашней странице "Проекта документирования Linux" (LDP) по адресу http://www.linuxdoc.org/.


История изменения версий

версия 0.03 (24 марта 2000)

  • Исправлен ошибочный URL на файл BRCFG.tgz

версия 0.02 (13 декабря 1999)

  • Учтены замечания Leonard Dickens (спасибо Leonard!)

версия 0.01 (10 декабря 1999)

  • Исходная версия


Copyrights

(c) 1999,2000 Derek R. Ney

This document may be distributed under the terms set forth in the LDP license at http://www.linuxdoc.org/COPYRIGHT.html.


Авторские права

Авторские права на русский перевод этого текста принадлежат ╘ 2000 ASPLinux Все права зарезервированы.

Этот документ является частью проекта Linux HOWTO.

Авторские права на документы Linux HOWTO принадлежат их авторам, если явно не указано иное. Документы Linux HOWTO, а также их переводы, могут быть воспроизведены и распространены полностью или частично на любом носителе, физическом или электронном, при условии сохранения этой заметки об авторских правах на всех копиях. Коммерческое распространение разрешается и поощряется; но, так или иначе, автор текста и автор перевода желали бы знать о таких дистрибутивах.

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

Мы бы хотели распространить эту информацию по всем возможным каналам. Но при этом сохранить авторские права и быть уведомленными о всех планах распространения HOWTO. Если у вас возникли вопросы, пожалуйста, обратитесь к координатору проекта Linux HOWTO по электронной почте: или к координатору русского перевода Linux HOWTO компании ASPLinux по адресу


Мосты, Firewall-ы, и DSL-соединения

До недавних пор наша сеть была подключена к Интернету, при помощи модема и протокола PPP. Я установил на шлюз сети firewall, используя IPChains (cмотрите "Мини-HOWTO: IPChains"), и все работало прекрасно. Недавно мы перешли на использование DSL-соединения. Я думал, что все будет очень просто - переключить firewall на DSL-соединение, и все будет работать, как раньше, однако я ошибался. На полную настройку и запуск мне понадобилось три дня. Я прочел огромный объем сопутствующей информации в сети, которая порой противоречила одна другой. Этот документ был создан потому, что, как я предполагаю, в будущем DSL станет значительно более распространен, и мои советы могут понадобиться многим. Я надеюсь, при помощи этого Мини-HOWTO, вы сможете сэкономить значительное время.

Я предполагаю, что эти советы можно применить и к нуль-модемной конфигурации, но это лишь предположение - я ничего не знаю о нуль-модемных соединениях.


Суть проблемы

Передо мной встала следующая проблема: настроить систему так, чтобы код firewall-а в ядре (управляемый ipchains) мог быть использован для фильтрации пакетов, идущих между глобальной и локальной сетью. Мне также требовалось, чтобы локальные машины были "видны" в глобальной сети (не исключая работы firewall). Вроде, казалось, IP-маскарадинг (смотрите HOWTO: IP-маскарадинг) - наиболее простое решение в моей ситуации. Но все оказалось не так просто.


Решение

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

Настройка системы состоит из двух частей, выполняющих разные задачи:

  • Маршрутизация пакетов между глобальной и локальной сетями (мост)

  • Фильтрация ненужных, неразрешенных и опасных пакетов (firewall)

В "Мини-Howto: Мосты" приведены подробные инструкции, решающие первую проблему - маршрутизацию пакетов между двумя сторонами сети (локальной и глобальной). Это проделывается следующим способом: обе карты переводятся в режим "promisc", в котором они обрабатывают все пакеты, проходящие по сети, и передают пакеты на другую сторону моста, если там находится их получатель. Эта процедура прозрачна для сети - другие компьютеры даже не видят мост, потому что он даже не имеет IP-адреса. Но это - неполное решение проблемы. Мне нужно, чтобы firewall имел IP-адрес (для административных функций, если не более), и, что гораздо важнее, код моста в ядре перехватывает и передает пакеты до того, как они попадут в firewall, и поэтому в этой ситуации firewall не работает.

Выяснилось, что возможно одновременно назначить IP-адреса сетевым картам и использовать их в качестве моста. Несмотря на то, что в "Мини-Howto: Мосты" это не делается (ну, на самом деле, там используются внутренние адреса) - все прекрасно работает. Это полностью разрешает первую проблему. Чтобы решить вторую, мы установим патч ядра (он находится по адресу http://ac2i.tzo.com/bridge_filter/), который позволяет применять правила firewall к пакетам, проходящим через сеть, добавляя в таблицу firewall новое правило "bridgein".


Общий обзор настроек

Этот мини-HOWTO предназначен для ситуаций, когда ваш Linux является шлюзом/firewall. В системе установлены две сетевых карты. Одна из карт подключена к внешнему миру (в нашем случае это DSL-модем), и ничто больше к нему не подключено. Вторая карта находится в нашей локальной сети.

Заметьте, что я описываю все с моих позиций: машина i386 (ABIT BP6 MOBO, с 2-мя Celeron-ами), RedHat 6.0 с ядром версии 2.2.13, и DSL-модем, подключенный к маршрутизатору, и две сетевых карты Netgear FA310TX. В вашем случае все может отличаться.

Также учтите, что некоторые шаги, описанные здесь, оставляют вашу сеть незащищенной от потенциальных атак извне (до полного запуска firewall). Если для вас это неприемлемо - вам придется применить дополнительные меры безопасности.


Литература

Я прочитал достаточно большой объем информации до того, как пришел к полностью работающему варианту. Часть информации оказалась полезной, но не совсем корректной.

"Мини-Howto: Мосты" был первым инструментом, примененным в настройках. К сожалению, его использование не включает в себя firewall.

"Мини-Howto: Мост+Firewall" вначале казался именно тем, что мне нужно. Однако теперь я считаю, что этот документ не совсем корректен. При помощи этого документа у меня вроде бы все заработало, но, в конце концов, я понял, что совсем не нужно разделять свою подсеть на две половины, как советует этот мини-HOWTO, и потом отказался от этого метода. Если вы все-таки будете читать этот документ, то отнеситесь к нему с изрядной долей критики.

Патч "Фильтр моста" - ключ к запуску всего. Как ни странно, информация на сайте предлагает вам использовать советы "Мини-Howto: Мост+Firewall" . Чтобы все запустить, вам эти советы не понадобятся. Понадобится лишь этот патч.

"Howto: IPCHAINS" бесценен при настройке собственно firewall. Я не пытаюсь в этом документе детально описывать настройку firewall - лишь упомяну о вещах, которые отличаются, в связи с использованием моста, описанного здесь.


Настройка

Полная настройка состоит из следующих шагов:


Пример конфигурации

В процессе описания настроек я буду предполагать, что у вас установлены две сетевых карты, имеется внешнее DSL-соединение (DSL-модем подключен к одной из сетевых карт), и локальная сеть, подключенная ко второй сетевой карте. Я называю карту, подключенную к DSL-модему "eth1", а карту локальной сети - "eth0". Имена карт в системе зависят от того, в какой слот они включены.

Я также предполагаю, что вам выделена подсеть IP-адресов 192.168.2.128-191, т.е маска сети будет - 255.255.255.192, а DSL-маршрутизатор имеет адрес 192.168.2.129. Все эти значение - фиктивные, они здесь приведены исключительно для иллюстрации сути настройки. Я буду использовать IP-адрес 192.168.2.130 для firewall-машины (на обеих сетевых картах), хотя я выяснил, что можно иметь и различные адреса для сетевых карт, если вам это необходимо.


Настройка оборудования

Вам понадобятся две сетевые карты. Самая большая проблема, с которой я столкнулся, возникла после того, как я выбрал первый попавшийся PCI-слот для второй карты на материнской плате, и оказалось, что этот слот использовал то же прерывание, что и первая карта. Я вообще не знал, что из-за этого могут возникнуть проблемы (на этот предмет не было никакой информации, и я думал, что все будет нормально работать). Обе карты тихо умерли (без индикации каких-либо ошибок) и перестали вообще передавать и принимать пакеты. Обычно, когда вы пытаетесь изменить конфигурацию, последнее, что делаете - меняете слоты карт. Я не знаю, существует ли эта проблема для всех сетевых карт, или только для наших, но я бы никому не советовал использовать общие прерывания. Драйвер, который мы будем использовать, выдает на экран IRQ каждой сетевой карты при загрузке системы. Существует большое количество советов, как заставить ядро обнаружить несколько сетевых карт (смотрите "Howto: Ethernet" , раздел Использование нескольких сетевых карт на одной машине); однако, мне это не понадобилось (мое ядро обнаруживало обе карты без каких-либо аргументов).

Затем вам надо подключить вторую карту к DSL-модему (или к тому, что соединяет вас с внешним миром) и убедиться, что это соединение работает. Вы должны дать команду ifconfig для второй карты с соответствующим IP-адресом и увидеть работающий ping до маршрутизатора на дальнем конце подключения к глобальной сети. Таким образом вы проверите, можно ли вы посылать пакеты по DSL-соединению. Например, в нашей сети нужно сделать следующее:

ifconfig eth1 192.168.2.130 netmask 255.255.255.192 broadcast 192.168.2.191

чтобы настроить вторую карту. А затем

  ifconfig eth0 down # чтобы быть уверенным в том, что эта карта не мешает работе
  ping 192.168.2.129

чтобы проверить доступность маршрутизатора. Для пущей уверенности проверьте доступность машин локальной сети через первую карту:

  ifconfig eth1 down # чтобы быть уверенным в том, что эта карта не мешает работе
  ifconfig eth0 up 
  ping 192.168.2.x # где x - это адрес машины в локальной сети
 

К этому моменту вы имеете полную уверенность в том, что оборудование исправно и работает.


Настройка моста

Вам понадобится утилита конфигурирования моста (автор Alan Cox) - она позволит контролировать работу моста, встроенного в ядро при включенной опции CONFIG_BRIDGE. BRCFG распространяется в виде исходных текстов и заранее скомпилированных исполняемых файлов. Я не знаю, с каким ядром были собраны эти файлы, но у меня все несколько разошлось, когда я попытался собрать их с include-файлами моего ядра (2.2.13). Поэтому, к сожалению, эти исходные тексты пришлось немного подправить. Ниже приведен сам патч:

diff -C 3 -r /tmp/BRCFG/brcfg.c ./brcfg.c
*** /tmp/BRCFG/brcfg.c  Wed Feb 21 19:11:59 1996
--- ./brcfg.c   Wed Dec  8 12:52:23 1999
***************
*** 1,6 ****
  
! #include <sys/types.h>
! #include <sys/socket.h>
  #include <skbuff.h>
  
  #include "br.h"
--- 1,6 ----
  
! #include <types.h>
! #include <socket.h>
  #include <skbuff.h>
  
  #include "br.h"
 

Используйте этот патч, пересоберите brcfg и установите их в соответствующее место (Я выбрал /usr/sbin).


Конфигурация ядра

Вам придется собрать свое ядро с применением включенной опции "Мост" и патча фильтрования моста (а также firewall-а, сети и т.п., если у вас еще это не встроено). Вам, как минимум, потребуются следующие опции ядра:

  CONFIG_EXPERIMENTAL=y
  CONFIG_BRIDGE=y
  CONFIG_FIREWALL=y           
  CONFIG_IP_FIREWALL=y        

Вам также придется взять Патч фильтрования моста и применить его к ядру. Пересоберите, установите новое ядро и перезагрузитесь.


Соединяем все вместе

Итак, теперь у нас имеются две сетевые карты, вновь собранное ядро и установленный пакет brcfg. Теперь вам понадобится стартовый скрипт, запускающий все это при загрузке системы. Я использовал загрузочные скрипты в стиле RedHat (/etc/rc.d). Специфические данные: сетевые адреса и маски я поместил в файл /etc/sysconfig/network:

 GATEWAY=192.168.2.129          # адрес DSL-маршрутизатора
 GATEWAYDEV=eth1                # сетевая карта, к которой подключен DSL
 ETH0_ADDR=192.168.2.130        # IP-адрес сетевой карты в локальной сети
 ETH0_MASK=255.255.255.192	# Сетевая маска нашей локальной сети
 ETH0_BROAD=192.168.2.191       # Широковещательный (broadcast) адрес локальной сети
 ETH1_ADDR=192.168.2.130        # IP-адрес сетевой карты, подключенной к DSL
                                # (он может отличаться от адреса карты в локальной сети)
 ETH1_MASK=$ETH0_MASK           # Сетевая маска на стороне DSL, она должна быть аналогична маске eth0
 ETH1_BROAD=$ETH1_BROAD         # то же самое и для широковещательного адреса

(Примечание переводчика: Видимо в эти настройки вкралась ошибка. В последней строке, по видимому, должно быть написано ETH1_BROAD=$ETH0_BROAD)

Затем я создал скрипт под именем /etc/rc.d/init.d/bridge, занимающийся настройкой моста:

#!/bin/sh
#
# bridge      Этот скрипт настраивает мост на DSL
#
# Описание: Скрипт использует brcfg для запуска моста и ifconfig для настройки сетевых карт
# имя процесса: bridge
# config: 

# Исходный текст библиотеки функций.
. /etc/rc.d/init.d/functions

# Исходная конфигурация сети.
. /etc/sysconfig/network

# Обработка способа вызова скрипта.
case "$1" in
  start)
        echo -n "Настройка моста (Configuring bridge): "
        ifconfig eth0 $ETH0_ADDR netmask $ETH0_MASK broadcast $ETH0_BROAD
        ifconfig eth1 $ETH1_ADDR netmask $ETH1_MASK broadcast $ETH1_BROAD
        route add $GATEWAY dev $GATEWAYDEV
        route add default gw $GATEWAY dev $GATEWAYDEV
        ifconfig eth0 promisc
        ifconfig eth1 promisc
        brcfg -enable
        echo
        ;;
  stop)
        # Остановка демонов.
        brcfg -disable
        ifconfig eth0 down
        ifconfig eth1 down
        ;;
  restart)
        $0 stop
        $0 start
        ;;
  status)
        ifconfig eth0
        ifconfig eth1
        brcfg
        ;;
  *)
        echo "Использование: bridge {start|stop|restart|status}"
        exit 1
esac

exit 0
 

Этот скрипт запускается при загрузке системы. Он выделяет адреса каждой карте, добавляет маршрут по умолчанию, указывающий на маршрутизатор DSL, добавляет специальный маршрут именно на DSL-маршрутизатор, устанавливает обе карты в режим "promisc", и затем включает мост. Я также создал ссылки на этот скрипт в следующих каталогах в /etc/rc.d:

 /etc/rc.d/rc0.d/K90bridge
 /etc/rc.d/rc1.d/K90bridge
 /etc/rc.d/rc2.d/S11bridge
 /etc/rc.d/rc3.d/S11bridge
 /etc/rc.d/rc4.d/S11bridge
 /etc/rc.d/rc5.d/S11bridge
 /etc/rc.d/rc6.d/K90bridge

В результате этого, скрипт запускается после запуска сети. Вам также необходимо убрать любое другое конфигурирование сетевых карт, которое делается в скрипте /etc/rc.d/init.d/network (в RedHat это достигается удалением файлов ifcfg-eth? в каталоге /etc/sysconfig/network-scripts/).

Чтобы проверить, все ли работает, я бы советовал загрузиться вам в однопользовательском режиме (укажите ядру опцию "single" , т.е. в lilo наберите "lilo: linux single"), а затем по одному загружать скрипты из каталога /etc/rc.d/rc3.d, пока не запустите мост. Запустив мост, проверьте, доступны ли вам некоторые машины (возможно вам придется использовать команду "ping -n", чтобы не включенный еще DNS не вызывал проблем):

  • используйте команду ping для DSL-маршрутизатора

  • используйте команду ping для локальной машины

  • используйте команду ping для машины в глобальной сети

Если вам доступны все три вида машин, то, скорее всего, все работает. Заметьте, что настройка моста практически не занимает времени при загрузке системы. Вы всегда можете проверить состояние моста командой brcfg без параметров.


Настройка Firewall

Вы все еще не настроили firewall (если таковой вам нужен) для предотвращения неавторизованного доступа к локальной сети. Патч "Фильтрование моста" , который вы установили, позволяет вам использовать новое встроенное правило "bridgein" в команде ipchains. Это правило используется, когда пакет передается по мосту от eth0 к eth1, или наоборот. Это правило не используется, когда пакет назначается самому firewall-у; вместо этого вам надо использовать правило input. Я не буду углубляться в детали настройки firewall; для этого читайте Howto: ipchains.


Настройка локальных машин

На каждой локальной машине вам надо просто правильно настроить IP-адрес, маску сети и использовать DSL-маршрутизатор в качестве шлюза по умолчанию. Firewall/мост будет направлять пакеты к DSL-маршрутизатору и от него.


Проблемы

Странные сообщения команды ipchains -X

Те изменения, котрые мы внесли в ядро патчем "Фильтрование моста" приводят к тому, что команда ipchains -X, выдает следующую ошибку:

 ipchains: Device or resource busy
 ipchains: Устройство или ресурс занят

Насколько я могу об этом судить - это безобидная ошибка. Я предполагаю, что ipchains не рассматривает новое правило bridgein, как встроенное.


Совместное использование прерываний

Как я уже упоминал в разделе "Настройка оборудования", нежелательно использовать одно и тоже прерывание для обеих сетевых карт, как, наверно, и нежелательно разделять их IRQ и с другими устройствами.