22 March 2002 Marat "Billy" Bilialov, d e v e l @ s o c k e t . r u
Оригинал: ns1.socket.ru/

1. Зачем и почему.
2. Как и что.
2.1. Железо.
2.2. ОС: ядро и модули
2.3. VLAN и патчи
2.4. iptables, dhcp, dns & squid
2.5. cbq
2.6. ipac-ng
3. Собственно настройки!
3.1. Коммутаторы
3.2. Программное обеспечение
4. Ссылки.


1. Зачем и почему.
Как правило, устройства, разграничивающие доступ к IP-ресурсам, достаточно дороги (безумно дороги, подсказывают мне) и конфигурация их - дело опытного администратора, что делает проблему постройки недорогого Интернет-узла с нуля практически неразрешимой для людей, впервые с ней столкнувшихся.
Здесь изложен опыт постройки узла доступа к Интернет для офисного центра (максимум 254 локальные сети), с разной пропускной способностью каналов, защитой подсетей друг от друга и маскарадингом. Физический носитель - ethernet. Узел функционально не уступает аналогам, построенным на платформе Cisco, но обошелся где-то в 15 раз дешевле, благодаря отсутствию дорогостоящего промежуточного маршрутизирующего оборудования.

2. Как и что.
Узел состоит из двух одинаковой конфигурации машин под управлением linux. Я выбрал дистрибутив redhat 7.1 из-за проблем с железом у redhat 7.2 и mandrake 8.1. Ядро 2.4.18, последнее на время написания сего документа (22 марта 2002). Сеть построена на коммутаторах 3com 3300xm, которые я выбрал как недорогие и корректно поддерживающие стандарт 802.1q. Альтернативой могут служить коммутаторы от Intel или Cisco, в зависимости от финансовых возможностей читателя.

2.1. Железо.
Из-за растущего числа клиентских станций, которое должно скоро перевалить за тысячу, я собрал достаточно мощные на сегодня серверы. Из соображений горячей замены оба они имеют одинаковую конфигурацию и, в случае смерти одного сервера, диски из него можно оперативно перебросить в другой. Каждый сервер имеет возможность горячей замены не только всех дисков, но и блоков питания и даже процессоров. Идеально было бы иметь запасную, третью машину такой же конфигурации, для абсолютной неистребимости узла :) Итак:

Здесь мы остановимся на установке одного из них, собственно маршрутизатора. На другом установлены почтовый, web- и news-сервера, базы данных и так далее.

2.2. Ядро.
Я предпочитаю монолитное ядро, хотя существует мнение, что модульная конфигурация гибче; так или иначе, в опции ядра надо включить поддержку имеющихся сетевых карт, vlan, packet filtering, class based queueing и выключить все ненужное. Для тех, кто еще не собирал ядро, магические команды:
cd /usr/src # Если в /usr/src/linux что-то уже есть, стОит это сохранить куда-либо еще
ftp ftp.kernel.org # Взять последнюю версию ядра и выйти из ftp
tar xvzf linux-x.y.z.tar.gz # Распаковать ядро в /usr/src/linux
cd linux
make menuconfig # Вы не поверите, как всё просто настраивается

После этого шага ядро готово к компиляции и сборке. Если есть необходимость сделать патч(и), надо делать это сейчас. И, наконец,

make dep bzImage modules modules_install # Собрать всё и установить модули

Далее нужно скопировать готовое ядро из /usr/src/linux/arch/i386/boot в /boot и добавить его в lilo:
cp /usr/src/linux/arch/i386/boot/bzImage /boot/vmlinuz-x.y.z
vi lilo.conf # отредактировать конфиг загрузчика, добавив новое ядро
lilo # уведомить об этом загрузчик
reboot -n # перезагрузить машину и выбрать новое ядро в меню

Это несколько сложнее, чем просто сказать make install , но гораздо менее опасно в случае, если в ядре что-то не так и грузиться оно не пожелает.

2.3. VLAN и патчи
Так как в ядре начиная с 2.4.14 включена опция поддержки vlan, я использовал пакет vlan-1.5 от Ben Greear, который де-факто является стандартом для linux. Он включает в себя исходники программы vconfig, которая нам понадобится, и патчи для ядер до 2.4.14, которые к более свежим ядрам применять не нужно.
Однако многие драйверы сетевых карт все же нуждаются в доработке. Дело в том, что заголовок сетевого пакета для работы с виртуальными сетями модифицируется и становится больше, что в стандартных драйверах не поддерживается. Поэтому рекомендую зайти сюда и поискать свою карту. Если патч для нее есть, нужно отредактировать исходник драйвера до сборки ядра/модулей. Например, драйвер Intel EtherExpress Pro100, которая установлена у меня на мамке, следует модифицировать так:
const char i82557_config_cmd[22] = {
22, 0x08, 0, 0, 0, 0x80, 0x32, 0x03, 1, /* 1=Use MII 0=Use AUI */
0, 0x2E, 0, 0x60, 0,
- 0xf2, 0x48, 0, 0x40, 0xf2, 0x80, /* 0x40=Force full-duplex */
+ 0xf2, 0x48, 0, 0x40, 0xfa, 0x80, /* 0x40=Force full-duplex */
0x3f, 0x05, };
const char i82558_config_cmd[22] = {
22, 0x08, 0, 1, 0, 0x80, 0x22, 0x03, 1, /* 1=Use MII 0=Use AUI */
0, 0x2E, 0, 0x60, 0x08, 0x88,
- 0x68, 0, 0x40, 0xf2, 0xBD, /* 0xBD->0xFD=Force full-duplex */
+ 0x68, 0, 0x40, 0xfa, 0xBD, /* 0xBD->0xFD=Force full-duplex */
0x31, 0x05, };
где "-" означает имеющуюся строку, а "+" - модифицированную.

Собрав работоспособное ядро, следует собрать пакет vlan:
cd /usr/src/vlan # я надеюсь, вы уже скачали и распаковали пакет
make # собрать

Если компилятор не находит файлы хидеров, надо в файле MakeInclude переправить переменную HOME на /usr/src .
cp vconfig /usr/local/sbin # скопировать программу куда следует

Для проверки работоспособности рекомендую запустить /usr/src/vlan/vlan_test.pl .

2.4. iptables, dhcp, dns и squid
Пакеты iptables, dhcpd, bind и squid обычно включены в дистрибутив linux и устанавливаются по умолчанию. Если при установке linux это не было сделано, их можно установить из RPM-пакетов, найдя самые свежие на http://www.rpmfind.net/, или собрав из исходников.

2.5. cbq
CBQ (Class-based Queueing) - мощная система приоритизации и фильтрации пакетов, введенная в ядро linux начиная с версии 2.4. Одним из ее применений является ограничение пропускной способности того или иного интерфейса по различным критериям. Так как мы уже включили поддержку CBQ в ядро, нам достаточно скачать и установить пакет iproute2 версии 2.2.4 или свежее. Затем найти в Сети наиболее свежую версию скрипта cbq.init и засунуть ее в /etc/rc.d/init.d/

2.6. ipac-ng
Это пакет российских авторов, базирующийся на более старом проекте ipac. Он позволяет собирать статистику по входящему и исходящему трафику и даже создавать картинки с наглядными графиками использования канала. Самую свежую версию можно взять на http://sf.net/projects/ipac-ng. Я рекомендую конфигурировать его без поддержки PostgreSQL, так как эта часть выглядит достаточно сырой. К тому же, если у вас менее 500 клиентов, необходимость в скоростном SQL-сервере для статистики вообще вызывает сомнения.

3. Собственно настройки
Итак, всё собрано. Для примера структуры сети привожу картинку своей сетки полугодовой давности. Коммутаторы находятся в разных зданиях и соединены оптикой через конверторы.

Из схемы видно, что географическое расположение клиентских ЛВС не влияет на физическую топологию сети. Даже с переездом клиента в противоположный угол территории офисного центра максимальный объем переделок сводится к перенастройке двух портов коммутаторов.

3.1. Коммутаторы.
Так как я работаю с оборудованием от 3com, приведенная здесь информация наверняка будет бесполезной для владельцев оборудования других фирм, хотя я не исключаю и совпадений. Буду рад услышать о результатах ваших опытов - пишите!
Узкое место 3com-овской реализации протокола 802.1q заключается в том, что каждый коммутатор поддерживает не более 16 виртуальных сетей. При соединении коммутаторов в стек или через локальную сеть это ограничение не снимается, и создается впечатление (поддерживаемое весьма некстати даже консультантами 3com!), что, невзирая на масштаб сети, ее нельзя разделить больше чем на 16 vlan без применения промежуточных CoreBuilder'ов или иных аппаратных маршрутизаторов, которые, во-первых, сильно недешевы, во-вторых, нуждаются в настройке и, наконец, в-третьих, вносят дополнительные задержки. На первых порах это чуть не вынудило меня искать более дорогой брэнд, но оказалось, что это препятствие можно-таки обойти. Это и есть основное ноу-хау предлагаемого документа.
Для начала коммутаторам надо присвоить IP-адреса и включить на каждом web-интерфейс для упрощения и визуализации процесса настройки. Это делается через консольный порт, который достаточно соединить с COM-портом вашей машины и, запустив терминалку типа HyperTrm, выйти в командный промпт коммутатора. Заодно можно залить свежую прошивку, скачав ее на сайте 3com. После присвоения IP-адреса, зайдите браузером на коммутатор и установите пароли, контакты и прочую информацию.
Далее, следует отключить автораспознавание vlan (VLAN Learning = OFF) на всех устройствах, во избежание автоматического засорения 16-ячеечного списка ненужными подсетями. После этого на коммутаторе можно создавать нужные подсети.
Из соображений наглядности я присваиваю подсетям тэги (номера), совпадающие с предпоследним числом маскарадного IP-адреса локальной сети, например,
сеть 192.168.2.0 находится в vlan2
сеть 192.168.3.0 находится в vlan3
сеть 192.168.4.0 находится в vlan4
и так далее. vlan1 зарезервирована как сеть по умолчанию, и все коммутаторы могут управляться только через порты, находящиеся в этой подсети. Таким образом сеть 192.168.1.0 выпадает из автоматической раздачи, поэтому я расположил в ней сами коммутаторы и рабочие станции своего офиса.
Настраиваем Sw1. В нем находятся сети 2, 3, 5 и 12 Создаем на Sw1 четыре vlan: client2, client3, client5 и client12, c тэгами 2, 3, 5 и 12 соответственно (меню Configuration->VLANs). Порт 1, к которому подключена сеть 192.168.2.0, перемещаем из vlan1-Default в vlan2-client2. Порты 2 и 3, к которому подключена сеть 192.168.3.0, перемещаем из vlan1-Default в vlan3-client3. Порт 4, к которому подключена сеть 192.168.5.0, перемещаем из vlan1-Default в vlan4-client5. Порт 12, к которому подключена сеть 192.168.12.0, перемещаем из vlan1-Default в vlan5-client12 (меню Device).
Порт 24, который через Sw2 идет на маршрутизатор, мы оставляем в vlan1 (это важно), но добавляем его и в vlan2-client2...vlan5-client12 с помощью 802.1q Tagging (меню Configuration->VLANs).
Настраиваем Sw2. Для vlan2-client4, vlan3-client6, vlan3-client7, vlan4-client9 процесс настройки тот же, что и для Sw1/Sw3, но кроме клиентских локалок, в него включен Sw1, потому vlan-тэги через порты 23 и 24 нужно пропускать нетронутыми. Для этого на портах 23 и 24 включается опция Forward unknown VLAN tags = ON. (Замечу в скобках, что ее можно включить для всех портов в главном меню устройства, но из соображений безопасности лучше этого не делать.)
Настройка Sw3 полностью аналогична настройке Sw1.
Для Sw0 настройка та же, что для Sw2, только опция Forward unknown VLAN tags должна быть включена еще и для 22-го порта, в котором сидит Sw3.
Таким образом мы имеем до 253 локальных сетей, полностью изолированных друг от друга (и даже, если угодно, распределенных по территории), но имеющих выход на маршрутизатор! Этого количества достаточно даже для крупного офисного центра или кампуса. Понятно, что цифру можно удвоить, установив еще одну сетевую карту в маршрутизатор или просто изменив порядок нумерации подсетей (всего их можно устроить аж 4094 штуки на интерфейс). Единственным пенальти может явиться необходимость настройки клиентского коммутатора, если он понимает 802.1q, дабы клиент не смог случайно или умышленно залезть в чужие локалки.

3.2. Программное обеспечение.
Удобнее всего создать несколько init-скриптов, которые при загрузке машины автоматически поставят все на место. Привожу примеры своих, с комментариями.
/etc/rc.d/init.d/vlan - этот скрипт создает виртуальные подсети согласно идентификаторам, указанным в файле конфигурации /etc/sysconfig/vlans, а также вызывает два следующих скрипта.
/etc/rc.d/init.d/iptables - создает правила для новых подсетей.
/etc/rc.d/init.d/dhcpd - выделяет IP-адреса станциям новых подсетей.

Следующие скрипты мною переделаны не были:
/etc/rc.d/init.d/cbq; /etc/sysconfig/cbq/cbq0002.example
/etc/rc.d/init.d/named
/etc/rc.d/init.d/squid

Для веб-доступа к статистике целесообразно поставить Apache-SSL и набросать скрипт вроде этого:
/var/www/cgi-bin/stat.pl

или, в зависимости от фантазии и времени, соорудить целую биллинговую систему.

4. Ссылки.
http://www.linux.org.ru/

http://www.kernel.org/
http://www.linuxdoc.org/HOWTO/Kernel-HOWTO.html

http://scry.wanfear.com/~greear/vlan.html
http://standards.ieee.org/reading/ieee/std/lanman/802.1Q-1998.pdf

http://www.iptables.org/

ftp://ftp.equinox.gu.net/pub/linux/cbq/
http://www.linuxdoc.org/HOWTO/Adv-Routing-HOWTO.html

http://www.isc.org/products/BIND/
http://www.linuxdoc.org/HOWTO/DNS-HOWTO.html

http://www.isc.org/products/DHCP/

http://www.squid-cache.org/

http://sf.net/projects/ipac-ng



Вроде все. Пишите! d e v e l @ s o c k e t . r u

Удачи,
Марат "Billy" Билялов, the very Admin ;)