Простой сервер доступа с NAT на FreeBSD

В этой главе мы попытаемся превратить Ваш компьютер в простой сервер под управлением операционной системы FreeBSD и дать доступ в Internet небольшой локальной сети. Предполагается, что в Вашем компьютере установлены две сетевые карты, одна из которых имеет реальный адрес сети интернет (далее будет использоваться 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 является загрузочным. Для установки с него выберите в BIOS вашего компьютера загрузку с CD-ROM, вставьте компакт-диск и перезагрузите компьютер. Если Ваш компьютер не способен загрузиться с компакт-диска - следуйте инструкциям в файле install.txt, находящемся на компакт-диске.

При загрузке с компакт-диска по Вашему экрану пролетит несколько страниц текста - его читать не обязательно: это отчет 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. Мы опять попадаем в черное меню, поразительно похожее на предыдущее, но с немного другой функциональностью. Для начала, создадим раздел подкачки (если Вы знакомы с Windows не первый день, то знаете, что в Windows используется файл подкачки для решения проблем с нехваткой оперативной памяти. В системе 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

В операционной системе Windows вы привыкли к тому, что у Вас есть несколько дисков, обозначаемых буквами латинского алфавита - "A","C","D" и так далее. Операционная система FreeBSD (как и любая другая система семейства UNIX) использует другой подход: вместо набора логических дисков существует одно единственное дерево каталогов, к которому в любом месте может быть "прицеплен" (в терминах UNIX - смонтирован) любой из доступных разделов на жестком диске, дисководы, компакт-диски и т.д. В качестве каталога через локальную сеть может быть даже смонтирован диск другого компьютера.

Подробнее о работе с файловыми системами Вы можете узнать введя команду 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:

текущий каталог

Узнать текущий каталог можно введя команду pwd, а перейти в другой каталог командой cd имя_каталога В отличии от Windows разделителем каталогов в Unix является не обратный, а прямой слэш, например /usr/src/sys обозначает каталог sys, являющийся подкаталогом каталога src, который, свою очередь является подкаталогом каталога usr, являющегося подкаталогом корневого каталога - /. Точкой (.) обозначается текущий каталог, а двумя точками (..) - каталог верхнего уровня, т.е. если текущим каталогом является /usr/src/sys, то перейти в каталог /usr/src можно как командой cd /usr/src, так и командой cd ..

файлы в текущем каталоге

Чтобы узнать, какие файлы находятся в текущем каталоге, нужно ввести команду ls - вы увидите все файлы и подкаталоги в несколько столбцов. Чтобы получить более подробную информацию о файлах, введите команду ls -l - вы получите список, в котором кроме имен файлов будут показаны из размеры, даты создания, владельцы и права доступа к ним. Если выводимый командой текст не помещается на экране, то вы можете модифицировать эту команду следующим образом: ls -l | less. Вообще, | less можно приписать почти к любой команде, которая выводит слишком много текста. В этом случае вы можете прокручивать вывод команды вверх и вниз стрелками управления курсором. Выход из этого режима - клавиша q.

операции с файлами

Для копирования файлов служит команда cp файл новый_файл. Файлы по умолчанию берутся из текущего каталога, но Вы можете указывать и полные пути к файлам, например cp /usr/src/sys/i386/conf/GENERIC /tmp/MYROUTER - в этом случае в каталоге /tmp будет создана копия файла GENERIC, находящегося в каталоге /usr/src/sys/i386/conf, с новым именем MYROUTER. Для переименования и перемещения файлов служит команда mv файл новое_имя. Удалить ненужный файл можно с помощью команды rm имя_файла. Для создания и удаления каталогов предназначены команды mkdir имя_каталога и rmdir имя_каталога. Удалить можно только пустой каталог.

Подробнее об использовании этих команд Вы можете узнать, выполнив команду 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

mkdir billing

cd billing

ee rc.firewall

chmod 0700 rc.firewall

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-адресами :) )

Обновлено: 12.03.2015