FreeBSD. Простой сервер доступа с NAT. Часть 1.
Введение
Никому не объять необъятного
Козьма Прутков.
Данный цикл статей не претендует на абсолютную истину, и не охватит весь круг проблемм, которые могут возникнуть и вас при эксплуатации Вашей сети, и Вашего сервера в частности. Цель данной цикла - помочь “чайнику” сделать первые шаги на пути к почетному званию “гуру”, и помочь построить свой первый сервер доступа в сеть Интернет на основе замечательной, надежной и производительной операционной системы FreeBSD. Надеюсь, Вы полюбите эту операционную систему так же, как я, и даже немножко сильнее.
При написании данной статьи был использован однодисковый дистрибутив FreeBSD 4.2. Почему именно этой версии? Ну…во-первых, эта версия еще помещается на одном компакт-диске вместе со всеми теми дополнительными программами, которые могут нам понадобиться. На первом диске FreeBSD 4.4, например, уже не поместился сервер баз данных mySQL, а он нам в дальнейшем понадобится. Во-вторых, именно на этой версии работают несколько моих серверов, и он мне наиболее привычен.
Почему я не использовал FreeBSD 5.0? На момент написания этого текста пятая версия все еще находится в разработке и недостаточно отлажена. Появится стабильная версия - изучим.
Где достать дистрибутив FreeBSD? Можно купить самый свежий на рынке - и это не будет пиратством, т.к. FreeBSD распостраняется свободно. Можно скачать дистрибутив из Интернет, например, с ftp.gamma.ru, как полный дистрибутив в виде образов компакт-дисков, так и в виде нескольких дискет… да-да, минимум, необходимый для установки FreeBSD - это несколько дискет и подключение к Интернет - FreeBSD умеет доставать необходимые ей запчасти напрямую с FTP-серверов непосредственно на этапе инсталляции. Есть еще один промежуточный вариант - скачать образ компакт-диска мини-дистрибутива. Размер образа для версии 4.7 - меньше 200 мегабайт. На мини-дистрибутиве имеются все основные службы FreeBSD и исходные коды операционной системы. Этого диска вполне достаточно для установки простого сервера доступа (материал первой части проверялся и на таком дистрибутиве, без установки дополнительных программ).
Данный цикл рассчитан на пользователей, уже знакомых с компьютерами и сетями, пусть и на начальном уровне. Предполагается, что читатель не пугается при виде командной строки, и знаком с системой адресации протокола TCP/IP. Текст дан в сжатом изложении, рассчитаном на человека, уже имевшего дела с какой-нибудь разновидностью UNIX. Если Вам что-либо не понятно - поробуйте посмотреть комментарии, ссылки на которые даны непосредственно в тексте. В комментариях даны более детальные описания и пошаговые инструкции. Думаю, что хотябы один комментарий Вам прочитать придется - иначе Вы не читали бы эту статью… разве что Вы - критик :)
К сожалению, рассказать все в рамках небольшой статьи невозможно, поэтому рекомендую так-же почитать handbook для углубления своих знаний.
Простой сервер доступа с NAT
В этой главе мы попытемся превратить Ваш компьютер в простой сервер под управлением операционной системы FreeBSD и дать доступ в Интернет небольшой локальной сети. Предполагается, что в Вашем компьютере установлены две сетевые карты, одна из которых имеет реальный адрес сети интернет (далее будет использоваться 193.232.100.100), вторая подключена к локальной сети, и имеет адрес 192.168.0.1. В моем компьютере первая сетевая карта - RTL 8139, вторая 3Com905. В системе FreeBSD эти сетевые карты доступны как устройства rl0 и xl0.
В отличии от операционных систем семейства Windows, в FreeBSD устройства называются не своими полными именами, типа 3Com Fast Ethernet Adapter, а сокращенным двух-трех-буквенным именем и порядковым номером. Однако, не так все страшно - все идентификаторы, присваевыемые устройствам Вы можете узнать, если внимательно просмотрите тот ураган текста, который проскакивает по вашему экрану в процессе загрузки (просмотреть его можно командой dmesg | less). В этом тексте в явном виде присутствуют названия устройств и сопоставленные им имена. Если Ваша сетевая карта не поддерживается стандартным (GENERIC) ядром FreeBSD, то Вы можете поискать ее описание в файле /usr/src/sys/i386/conf/LINT, и, если обнаружите ее там - включить нужные строчки в ядро, которое мы будем создавать для себя сами немного ниже по тексту. Способы установки сетевой карты, не указанной в файле LINT выходят за рамки данного цикла статей. |
Итак, поехали. Для начала нам необходимо установить операционную систему FreeBSD со следующими компонентами: bin (а куда-же без него), compat 3.X и compat 4.X (чтобы иметь возможность запускать программы, написаные для более старых версий FreeBSD) и исходные коды ядра.
Процесс установки При загрузке с компакт-диска по Вашему экрану пролетит несколько страниц текста - его читать не обязательно: это отчет FreeBSD обо всем ооборудовании, которое ей удалось обнаружить на Вашем компьютере. Через минуту на экране появится текстовое меню, озаглавленное Kernel Configuration menu, которое Вы можете с чистой совестью пропустить, выбрав первый пункт - Skip Kernel configuration… После этого меню Вы, наконец, попадете в меню программы sysinstall, с которой нам придется плотно поработать. Окно программы sysinstall представляет собой меню, в котором можно выбрать тип установки. Мы (как будущие гуру) откажемся от предлагаемых нам типовой и экспресс-установки, и выберем пункт меню Custom - зачем нам ставить лишнее, а потом убедиться, что по умолчанию не установлено что-нибудь нужное (хотя недостающие компоненты всегда можно доставить потом). Выбрав тип установки Custom, попадаем в следующее меню, озаглавленное “Choose Custom Installation Options”. Первым делом нам нужно подготовить жесткий диск для установки - т.е. создать на диске раздел и файловые системы для FreeBSD. Сначала нужно выбрать пункт Partition. Появится меню (на этот раз черного цвета), в котором мы удалим имеющиеся разделы на жестком диске (стрелками и клавишей D), после чего “заберем” весь диск под FreeBSD, нажав клавишу A, или создав раздел клавишей C (FreeBSD может сосуществовать на одном диске с другими операционными системами, но эта тема не рассматривается в данном цикле статей. Предполагается, что сервер будет только сервером). Для возврата в меню Custom нажмите клавишу Q. Вам будет задан вопрос о типе основной загрузочной записи (MBR), которую мы хотим использовать - я ставлю BootMgr, но вы можете использовать и Standart. После создания раздела необходимо создать на нем файловые системы, для чего мы воспользуемся пунктом меню Label. Мы опять попадаем в черное меню, поразительно похожее на предыдущее, но с немного другой функциональностью. Для начала, создадим раздел подкачки (если Вы знакомы с Windiows не первый день, то знаете, что в Windiows используется файл подкачки для решения проблем с нехваткой оперативной памяти. В системе FreeBSD для подкачки используется отдельный раздел - это гарантирует более высокую скорость доступа, но заставляет задуматься о размере раздела подкачки заранее. Для компьютеров с объемом оперативной памяти меньше или равным 64 Mb я обычно использую раздел подкачки размером, равным удвоенному объему оперативной памяти. На компьютерах с оперативной памятью 128 и больше мегабайт я устанавливаю размер файла подкачки равным объему оперативной памяти плюс 32 мегабайта. Эти рекомендации не являются истиной в последней инстанции, однако пока они работают). Для создания раздела подкачки нажмите клавишу С, в появившемся окне введите размер раздела (для создания раздела в 160 мегабайт введите 160M, для раздела в 5 гигабайт - 5G). Появится меню с выбором типа раздела - файловая система (FS) или раздел подкачки (SWAP). Нам, естественно, нужно выбрать SWAP. В списке разделов теперь вы видите строку, соответствующую созданному Вами разделу подкачки. Теперь создадим файловые системы. Процесс создания файловой системы аналогичен созданию раздела подкачки, только после выбора типа раздела “Файловая система” (FS), вам будет предложено задать точку монтирования (подробнее - см. комментарий о файловых системах). После создания файловых систем необходимо указать набор необходимых компонентов операционной системы. Для этого в меню Custom выбираем пункт Distributions, и в нем тоже выбираем Custom (последний пункт). В появившемся списке с помощью клавиш управления курсором и пробела нужно расставить “крестики” на строчках bin(основные программы операционной системы. Без них даже не пошевелишься), compat 3.X и compat 4.X, если эти строчки присутствуют (совместимость на уровне исполняемого кода для программ, написаных для старых версий FreeBSD), crypto - базовые средства шифрования, man - справочная системы по командам операционной системы, src - исходные коды операционной системы. Попытка поставить “крестик” на пункт src приведет к появлению еще одного меню, в котором необходимо пометить строки base, include и sys. Теперь все необходимые параметры устаноки заданы, нам нужно вернуться в меню “Choose Custom Installation Options” и выбрать пункт Commit - принять все изменения. Появится меню, в котором Вас попросят указать, с какого носителя информации вы желаете произвести установку. В рассматриваемом случае это первая строчка - CD-ROM, но если Вы лишены последнего, то можете попытаться провести установку непосредственно из сети Интернет или с раздела FAT на жестком диске (естественно, его надо предварительно создать и записать на него дистрибутив). В зависимости от производительности Вашего компьютера Вам обеспечено от нескольких минут до получаса ожидания… но это все-равно быстрее, чем установка Windows 98 на тот же компьютер :) После томительных минут ожидания :) будет предложено ответить на вопрос “Visit the general configuration menu for a chance to set last options” - “Не хотите ли вы посетить конфигурационное меню для того, чтобы еще немного поконфигурировать вашу систему”. Ответим “Да”, и в меню Configure->Networking->Interfaces выдадим IP-адреса нашим сетевам картам. Заодно и увидим, опознала их FreeBSD самостоятельно, или нет. Что такое IP-адрес и маска подсети рассказывать не буду (если Вы этого не знаете, то, очевидно, Вам нужно начинать изучение и другого места). Посоветую лишь не соглашаться на использование протокола IPv6, и не назначать адрес шлюза по умолчанию (Default Gateway) для сетевой карты, к которой подключена локальная сеть. О настройках “внешней” сетевой карты Вам лучше проконсультироваться у Вашего провайдера - это Вам может сказать только он. Все. Выходите из всех меню и соглашайтесь на перезагрузку (не забудьте удалить CD-ROM из привода или подкорректировать настройки BIOS). Ваша новая операционная система должна загрузиться (выдав несколько страниц текста), и выдать вам предложение login:. В ответ на это приглашение введите словоroot (это предопределенное имя самого главного пользователя в системе). Система Вас поприветствует еще одной страницей текста, и выдаст приглашение #. Это интерфейс командной строки, с которым Вам, в основном, и придется работать. Первой вашей командой должна стать команда passwd, с помощью которой Вы поменяете Ваш пароль (в данный момент пустой) на новый. Чтобы выключить компьютер введите команду halt. FreeBSD выдаст несколько строк, и через минуту предложит нажать любую клавишу для перезагрузки. Выключить питание компьютера можно только после появления этого приглашения. |
Для установки будет вполне достаточного жесткого диска объемом 1Gb (или даже меньше). Файловые системы я создал следующим образом: SWAP-160 Mb, / - 100Mb, /usr - 256Mb, /var - 400 Mb (будет использовано в следующих главах), /tmp - 75 Mb. Впрочем, Вы вольны поступать со своим жестким диском как угодно - вплоть до выделения всего объема файловой системе / - если Вы знаете, что делаете. Если у Вас диск большего объема, то рекомендую отдать под /var до гигабайта пространства, а остальное оставить пока нетронутым для последующего использования, например, под FTP-сервер или каталоги пользователей. /usr тоже можно дорастить до гигабайта, чтобы потом не мучиться с нехваткой места.
Файловая система FreeBSD Подробнее о работе с файловыми системами Вы можете узнать введя команду man mount (естественно, после того, как установите FreeBSD), а так-же из “Библии FreeBSD” - handbook. |
FreeBSD устанавливается с ядром GENERIC, в которое не включены необходимые нам функции, позтому нам придется собрать новое ядро под наши нужды.
В отличие от операционных систем семейства Windows, ядро которых всегда неизменно (в пределах одной версии, конечно), а поддержка дополнительного оборудования реализована в виде внешних модулей, ядро FreeBSD может быть самостоятельно изменено пользователем под собственные нужды. Такая архитектура позволяет увеличить быстродействие операционной системы в целом:
Естественно, у такой архитектуры есть и свои минусы. Например, чтобы добавить новую сетевую карту к системе может понадобиться собрать новое ядро… но, в конце концов, я тут FreeBSD не ругаю, а рекламирую :), да и возможность загрузки модулей присутствует. Тем не менее, для построения сервера доступа ядро FreeBSD придется таки пересобрать… |
Если вы все выполнили правильно, то исходные коды ядра FreeBSD находятся у Вас в каталоге/usr/src/sys. Если такого каталога у Вас нет (или он пустой), введите команду /stand/sysinstallи установите исходные коды ядра с Вашего дистрибутива или через Интернет. Чтобы создать свое собственное ядро необходимо создать конфигурационный файл в каталоге /usr/src/sys/i386/conf. Проще всего скопировать уже имеющийся там файл GENERIC (стандартное ядро) в новый файл с именем, например… пусть будет MYROUTER.
Несколько основных команд FreeBSD: текущий каталог файлы в текущем каталоге операции с файлами Подробнее об использовании этих команд Вы можете узнать, выполнив команду man команда, например, введя man cp Вы узнаете обо всех возможностях команды копирования файлов. Внимание!!! Операционная система FreeBSD различет прописные и строчные буквы, т.е. MV и mv - это разные команды. Так же в одном каталоге могут существовать файлы GENERIC, Generic, generic и geneRic, являясь при этом абсолютно разными. Будьте внимательны! Понятно, что набирать длинные имена значительно менее удобно, чем тыкать мышкой в иконки, но создатели FreeBSD о нас немного позаботились - достаточно набрать несколько первых букв имени файла и нажать клавишу TAB - FreeBSD просмотрит содержимое каталогов и попробует дописать имя файла до полного. |
Полученный файл MYROUTER нужно отредактирвать. К сожалению, в поставке FreeBSD нет текстового редактора, который был бы привычен пользователям Windows (или я просто о нем не знаю…) . Им придется воспользоваться редактором ee (вызов - ee имя_файла). Пользователям, уже знакомым с другими версиями UNIX привычнее будет пользоваться vi…
Во-первых, нужно отредактировать первые строки (не считая комментариев - строк, начинающихся со знака #) файла MYROUTER, приведя их в соответствие со своим компьютером, например:
machine i386
cpu i386_cpu
ident MYROUTER
maxusers 32
где параметр machine отвечает за используемую архитектуру компьютера (i386 - это архитектура Intel, которая тянется со времен 386 процессора и до наших дней), cpu - это конкретный тип вашего процессора (если у Вас процессор не Intel, а AMD или Cyrix - оставьте пока поддержку всех процессоров, потом на досуге разберетесь, что нужно, а что нет). ident - это название ядра, должно совпадать с именем файла. Параметр maxusers не отвечает напрямую за количество одновременно работающих с системой пользователей - на его основе рассчитываются размеры внутренних таблиц ядра, отвечающих за количество одновременно работающих процессов, открытых файлов и т.д. Если Вы поставите это число слишком маленьким - то система может даже не загрузиться, а если загрузится - то начнет сбоить в произвольные моменты времени. Для сетевых серверов, на которых пользователи не могут запускать собственные процессы, я обычно ставлю этот параметр равным 32. Почему - не спрашивайте. Но работает.
Теперь Вы можете удалить из ядра поддержу всего того оборудования, которого у Вас реально нет, закомментировав соответствующие строки в файле конфигурации ядра, но Вы можете получить и неработоспособное ядро , поэтому тонкой настройкой Вы можете заняться на досуге, а сейчас только добавим в ядро необходимую нам функциональность. Для этого допишем в конец файла следующие строки:
options IPFIREWALL
эта строка включит поддержку пакетного фильтра TCP/IP, который нам очень понадобится.
options IPDIVERT
эта строка необходима для работы демона NAT, она позволит пакетному фильтру отправлять некоторые пакеты на “переработку”.
Теперь ядро нужно собрать. Для этого, находясь в каталоге /usr/src/sys/i386/config нужно ввести следующие команды:
config MYROUTER
cd ../../compile/MYROUTER
make depend
make
make install
Впрочем, если у Вас FreeBSD версии 4.4 или старше, то можно воспользоваться следущими командами:
cd /usr/src
make kernel KERNCONF=MYROUTER
Время сборки ядра не уменьшится,но Вы сможете сходить пообедать, а не ждать пока закончится выполнение каждой из команд.
Каждая из этих команд (за исключением cd) может выполняться продолжительное время, и каждая может завершиться с ошибкой. В случае ошибки проверьте конфигурационный файл, и, если Вы считаете, что с ним все в порядке - попробуйте собрать ядро GENERIC (config GENERIC, cd… и т.д.). Если GENERIC собрался нормально - ошибка в MYROUTER, попробуйте повторить все сначала. Если GENERIC не собрался - возможно, Вы забыли установить какой-либо компонент исходных кодов (я обычно забываю include) - в этом случае запустите /stand/sysinstall, и доустановите необходимое… или установите вообще все исходные коды - мало-ли что понадобилось при сборке ядра в Вашей конкретной версии.
Будем считать, что Вам удалось собрать и установить новое ядро. Если Вы сейчас перезагрузите компьютер, то он будет загружаться до какого-то этапа как обычно, после чего начнет мучительно долго раздумывать на одном и том-же месте, и может вообще не загрузиться. Это связано с тем, что начал работать пакетный фильтр (firewall), по умолчанию блокирующий все попытки установить сетевые соединения. Чтобы компьютер начал нормально работать, нам нужно отредактирвать еще один файл - /etc/rc.conf.
В отличие от Windows, FreeBSD не имеет реестра, а всю конфигурационную информацию хранит во множестве конфигурационных файлов. Сразу после загрузки ядра начинает исполняться файл /etc/rc (от Resource Configuration). Каждый, кто когда-нибудь редактировал файлы autoexec.bat иconfig.sys сразу пытается повлиять на ход загрузки операционной системы редактированием этого файла… и натыкается на ОГРОМНЫЙ и запутанный (впрочем - для кого как) программный код, в процессе работы обращающийся к еще более громадным и запутанным файлам. Если Вы хотите стать настоящим гуру, и это Ваша единственная цель - вперед. Впереди Вас ждет непаханый край работы. Разбираясь я этими скриптами Вы узнаете о FreeBSD почти все… и поймете, что редактировать все эти файлы не имеет смысла, т.к. при каждом обновлении операционной системы они будут с чистой совестью переписываться новыми. Создатели FreeBSD пошли навстречу простым смертным, и почти все настройки сделали доступными из файла /etc/rc.conf, который считывается основным скриптом/etc/rc и управляет его работой. Теперь не нужно детально разбираться с порядком запуска различных служб (в терминологии UNIX - демонов) и из параметров - достаточно просто указать, что именно мы хотим от FreeBSD. “Уууу….!”,- скажете Вы, -” с этим файлом, наверное, тоже хрен разберешься - для всех запчастей операционной системы нужно что-то указывать…”. И будете не правы. Создатели FreeBSD неусыпно заботятся о нас, и сделали еще один файл со стандарнтыми настройками - /etc/defaults/rc.conf. Теперь в /etc/rc.conf мы можем указывать только то, что хотим в установках по умолчанию изменить, и всегда можем вернуться к стандартным настройкам не вспоминая мучительно долго - “что же там было…”, а просто удалив из /etc/rc.conf непонравившиеся нам строки. Внимание!!! Будьте очень осторожны редактируя эти файлы. Маленькая синтаксическая ошибка вроде пропущенной кавычки может не дать системе нормально загрузиться. Один раз я, исправляя эти файлы удаленно (т.е. через интернет на другом компьютере) сделал мааааленькую ошибочку, и мне пришлось пилить через весь город, чтобы ее исправить на месте, т.к. при перезагрузке системы сеть на этом сервере вообще не завелась. |
В файл /etc/rc.conf нужно дописать следующие строки:
firewall_enable=”YES”
firewall_script=”/usr/local/billing/rc.firewall”
natd_enable=”YES”
natd_interface=”rl0″
gateway_enable=”YES”
Этими строчками мы укажем, что мы хотим сделать наш сервер роутером, хотим использовать NAT, и хотим использовать пакетный фильтр (firewall). В параметре firewall_script мы указываем, что при загрузке системы хотим самостоятельно сконфигурировать firewall, а значение rl0 в параметре natd_interface указывает сетевую карту, которая подключена к провайдеру (грубо говоря - я какой стороны у нас интернет подключен).
Теперь осталось только создать скрипт, который автоматически сконфигурирует пакетный фильтр при загрузке системы. Для этого нам нужно создать исполняемый файл rc.firewall в каталоге/usr/local/billing.
Создание файла /usr/local/billing/rc.firewall: cd /usr/local chmod - команда, задающая аттрибуты и права доступа к файлу. Выполнив командуchmod 0700 rc.firewall, мы делаем файл rc.firewall исполняемым (т.е. программой), и доступной только нам. |
В файл rc.firewall запишем:
ipfw=’/sbin/ipfw -q’
${ipfw} -f flush
${ipfw} add divert natd all from any to any via rl0
${ipfw} add allow all from any to any
где rl0, как мы помним - наша внешняя сетевая карта.
Еще раз все проверили, и можно перезагружаться… командой shutdown -r now.
Если компьютер не смог загрузиться с новыми настройками - по сообщению об ошибке постарайтесь понять, что стало этому причиной. Если у Вас получилось неработоспособное ядро (говорил же - вся оптимизация на потом), то при загрузке, в тот момент когда FreeBSD 10 секунд ждет нажатия Enter, нажмите Escape и введите в командной строке boot kernel.old. FreeBSD заботливо сохранила для Вас копию старого ядра, и вы можете его загрузить и пересобрать ваше новое ядро еще раз. Внимание! Если и Ваше следующее ядро откажется работать - то kernel.old будет уже испорчен, поэтому переименуйте его сразу же во что-нибудь типа kernel.GENERIC. Впрочем, скорее всего файл kernel.GENERIC у вас и так уже есть. Обычно файлы ядра находятся непосредственно в корневом каталоге, хотя, возможно, в Вашей версии FreeBSD они перекачевали в каталог /boot. Если проблема вызвана ошибкой в конфигурационном файле rc.conf, попробуйте очистить его командой echo # > /etc/rc.conf, или отредактирвать ee /etc/rc.conf. |
Теперь вы можете приступить к настройке клиентского компьютера. IP-адрес - 192.168.0.ХХХ (например, 192.168.0.10), маска - 255.255.255.0, Шлюз по умолчанию - 192.168.0.1, DNS-Server - сервер вашего провйдера. Если все сделано правильно - клиентский компьютер может общаться с Интернет, как если бы он был подключен к Интернет напрямую (за небольши исключением - он не может быть сервером для Интернет). Остальные компьютеры настраиваются аналогично (естественно, с другими IP-адресами :) )