Настройка

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

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

В процессе описания настроек я буду предполагать, что у вас установлены две сетевых карты, имеется внешнее 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 не вызывал проблем):

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

Настройка Firewall

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

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

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