ОС Linux как мост (gateway) между локальной сетью и Internet

Костарев Алексей Федорович, kaf@terem.perm.su


В документе описана настройка ОС Linux для подключения локальной сети к сети Internet

1. Введение

2. Функции моста (gateway)

3. Настройка ядра ОС Linux

4. Настройка программного обеспечения

5. Заключение

1 Введение

В данном документе мы рассмотрим вариант подключения локальной сети через один серийный интерфейс к одному IP-провайдеру - наиболее часто встречающийся вариант подключения к сети Internet.

Данное руководство справедливо для версий ядра 1.2.8 - 1.2.13 Новые эксперементальные ядра 1.3.... позволяют Вам обеспечить дополнительные возможности (Mobile-IP, IP-masquarading и т п) но в настоящее время являются эксперементальными.

Рассматриваемый тип дистрибутива - Slackware v 3.0.0. Для других типов дистрибуции (RED HAT, CALDERA и т п) необходимо сделать корректировку на другой способ инициализации системы (выход в мультирежим - каталог /etc/rc.d/...), набора команд команд поддержки TCP/IP и т п.

2 Функции моста (gateway)

Мост между локальной сетью и Internet выполняет следующие функции:

3 Настройка ядра ОС Linux

3.1 Начальные установки

Как правило во всех дистрибутивах ОС Linux ядро собрано так, что оно не работает как router (маршрутизатор пакетов) между разными сетями, не поддерживает механизм защиты (firewall) маршрутизируемых пакетов и подсчета статистики. Кроме того выбранное вами первоначальное ядро может не содержать необходимых драйверов для поддержки сетевых плат и содержит набор драйверов не нужных Вам для работы.

Поэтому Вам необходимо будет собрать новое ядро, включив в него необходимые функции и драйвера для работы в качестве gateway.

Для сборки ядра Вам необходимо установить в систему исходные тексты ядра (дискеты K в Slackware v 3.0.0, или дискеты D в предыдущих версиях Slackware).

После установки перейдите в каталог /usr/src/linux и запустите команду

make config

Установите необходимые параметры в секциях General Setup , IDE Drivers . Ответьте y на вопрос

Networking support (CONFIG_NET)
. В секции Loadable module support ответьте y, если вы собираетесь динамически подключать драйверы (в том случае, когда конфигурация машины может измениться, или вы собираетесь использовать это ядро сразу на нескольких машинах), или n, если вы заранее знаете набор драйверов которые Вы собираетесь использовать в системе.

3.2 Включение возможностей маршрутизации пакетов, защиты сети (screening router) и подсчета IP-статистики (account)

В секции Networking options Ответьте утвердительно на следующие вопросы:

TCP/IP networking (CONFIG_INET) [y]
IP forwarding/gatewaying (CONFIG_IP_FORWARD) [y]
IP multicasting (CONFIG_IP_MULTICAST) [y]
IP firewalling (CONFIG_IP_FIREWALL) [y]
IP accounting (CONFIG_IP_ACCT) [y]
Ответы на остальные вопросы этой секции можете оставить прежними.

3.3 Настройка сетевых драйверов

В секции Network device support ответьте y на вопрос

Network device support? (CONFIG_NETDEVICES)
. Если вы установили режим динамически загружаемых драйверов (св. выше) , то на остальные вопросы данной секции вы можете отвечать n. В этом случае вы должны произвести динамическую загрузку драйвера при выходе системы в мультирежим с помощью команды insmod в файле /etc/rc.d/rc.inet1. Исключение составляют несколько драйверов сетевых плат (например драйвер платы NE2000). Чтобы проверить, является ли драйвер динамически загружаемым, перейдите в директорий /usr/src/linux/drivers/net, найдите исходный файл требуемого драйвера и поищите строку
#ifdef MODULE
Если данная строка в файле есть, то драйвер данного устройства можно загружать динамически.

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

Минимально необходимый набор драйверов:

3.4 Сборка ядра

После ответа на все вопросы запустите команды:

make dep
make clean
make zImage

Если Вы установили режим динамически загружаемых драйверов, то запустите команды сборки и установки этих драйверов:

make modules
make modules_install
Динамически загружаемые драйвера поместятся в каталог /lib/modules/<номер_ядра>.

После сборки ядра перепишите его в корневой катагог под любым удобным для Вас именем (например: linuxroute) :

mv arch/i386/boot/zImage /linuxroute
включите это ядро в состав загружаемых ядер (файл /etc/lilo.conf) и вызовите команду lilo (см. документацию на команду lilo).

После этого перезагрузите машину и попробуйте загрузить новое ядро. Если все прошло успешно - переходите к настройке программного обеспечения.

4 Настройка программного обеспечения

4.1 Настройка интерфейсов

Для каждого сетевого устройства (серийная линия с модемом, Ethernet плата) Вы должны подключить драйвер (на этапе сборки ядра или динамически) и установить интерфейс.

Динамическое подключение драйверов и устнановка интерфейса для устройств, как правило производится в файле /etc/rc/rc.inet1.

Для динамического подключения драйвера необходимо в файл rc.inet1. добавить команду(ы):

/sbin/insmod /lib/modules/<номер_ядра>/net/<имя_об'ектого_файла_драйвера>

Интерфейсом с точки зрения ОС является устройство через которое система получает и передает IP-пакеты. Каждое устройство (не вся машина) имеет свой IP-адрес. Интерфейс для устройства устанавливается командой ifconfig.

В файле rc.inet1 Вы должны установить следующие интерфейсы:

Настройка локального интерфейса lo

Настройка локального интерфейса автоматически включается в файл rc.inet1 после установки TCP/IP. Локальный интерфейс устанавливается командой:

/sbin/ifconfig lo 127.0.0.1
Этот интерфейс используется для связи программ IP-клиентов с IP-серверами той же машины.

Например, чтобы проверить правильность установки TCP/IP, наберите команду:

ping 127.0.0.1

Чтобы проверить правильность работы IP-серверов используйте для IP-клиентов адрес локального интерфейса: 127.0.0.1. Например, для проверки работы ftp-сервера, наберите команду

ftp  127.0.0.1

Настройка интерфейса платы Ethernet локальной сети (eth0)

Для связи с локальной сетью как правило используют одну или несколько плат Ethernet. Драйвер платы должен быть подключен в ядро, либо на этапе сборки ядра (см. выше), либо командой подключения динамически загружаемых драйверов:

insmod <имя_об'ектного_модуля_драйвера>

Ядро именует драйверы Ethernet как eth0, eth1 и т. д.

Для конфигурации интерфейса Вам надо знать :

В файле rc.inet1 после инсталляции уже есть закомментированные строки с настройкой интерфейса. Вам надо лишь определить вышеперечисленые переменные и раскомментировать строки:
IPADDR="194.220.22.1"   # REPLACE with YOUR IP address!
NETMASK="255.255.255.0" # REPLACE with YOUR netmask!
BROADCAST="194.220.22.255" # REPLACE with YOUR broadcast address, if you
                           # have one. If not, leave blank and edit below.
/sbin/ifconfig eth0 ${IPADDR} broadcast ${BROADCAST} netmask ${NETMASK}

Интерфейс для серийного порта - SLIP/CSLIP (sl0) или PPP (ppp0)

Для работы по серийному порту Вы можете использовать как SLIP (Serial Line Interface Protocol) с его модификацией CSLIP (Compressed Serial Line Interface Protocol), так и PPP (Point To Point) протокол.

PPP-протокол (программа pppd) является более сложным - он позволяет проверять достоверность входа для коммутируемых линий, поддерживает не только IP-протокол но и другие.

SLIP/CSLIP - протокол является более простым и удобным в настройке и часто используется для выделенных линий.

В данной работе мы рассмотрим настройку SLIP/CSLIP протокола для работы по выделенной линии через модемы.

Наиболее популярной программой для работу по протоколу SLIP/CSLIP по модему является dip (DialUpIP). Она позволяет использовать модем как по выделенной так и по комутируемой линии и производить настройки скорости соединения, IP-адресов, процедуры входа и т. п.

Основная проблема в программой dip состоит в том, что при вызове она становится фоновым процессом и после падения линии снимается без повторного запуска так что очень трудно отследить падение линии и перезапустить процесс соединения. Для решения этой проблемы в данном примере используется модифицированая программа dip, которая не уходит в фоновый процесс и вы можете легко ее перезапустить после падения линии, написав процедуру на языке shell:

#!/bin/sh

while :;
do
    /sbin/dip файл_конфигурации_dip
    sleep 5
done
и вставив вызов этой процедуры в файл rc.inet1.

Файл конфигурации описывает номер порта, скорость работы модема, локальный и удаленый IP-адрес интерфейса и т. п. Пример файла конфигурации приведен ниже:

# Установка локального IP-адреса
get $local 193.124.190.229

# Установка удаленного IP-адреса
get $remote 193.124.190.230
# Установка номера порта и скорости соединения
port ttyS0
speed 38400


# Установка размера максимально передаваемого пакета
# maximal transfere unit
get $mtu 576

# для комутируемых линий далее следует команды
# инициализации модема, дозвонки до IP-провайдера и процедуры входа
# для выделенной линии этот раздел опущен

done:
  print CONNECTED $locip ---> $rmtip
  default
  mode CSLIP
  exit
Более подробное описание команды dip и ее настроек Вы найдете в документации на команду.

4.2 Настройка routing'а

Настройка routing'а (маршрутизации пакетов между интерфейсами) может быть как статической (однократно настраиваемая таблица), так и динамической.

Динамическая настройка бывает необходима в том случае, если у Вас сложная, постоянно меняющаяся структура сети и одна и та же машина может быть доступна по различным интерфейсам (например через разные Ethernet или SLIP интерфейсы). Для динамической настройки routing'а служат команды routed и gated.

Как правило в большинстве ситуаций бывает достаточно статической настройки интерфейса командой route.

Настройка routing'а производится в файле rc.inet1. Как правило Вам бывает необходимо настроить routing по вышеперечисленным трем интерфейсам:

Локальный инерфейс поддерживает сеть с IP-номером 127.0.0.1 . Поэтому для машрутизации пакетов с адресом 127.... используется команда :

/sbin/route add -net 127.0.0.1

Если у Вас для связи с локалной сетью используется одна плата Ethernet и все машины находятся в этой сети (сетевая маска 255.255.255.0), то для настройки routing'а достаточно вызвать:

NETMASK=255.255.255.0
/sbin/route add -net ${NETWORK} netmast ${NETMASK}
Если же Вы имеете насколько интерфейсов, то Вам надо определиться с сетевой маской и вызвать команду route для каждого интерфейса.

Настройку routing'а по интерфейсу SLIP/CSLIP производит команда dip, вызывая при установлении связи команды ifconfig и route.

4.3 Настройка nameserver'а

Если Вы не собираетесь заводить поддержку сервиса имен для свой сети (что является довольно сложной организациооной и технической проблемой) и доверяете ведение своих имен Вашему IP-провайдеру, то Вам достаточно указать в файле /etc/resolv.conf адрес nameserver'а вашего провайдера:

nameserver <адрес>
указать в файле /etc/host.conf
order hosts, bind
и описать Ваши локальные машины в файле /etc/hosts. Не забудьте имена Ваших машин, которые должны быть видны из Internet'а по их доменам, передать IP-провайдеру для ведения сервиса имен.

4.4 Настройка зашиты

Защита локальной сети от взлома осуществляется следующими способами:

Screening routing

Данный режим защиты использует возможности ядра Linux блокировать указанные пакеты при их передаче (forwarding) с одного интерфейса на другой. Эти возможности включаются при конфигурации ядра (make config - см.выше) с параметрами:

IP forwarding/gatewaying (CONFIG_IP_FORWARD) [y]
IP firewalling (CONFIG_IP_FIREWALL) [y]

Преимущество данного метода состоит в том, что Вы можете на одной машине (gateway между локальной сетью и Internet'ом) защитить всю локальную сеть, не защищая каждую мащину в отдельности.

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

В 90% случает бывает достаточно закрыть TCP-порты c 1-го по 1024 для запреты доступа к основным TCP-серверам и порты с 5000 по 65535 для запреда доступа с X-серверам, оставив порты 1025-4999 для работы программ-клиентов локальной сети. Если Вы хотите открыть доступ клиентам Internet к Вашим серверам (ftp,http и т п) (предварительно тщательно проверив защиту), то вы можете оставить открытыми соответствующие порты (см. /etc/service).

Все команды защиты Вы можете записать в отдельный командный файл (например /etc/rc.d/rc.firewall) и вызывать его при выходе системы в мультирежим из файла /etc/rc.d.rc.inet1.

Пример файла настройки защиты:

#!/bin/sh

NET=198.223.25
LOCALNET=198.223.25.0

/sbin/ipfwadm -B -f     #сброс блокировок

#Пропускать все пакеты внутри локальной сети
/sbin/ipfwadm -B -a accept -S ${LOCALNET}/24 -D ${LOCALNET}/24

#Задерживать пакеты на TCP-серверы локальной сети сети
/sbin/ipfwadm -B -P tcp -a deny -S 255.255.255.255/0 -D ${LOCALNET}/24 0:1024

#Задерживать пакеты на X-server'ы локальной сети
/sbin/ipfwadm -B -P tcp -a deny -S 255.255.255.255/0 -D ${LOCALNET}/24 5000:64575

# Пакеты с TCP-портов 1025 по 4999 разрешены для доступа из/в Internet
# эти порты используются клиентами (а не серверами) и взлом по ним невозможен


#Задерживать пакеты на UDP-серверы локальной сети
/sbin/ipfwadm -B -P udp -a deny -S 255.255.255.255/0 -D ${LOCALNET}/24 0:1024


#Защита gateway в Internet
GateWayIP=194.126.198.229/32

/sbin/ipfwadm -B -P tcp -a deny -S 255.255.255.255/0 -D ${GateWayIP} 0:20
# оставить окрытыми порты 21-23 - ftp -доступ
/sbin/ipfwadm -B -P tcp -a deny -S 255.255.255.255/0 -D ${GateWayIP} 24:79
# и 80 - http - доступ
/sbin/ipfwadm -B -P tcp -a deny -S 255.255.255.255/0 -D ${GateWayIP} 81:1024
/sbin/ipfwadm -B -P tcp -a deny -S 255.255.255.255/0 -D ${GateWayIP} 5000:64575
/sbin/ipfwadm -B -P udp -a deny -S 255.255.255.255/0 -D ${GateWayIP} 0:1024
# не забудьте максимально защитить ftp и www серверы от возможности взлома


#Зашита машин локальной сети вне Internet'a
#  Запретить локальным машинам с номерами 32-255 доступ к Internet
#машины 32-63
/sbin/ipfwadm -B -a deny -S 255.255.255.255/0 -D ${NET}.32/27
#машины 64-128
/sbin/ipfwadm -B -a deny -S 255.255.255.255/0 -D ${NET}.64/26
#машины 128-255
/sbin/ipfwadm -B -a deny -S 255.255.255.255/0 -D ${NET}.128/25

Выключение серверов на локальным машинах

Для того чтобы полностью закрыть доступ на локальной машине (речь идет о UNIX-машинах) к определенному сервису (например telnetd) достаточно в файле /etc/inetd.conf закомментировать строчку запуска данного сервера. В отличие от защитычерез firewall

Если Вы хотите лишь огранчить доступ к серверу, не выключая его, то Вам надо настроить TCP-wrapper (см. следующий раздел).

Wrapping

В ОС Linux при обращении из сети к TCP-порту суперсервер inetd вызывает не сам сервер, а программу tcpd, передавая ей параметром имя необходимого сервера (см. файл /etc/inetd.conf). Программа tcpd определяет IP-адрес клиента ищет этот адрес для указанного сервиса в файлах /etc/hosts.allow и /etc/hosts.deny. Если адрес найден в файле /etc/hosts.allow - клиенту разрешается доступ к указанному серверу, если же адрес найден в файле /etc/hosts.deny, то клиент не получает доступ к серверу. Например, если Вы хотите открыть доступ на сервер telnetd только с одной машины Вы добавляете в файл /etc/hosts.deny строку:

in.telnetd:ALL EXCEPT 194.128.18.25

5 Заключение

Для более подробного ознакомления Вам следует ознакомиться с документацией через команду:

man <имя_команды>
и документы HOWTO:

LINUX_ETHETNET_HOWTO

LINUX_NET-2/3-HOWTO

FIREWALLING_AND_PROXY_SERVER_HOWTO

THE_LINUX_KERNEL_HOWTO