Наши
Сайдбары
   
IRC-канал
Linuxportal.ru
   
Импорт новостей
 
Вход Быстрая регистрация На главную

Поиск:
 
   БИБЛИОТЕКА
     Другие статьи этого раздела:
 

    Сеть
Другие разделы библиотеки:
   БИБЛИОТЕКА
     последние поступления:
 

Hardware
Перевод Serial-Programming-HOWTO
15.05.2006 | San АНДРЕЕВ
Перевод Linux Power Management Support
03.04.2004 | San АНДРЕЕВ
Варианты решения проблем со смещением геометрии монитора.
10.10.2003 | EsTaF
Multimedia
VideoCD для пингвинов
10.10.2003 | Buddha
Смотрим любимые фильмы с помощью MPlayer
23.07.2003 | Alexey Dmitriev
X-сервер
Включаем Bytecode Interpreter в пакете freetype в некоторых дистрибутивах
05.07.2006 | Alexey Dmitriev
НАСТРОЙКА СЕРВЕРА XDMCP ДЛЯ WINDOWS-КЛИЕНТОВ
09.09.2004 | Kotjara
Type1 и truetype шрифты в LaTeX.
03.05.2004 | geekkoo
Разное
Как самому написать концепцию информационной безопасности
22.03.2007 | Crion
Список рекомендуемой литературы
11.09.2006 | San АНДРЕЕВ
The Multi Router Traffic Grapher
02.06.2004 | Crion
Сеть
"Огненная стена" или строим файрвол на базе iptables
15.03.2005 | Alexey Dmitriev
Защищенная почтовая система
08.09.2004 | Crion
Postfix+Cyrus-SASL
18.12.2003 | geekkoo
Система
Написание драйверов под Linux: рекомендации, типичные ошибки и ловушки.
16.01.2007 | Mr.Nobody
Перевод Linux Daemon HOWTO
21.08.2006 | San АНДРЕЕВ
Усыпляем компьютер
11.01.2006 | San АНДРЕЕВ
   БИБЛИОТЕКА Сеть    
Автор статьи: San АНДРЕЕВ
Дата: 30.07.2003

Linux в качестве шлюза между локальными сетями и Интернет

1. Что для этого нужно и где это взять.
Ядро linux из ветки 2.4 и выше (http://www.kernel.org либо то, что уже есть в вашем дистрибутиве), какой-нибудь текстовый редактор и рутовые права на настраиваемой машине. Предполагается, что вы знаете, что такое сетевые маски и зачем они нужны, классы сетей, порты.

2. Исходные данные.
У нас есть две локальных сети - 192.168.1.0/24 (первая) и 192.168.2.0/24 (вторая), одна реальная - 193.193.1.0/26 (адрес левый, использую только в качестве примера) и небольшая сеть для связи с провайдером через ethernet-модем по выделенному каналу - 195.195.195.192/30 (тоже левый адрес, только для примера).

3. Постановка задачи.
Необходимо части машин из первой сети дать доступ в интернет и во вторую сеть. Вторая сеть доступа в интернет и в первую сеть не имеет. Обе сети должны иметь доступ в реальную сеть (в ней находятся уеб-, фтп- и почтовые серверы организации). Из интернет должен быть доступ в реальную сеть к уеб- и smtp-серверам.

4. Небольшое теоретическое отступление.
Существует два вида сетевых адресов - реальные и приватные (серые, фиктивные). Реальные адреса - это адреса, которые полноценно маршрутизируются в интернет, выдаются провайдером и регистрируются в соответствующих организациях. Для приватных адресов выделено по блоку в каждом классе сетей :
10.0.0.0 - 10.255.255.255 (класс А)
172.16.0.0 - 172.31.255.255 (класс B)
192.168.0.0 - 192.168.255.255 (класс C)
Адреса из этих сетей нигде не регистрируются и пакеты с такими адресами отправителя или получателя просто уничтожаются, т.е предназначены специально для внутрифирменного использования. Для того, чтобы все-таки позволить узлам с такими адресами выходить в интернет, используется такая технология как NAT (Network Address Translation - трансляция сетевых адресов) или ее частный случай - Masquerading (маскарадинг, подмена). Обычно эту технологию выполняет машина, соединяющая локальную сеть и интернет. Использование NAT очень удобно совместить с какими-нибудь средствами фильтрации траффика, например с фильтром пакетов на основании информации, содержащейся в их заголовках (IP адреса отправителя/получателя, порты) - это можно настроить при помощи соответствующих программ, в частности iptables. iptables - это не какой-то демон, постоянно находящийся в памяти и перехватывающий траффик. Все функции NAT и пакетной фильтрации реализованы в ядре и iptables лишь средство управления ими. В ядрах из ветки 2.2 подобный функционал не настолько развит и для управления им используется программа ipchains. В ядрах 2.0 это, кажется, программа ipfwadm, но тут я уже не в курсе. В данном случае это не очень важно, потому как главное - принципы, а они изменились не сильно.

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

Правило состоит из двух частей: условия и действия.
Возможны следующие действия:
- уничтожение пакета с уведомлением/без уведомления;
- передача пакета в другую таблицу/цепочку;
- подмена адресов отправителя/получателя;
- подмена номеров портов отправителя/получателя;
- фиксация пакета/информации о нем в журнале.
Условие состоит из одного или нескольких параметров:
- адреса отправителя/получателя;
- сети отправителя/получателя;
- номера порта отправителя/получателя;
- типа пакета (опционально) - SYN, FIN и т.д.;
- протокола не выше сеансового уровня - tcp, udp, icmp, etc.
Конкретные способы задания правил при помощи конкретных программ можно узнать из соответствующих мануалов и руководств (их можно найти и через поисковые машины), но небольшой пример для iptables будет приведен ниже.

6. Маршрутизация.
Маршрутизация - это то, что делают с пакетом маршрутизаторы при путешествии этого пакета по сети. Другими словами - это процесс выбора пути для передачи пакета дальше к получателю и отправка его по этому пути. Это отдельная большая тема, особенно если принять во внимание маршрутизацию внутри автономных систем, но нас сейчас это не интересует. Нам достаточно знать, что есть какой-то маршрутизатор, который знает все за пределами нашей сети. Обычно это маршрутизатор провайдера и обзывается он обычно default gateway. На нашем шлюзе надо обязательно указать его, иначе это будет одной из причин, по которой мы в интернет не попадем.

7. Система доменных имен.
DNS (Domain Name Sytem) - это система отображения IP-адресов сетевых узлов на их символьные имена и наоборот. Это также и БД, которая содержит информацию об этом отображении, т.е. в которой хранятся пары значений имя-адрес для так называемых "прямых зон" и адрес-имя для "обратных зон". Эта БД распределенная и имеет иерархическую структуру, т.е. каждый сервер DNS обслуживает только свою группу отображений (зону), знает о серверах, обслуживающих подзоны и о сервере(ах) надзоны, т.е. сервере(ах) более высокого чем он сам уровня. Серверы самого верхнего уровня называются корневыми, обслуживают корень всей DNS и знают о своих подзонах - .com, .ru, .edu, .net и т.д. Нам достаточно знать IP-адрес только сервера надзоны - обычно это DNS-сервер провайдера, у этого сервера мы будем спрашивать все, что нам неизвестно, т.е. информацию об узлах и сетях, не имеющих отношения к нашей сети.

8. Предварительное резюме.
От провайдера необходимо получить как минимум:
- адрес и маску сети для связи с ним;
- адрес маршрутизатора по умолчанию (он будет принадлежать сети, указанной в предыдущем пункте);
- адрес сервера DNS.

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

9. Строим шлюз.
(здесь не описывается установка сетевых плат и какого-либо железа вообще; предполагается, что все установлено и настроено; здесь также не описывается конфигурирование и сборка ядра)
Вспоминаем п.3. Для этих целей лучше использовать по сетевой плате на каждую сеть, т.е. в компьютере должно присутствовать четыре сетевых платы. Три из них подключаем к хабу/свичу каждой из сетей, четвертую - к ethernet-модему.
При помощи команды ifconfig (man ifconfig если необходимо) присваиваем сетевым платам соответствующие адреса и маски. Предположим следующее:
eth0 - 192.168.1.1/255.255.255.0
eth1 - 192.168.2.1/255.255.255.0
eth2 - 193.193.1.1/255.255.255.192
eth3 - 195.195.195.193/255.255.255.252

уеб-сервер организации - 193.193.1.2
почтовый сервер организации - 193.193.1.3
фтп-сервер организации - 193.193.1.4

При помощи команды route (man route) добавляем default gateway (в нашем случае - 195.195.195.194, т.к. адрес этой сети - 195.195.195.192, по маске в ней может быть только четыре адреса, а последний адрес в сети - 195.195.195.195 - обычно используется как широковещательный). В файл /etc/resolv.conf прописываем DNS-сервер провайдера в виде такой строки:

nameserver xxx.xxx.xxx.xxx

При помощи команды

# cat /proc/sys/net/ipv4/ip_forward

проверяем способность ядра нашего шлюза маршрутизировать траффик между сетями. Если результатом работы команды будет "1", то все нормально. Если "0", то надо скомандновать такую вещь:

# echo 1 > /proc/sys/net/ipv4/ip_forward

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

# iptables -L

Если в выводе встретится фраза наподобие "Perhabs iptables or your kernel needs to be upgraded", это означает, что ваше ядро собрано без поддержки NAT и пакетного фильтра. Совет тот же, что и в предыдущем случае - либо ядро есть в дистрибутиве, либо имеющееся придется пересобрать.
Дальше создаем файл, который будет содержать команды конфигурирования NAT и фильтра. Назвать его можно как угодно, пусть это будет iptables.conf. Вставляем такие строки:

#!/bin/bash

# всякий раз очищаем все цепочки правил в используемых таблицах
iptables -F INPUT
iptables -F FORWARD
iptables -F OUTPUT
iptables -t nat -F POSTROUTING

# устанавливаем правила (политики) по умолчанию
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

# разрешаем всем доступ на уеб-сервер
iptables -A FORWARD -d 193.193.1.2 -p tcp --dport 80 -j ACCEPT
# запрещаем все остальное на уеб-сервер кроме icmp (пинги, traceroute и все такое)
iptables -A FORWARD -d 193.193.1.2 -p ! icmp -j DROP

# разрешаем всем доступ на почту по smtp
iptables -A FORWARD -d 193.193.1.3 -p tcp --dport 25 -j ACCEPT
#разрешаем локалкам забирать почту по POP3
iptables -A FORWARD -s 192.168.1.0/24 -d 193.193.1.3 -p tcp --dport 110 -j ACCEPT
iptables -A FORWARD -s 192.168.2.0/24 -d 193.193.1.3 -p tcp --dport 110 -j ACCEPT
# запрещаем все остальное на почту кроме icmp (пинги, traceroute и все такое)
iptables -A FORWARD -d 193.193.1.3 -p ! icmp -j DROP

# разрешаем локалкам доступ на фтп-сервер организации
iptables -A FORWARD -s 192.168.1.0/24 -d 193.193.1.4 -p tcp --dport 20 -j ACCEPT
iptables -A FORWARD -s 192.168.1.0/24 -d 193.193.1.4 -p tcp --dport 21 -j ACCEPT
iptables -A FORWARD -s 192.168.2.0/24 -d 193.193.1.4 -p tcp --dport 20 -j ACCEPT
iptables -A FORWARD -s 192.168.2.0/24 -d 193.193.1.4 -p tcp --dport 21 -j ACCEPT
# запрещаем все остальное на фтп кроме icmp (пинги, traceroute и все такое)
iptables -A FORWARD -d 193.193.1.4 -p ! icmp -j DROP

# машинам с адресами .1.1, .1.2 и .1.3 можно ходить во вторую сеть
# соответственно и они будут доступны из второй сети
iptables -A FORWARD -s 192.168.1.1 -d 192.168.2.0/24 -j ACCEPT
iptables -A FORWARD -s 192.168.2.0/24 -d 192.168.1.1 -j ACCEPT
iptables -A FORWARD -s 192.168.1.2 -d 192.168.2.0/24 -j ACCEPT
iptables -A FORWARD -s 192.168.2.0/24 -d 192.168.1.2 -j ACCEPT
iptables -A FORWARD -s 192.168.1.3 -d 192.168.2.0/24 -j ACCEPT
iptables -A FORWARD -s 192.168.2.0/24 -d 192.168.1.3 -j ACCEPT
# всей остальной первой сети ходить во вторую нельзя
iptables -A FORWARD -s 192.168.1.0/24 -d 192.168.2.0/24 -j DROP
# всей остальной второй сети ходить в первую нельзя
iptables -A FORWARD -s 192.168.2.0/24 -d 192.168.1.0/24 -j DROP

# этим же машинам можно ходить в интернет
# но нам не надо, что они маскарадились и при заходе в нашу реальную сеть
iptables -t nat -A POSTROUTING -s 192.168.1.1 -d ! 1.1.1.0/192 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 192.168.1.2 -d ! 1.1.1.0/192 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 192.168.1.3 -d ! 1.1.1.0/192 -j MASQUERADE


Описание iptables имеется здесь -
Ну и на всех машинах организации этот шлюз надо указать как шлюз по умолчанию. Если на этом же шлюзе будет заведен свой DNS-сервер, то его тоже надо будет указать. Если предполагается работа с DNS-сервером провайдера, то прописать надо будет именно его, а не наш шлюз.
Потом надо дать этому скрипту права на выполнение и прописать его куда-нибудь, что запускало бы его при каждом старте.

10. ВАЖНО.
Не используйте этот пример в реальной работе. НИ В КОЕМ СЛУЧАЕ. Это всего лишь пример, иллюстрация. Его можно взять за основу, но настоятельно рекомендуется доработать. В этом примере предполагается, что на самом шлюзе не запущено вообще никаких сетевых служб, т.е. вывод команды netstat -antpu пуст. Это хорошо и к этому надо стремиться, но это не всегда возможно (в силу разных причин). Здесь также для цепочек указана политика по умолчанию ACCEPT, что тоже не всегда хорошо (в данном случае это позволяет любому, а не только доверенным узлам из локалки, использовать этот шлюз в качестве шлюза по умолчанию), хотя и значительно упрощает настройку. По-хорошему политику надо ставить в DROP и прописывать отдельные правила для приема icmp и DNS траффика (как минимум). Ну и наверняка еще есть что-то, что я просто упустил из виду.

11. Автор.
San АНДРЕЕВ

12. Замечания.
По примеру - ezhikov.



Все статьи раздела "Сеть"

©"Linuxportal.Ru". Материалы сайта можно
использовать свободно при условии
сохранения этой свободы при дальнейшем
распространении, если явно не указано иное

Дизайн и программирование:

Поставьте
нашу кнопку:
Получить код кнопки
Linux Portal.ru ::: Линукс Портал.ру
Наш партнер: