Вы находитесь на странице: 1из 58

Корниенко К.А.

Корпоративный Интернет-сервер
на базе ОС FreeBSD.
Киев - 2008
1. Введение 4
1.1. Краткая история FreeBSD 4
1.2. Преимущества FreeBSD 5
1.3. Для кого эта книга 6
2. Инсталляция FreeBSD 7
1.4. Создание загрузочных дискет 7
1.5. Создание разделов на жёстком диске 7
1.6. Выбор Distributions и Packages 9
3. Базовая настройка FreeBSD 10
1.7. Создание пользователя с правами root 10
1.8. Проверка и настройка сети (ifconfig) 10
1.9. Если провайдер выдаёт ADSL (ppp) 11
1.10. Редактирование параметров загрузки (/etc/rc.conf)
12
1.11.Конфигурирование ядра 13
1.12. Настройка обновления дерева портов (cvsup)
13
1.13. Настройка службы DNS (named)
14
1.14. Настройка почтовой службы (sendmail)
15
1.15. Установка и базовая настройка proxy-сервера (squid)
16
1.16. Обновление индексной базы поиска файлов (locate) 16
1.17. Справочная система FreeBSD 16
1.18. Завершение базовой настройки FreeBSD 17
4. Дальнейшая настройка FreeBSD 18
1.19. Антивир
усный контроль почты (sendmail + drweb) 18
1.20. Работа почты по протоколу IMAP (sendmail + dovecot)
18
1.21. Борьба со спамом (sendmail + spamassassin)
19
1.22. Настройк
а ftp-сервера (ftpd) 21
1.23. Защита сети -firewall (ipfw)
22
1.24. Более тонкая настройка proxy-сервера (squid)
23
1.25. Установка и настройка web-сервера (apache)
25
1.26. Популярная связка apache + php + mysql
25
1.27. Web-
интерфейс для доступа к почте (openwebmail, squirrelmail) 26
1.28. Держим у себя файл зоны (первичный DNS) 26
1.29. Соединения через сокет (socket) 27
1.30. Организуем виртуальную локальную сеть (ipsec) 27
1.31. Второй способ организовать VPN (openvpn) 27
1.32. Беспрепятственное копирование файлов между серверами FreeBSD 28
1.33. Графики статистики использования сетевого трафика (mrtg) 28
1.34. Подсчёт и ограничение трафика пользователей (ipa) 29
1.35. Настройка общения с сервером по sms 33
1.36. Завершение полной настройки FreeBSD - наводим красоту 34
5. Инструменты на каждый день 35
1.37. Работа с файлами в shell
35
1.38. Пользователи, группы и права доступа
37
1.39. Текстовый редактор vi
39
1.40. Программирование в shell
41
1.41. Справоч
ник по командам и конфигурационным файлам 48
6. Заключение 50

3
1. Введение
1.01. Краткая история FreeBSD

У истоков операционной системы UNIX стояла лаборатория Bell Labs компании


AT&T. Два человека - Кен Томпсон (Ken Thompson) и Деннис Ритчи (Dennis Ritchie) были
главной движущей силой развития UNIX, которая вообще-то родилась случайно. В
середине 60-х годов AT&T Bell Labs совместно с другими компаниями прикладывала
немало усилий для разработки новой операционной системы под названием Multics. Её
предполагалось использовать для крупномасштабных вычислений, которые выполнялись
на машине класса мэйнфрейм. Кен Томпсон написал небольшую компьютерную игру, но
ему не нравились ни производительность мэйнфрейма, ни стоимость машинного времени.
С помощью Денниса Ритчи он переписал эту игру для работы на компьютере DEC PDP-7 и,
по ходу дела, написал целую операционную систему. Весной 1969 года Bell Labs вышла из
проекта, и программисты остались без вычислительной среды, однако, к этому моменту они
уже разработали базовую структуру файловой системы, которая впоследствии
превратилась в файловую систему UNIX. Первые версии UNIX были написаны на языке
ассемблер, но уже в 1973 году UNIX была переписана на С - совершенно новом языке
программирования, разработанном Ритчи. Создание языка программирования С и системы
UNIX - две самые важные вехи в истории компьютерной индустрии. Язык С стал первым
мультиплатформенным языком, который позволил относительно легко переносить как
приложения, написанные на нём, так и саму систему UNIX между различными
компьютерными платформами. Это одна из многих возможностей, благодаря которым
система UNIX стала такой популярной.
AT&T в принципе не занималась компьютерным бизнесом (отчасти потому, что в то
время это было монополией правительства). Поэтому AT&T предложила UNIX в виде
исходных кодов правительственным учреждениям и университетам за сравнительно
небольшую плату. Вот так система UNIX попала в 80% университетов, имевших
компьютерные факультеты. Одной из первых организаций, вплотную занявшихся работой
над UNIX, стала группа из Калифорнийского университета в Беркли - Computer Systems
Research Group. Этому способствовал и тот факт, что в 1975 году Кен Томпсон оставил Bell
Labs и перешел в отдел компьютерных исследований в Беркли. В работе над расширением
системы ему активно помогал студент-выпускник Билл Джой (Bill Joy). Измененная и
скорректированная в университете версия UNIX была выпущена под названием Berkley
Software Distribution, или BSD. А в конце 70-х годов произошло важное событие:
Министерство обороны США объявило, что ее подразделение Advanced Research Project
Agency будет использовать UNIX и что в качестве базовой принята версия разработчиков из
Беркли. Одними из требований, поставленных министерством обороны, была возможность
работы в сети и высокая устойчивость системы. Так, благодаря военным, UNIX стала
продвигаться вперед по пути совершенствования. В это время Билл Джой оставил
университетский городок и основал компанию Sun Microsystems. Рабочие станции Sun
использовали версию операционной системы, производную от BSD и известную как SunOS.
Большая часть исходного кода BSD была доступна пользователям бесплатно и в 1991 году
BSD была портирована на платформу Intel x86, а в Калифорнийском университете
образовалась новая группа, которая начала продавать коммерческую версию BSD для
платформы х86.
В 1993 году две совершенно разные группы одновременно пришли к выводу, что
UNIX заслуживает большего внимания. В результате были созданы два новых проекта.
Результатом первого проекта стала операционная система NetBSD. Здесь основное
внимание уделялось доступности и универсальности системы. Если существует аппаратная
платформа, то наверняка имеется и работающая на ней версия NetBSD.

4
Второй проект породил FreeBSD. В этой разработке внимание было сконцентрировано на
том, чтобы система стала проще в использовании. Иначе говоря, эта система была
ориентирована на широкий круг пользователей и на платформу Intel x86. Сегодня FreeBSD -
самая известная UNIX-система из семейства BSD.

1.02. Преимущества FreeBSD

Причин для того, чтобы использовать в своих задачах FreeBSD масса. Рассмотрим
же самые основные ее преимущества и недостатки.
Итак, главным преимуществом FreeBSD мы, безусловно, считаем её стабильность.
По данным компании Netcraft (netcraft.com), изучавшей сайты с самым продолжительным
календарным временем беспрерывной работы, из 50 первых в её списке сайтов 47
функционирует под управлением FreeBSD. С момента последней перезагрузки Web-
сервера №1 прошло уже более 5 лет! И, конечно же, он работает под FreeBSD.
Второе неоспоримое преимущество - это то, что FreeBSD бесплатная система, не
обременяющая пользователя дорогой лицензией. Вы можете бесплатно установить копию
FreeBSD на всех своих компьютерах, сколько бы их ни было. Если вы устанавливаете
сервер, вам не потребуется платить за каждое дополнительное сетевое подключение, как в
некоторых коммерческих операционных системах.
Третье - это доступность тысяч бесплатных пакетов прикладных программ всегда в
режиме online! Эти свободно распространяемые программы элементарно устанавливаются
из дерева портов всего двумя командами - система сама найдёт нужные дистрибутивы и
патчи в сети и скомпилирует всё, что нужно на вашу FreeBSD. Требуется только
подключение к Интернет.
Четвёртое - это открытость системы. Доступно всё дерево исходного кода ОС
FreeBSD, в код можно вносить изменения, выполнять любые проверки и т.д.
Ну и наконец, показателем качества является то, что системой FreeBSD пользуются
крупнейшие компании и интенсивно используемые Web-сервисы.

Теперь сравним возможности ОС FreeBSD с возможностями Windows и Linux.


Microsoft поступила гениально, разработав ОС, которой может пользоваться каждый.
Windows способна выполнять разнообразные задачи, не требуя от пользователя глубоких
знаний внутреннего функционирования системы. С одной стороны, современная Windows
отвечает самым высоким требованиям, предъявляемым к техническим средствам, однако
многим пользователям они совершенно ни к чему. С другой стороны, Windows не имеет
интерфейса к целому ряду имеющихся в ней возможностей и тонких настроек. Попросту
говоря, Wndows предлагает графический интерфейс для решения большинства задач.
Система FreeBSD основана на командной строке. В ней для настройки используются
текстовые конфигурационные файлы, редактируя которые можно выполнить необходимые
действия быстро и точно. Графический интерфейс - неотъемлемая примета Windows, тогда
как в FreeBSD можно и вовсе обойтись без него. Специалисту не нужны окошки для
доступа к серверу, который стоит в дальней комнате. FreeBSD позволяет выполнять
абсолютно все необходимые операции по администрированию, используя исключительно
командную строку с физической консоли либо с удаленного терминала, даже самого
простейшего и базирующегося на любой другой платформе. Хотя Windows тоже можно
администрировать удаленно, но для этого нужно специальное ПО, которое подходит
исключительно для Windows, а это значит, что задачи удаленного администрирования
Windows-систем можно выполнять только с другой системы Windows. Кроме того,
графический интерфейс имеет ряд ограничений, от которых свободна командная строка. В
начале может показаться, что работать с командной строкой сложно, но очень скоро вы
поймете, что набрать нужную команду гораздо быстрее, чем добиться того же самого
эффекта с помощью системы разветвленных меню.
Второе основное отличие - ядро Windows невозможно изменить. Ядро - это сердце
операционной системы, оно контролирует все аспекты её работы. FreeBSD позволяет
создать новое ядро, которое будет максимально соответствовать назначению конкретной
ОС. Благодаря этому существенно возрастает быстродействие и снижаются требования к

5
аппаратным ресурсам. В Windows же предпочтение отдается простоте эксплуатации, а не
производительности и эффективному использованию аппаратных средств.

Что касается Linux, то об этой системе сейчас знают все, впрочем, как и о Windows.
В последнее время она стала особенно популярной. Фактически Linux- это клон UNIX. Как и
FreeBSD, это открытая операционная система, разработанная добровольцами из разных
стран мира. У FreeBSD и Linux много общего, однако, для Linux создано больше программ,
чем для FreeBSD, но последняя, в свою очередь, позволяет запускать практически все
программы, разработанные для Linux. Более того, под FreeBSD они работают даже
быстрее, чем под Linux. Что касается политики разработки и поддержки, то у FreeBSD
только один дистрибьютор, а у Linux их более 30. FreeBSD будет работать одинаково на
любой системе. В случае с Linux это не так. У каждого дистрибьютора свой подход, что
нередко вводит пользователей в заблуждение, когда они переходят с одного дистрибутива
Linux на другой. FreeBSD является полноценной ОС, поддерживаемой основным составом.
Linux - это только ядро, поддерживаемое Линусом Торвальдсом (создателем Linux).
Компании, занимающиеся распространением Linux, комплектуют свои дистрибутивы целым
рядом программ, специально разработанных для Linux и, естественно, каждый
дистрибьютор имеет собственное мнение относительно того, что должно входить в
дистрибутив. Кроме того, процесс обновления кода FreeBSD отслеживается и
координируется намного тщательнее, чем в Linux. Для большинства пользователей это
позитивное явление, поскольку они уверены в том, что код был протестирован
специалистами на отсутствие проблем. Поскольку в системе FreeBSD поддерживается одно
дерево исходного кода, она стабильнее Linux и в большей степени соответствует
производственным целям. Основным недостатком FreeBSD, вызванным таким подходом,
является то, что нововведения допускаются в систему медленней, чем в Linux. Но есть
выбор: либо вы предпочтёте стабильность и неприступность ОС, либо остановите свой
выбор на модных вещичках и новых игровых устройствах, пожертвовав ради этого
надежностью.

1.03. Для кого эта книга

Эта книга адресована прежде всего системным администраторам, у которых есть


опыт администрирования компьютерных сетей, но нет опыта работы с UNIX. Как говорится,
лучше всего учиться и приобретать опыт в реальных условиях, поэтому мы предлагаем
начать глубокое изучение FreeBSD с установки и настройки вашего корпоративного
Интернет-сервера - узла очень полезного и нужного практически в каждом офисе. В данной
книге мы построим полнофункциональный корпоративный Интернет-сервер на базе ОС
FreeBSD, рассмотрим все основные функции, которые могут вам понадобиться, и, наконец,
коснёмся необходимого вам инструментария на каждый день. Один раз правильно
настроив свой сервер вы забудете проблемах и периодических перезагрузках системы, ваш
FreeBSD-сервер - полностью самостоятельная, надёжная и стабильная единица, на
которую вы можете положиться.
В книге кратко в достаточно сжатой, но доступной форме описано как и зачем
устанавливать те или иные пакеты и реализовывать конкретные функции вашего сервера.
Прочитав эту книгу вы сможете самостоятельно проинсталлировать и настроить более
менее типовой офисный Интернет-сервер и приобретёте опыт и знания для того, чтобы в
дальнейшем самостоятельно делать с FreeBSD всё, что посчитаете нужным.
Книга не претендует на статус «справочника» или «энциклопедии», скорее это
«пошаговое вводное руководство для начинающих», которое, однако, даст вам серьёзный
толчок к более глубокому изучению ОС FreeBSD.
Для того, чтобы вы сразу смогли эффективно проделывать все то, что описано в
книге, советуем с самого начала просмотреть главы 5.01, 5.02 и особенно 5.03, а когда в
книге начнётся разговор о написании скриптов, просмотрите перед этим главу 5.04.

6
И последнее, в данной книге мы используем дистрибутив FreeBSD версии 6.3 -последней
вышедшей стабильной версии на момент написания книги. Удачи... :)

2. Инсталляция FreeBSD
В офисных условиях ОС FreeBSD можно установить двумя основными способами - с
загрузочных CD-дисков, либо с ftp-сервера, однако, в последнем случае, необходимо
создать ещё загрузочные дискеты. Если вы планируете устанавливать ОС с CD-дисков, то
можете пропустить следующий раздел о загрузочных дискетах.

2.01. Создание загрузочных дискет

Образы загрузочных дискет хранятся в каталоге floppies на дистрибутивном CD-диске. Если


доступа к CD-приводу нет, можно загрузить загрузочные образы с ftp-сервера:
ftp://ftp.freebsd.org/pub/FreeBSD/releases/i386/6.3-RELEASE/floppies/

Необходимо загрузить файл boot.flp и файлы kernlflp, kern2.flp, kern3.flp. Если загрузочные
диски предполагается создавать в системе DOS или Windows, также потребуется
программа fdimage.exe, расположенная в каталоге: /рглЬ/FreeBSD/ tools/

Команда для создания дискет в DOS выглядит так:


С:\> d:\tools\fdimage.exe d:\floppies\boot.flp а:
Аналогично создаём остальные дискеты.

Если дискеты создаём на другой FreeBSD- или UNIX-системе, то программа fdimage.exe не


потребуется - используйте UNIX-утилиту dd для записи файлов на дискету. В системе
FreeBSD это будет иметь такой вид: # dd if=boot.flp of=/dev/rfdO

Теперь, после создания загрузочных дискет, можно перейти непосредственно к процессу


инсталляции. Загружая компьютер с дискет, вставьте сначала дискету boot. Когда
потребуется, система предложит вам вставить и остальные дискеты.

2.02. Создание разделов на жёстком диске


При загрузке на экране появится текстовое меню для выбора варианта загрузки. По
умолчанию выбирается пункт 1. Boot FreeBSD, после чего попадаем в меню Sysinstall
(рис.1). Естественно выбираем «Custom» и затем идем разбивать жёсткий диск - меню
«Partition». Попадаем в программу, чем-то напоминающую fdisk для DOS. Подсказки по
меню расположены внизу экрана. Основные команды - клавиша «С» (создать раздел), «D»
(удалить раздел). Советуем сразу нажать «А» (использовать весть диск). Выходим отсюда
клавишей «ESC», выбираем стандартный загрузчик (Standard) и приступаем к разметке
-пункт меню «Label».
Допустим, мы используем системный блок следующей конфигурации: CPU 800 MHz; RAM
256 Mb; HDD 10 Gb. Можно взять системный блок ещё слабее, но лучше не надо. Так вот,
мы попадаем в ещё одну утилиту, напоминающую fdisk. Подсказки так же отображены внизу
экрана. Последовательность действий следующая: нажимаем «С» (создать), определяем
размер (например 512М или 2G), выбираем «file system» это у нас будет или «swap» и
определяем имя файловой системы, начиная от корневого каталога. Первым нужно создать
корневой каталог ( / ), затем swap, затем все остальные. Можно сразу нажать «А»
(автоматическое разбиение), тогда система сама разобьёт вам диск, как посчитает нужным.
Если что-то создали не так, нажмите «D» (удалить). В итоге должно получиться нечто,
похожее на рис.2.
•'reeBSD Bisklahel Editor!

isk: adB Partition паме: adBsl Free: В blocks (8MB) Size Newfs
art Mount
Part Mount Size Newfs
dBsla / 512MB UFS2 Y
dBslb swap 512MB SwAP 1B24MB UFS2+S Y
dBsld /trip 2B48MB UFS2+S Y 1B24MB UFS2+S
dBsle /uar Y 5119MB UFS2+S Y
dBslf /поме
dBslg /usr

"he following coMMands are valid here (upper or lower Z = CustoM Newfs H =
case) ! = Create В = Belete M = Mount pt. Belete+Merge
Newfs Opts Q = Finish Toggle S = Toggle SoftUpdates A =
Newfs U = Undo Auto Befaults

'se Fl or ? to get More help, arrow keys to select,

Здесь необходимо отметить, из каких соображений следует выбирать размеры


создаваемых разделов и вообще сказать пару слов о файловой системе FreeBSD.
Структура размещения файлов и папок - древовидная, хорошо всем знакомая, однако
здесь нет понятия о логических дисках. Есть один корневой каталог и древовидная
структура внутри него. Тогда что же мы только что сделали? Мы зафиксировали размеры
определённых частей нашего дерева, т.е. назначили что-то вроде квот. Теперь о размерах.
При условии выделения из общего дерева каталогов /tmp, /var, /home и /usr для самого
корневого каталога нет необходимости выделять много места на диске - вполне хватит 256 -
512Mb. Swap - файл подкачки, обычно выбирается в 2 раза больше объема оперативной
памяти, /tmp - каталог для временных файлов, /var - каталог для логов системы, почтовых
ящиков пользователей и т.д. Стоит выделять на него побольше места, /home - домашние
каталоги пользователей (при входе по ftp пользователь так же попадает в свой домашний
каталог). Этот размер стоит выбирать исходя из целей и задач сервера, /usr - все
установленные программы, порты и так далее. До 5Gb вполне будет достаточно, но
желательно не меньше 2Gb. В принципе у каждого системного администратора своя
манера разбивать место на HDD, всё приходит с опытом. Выходим отсюда (ESC) и
двигаемся в меню «Distributions».

2.03. Выбор Distributions и Packages

Надеемся, что вы уже привыкли к навигации в меню, поэтому дальше останавливаться на


кнопках не будем. После входа в меню «Distributions», снова нужно выбрать «Custom», a
затем уже выбирать, что устанавливать в систему. Отмечаем (пробелом):
Base
Kernels
Man
Catman
Src
Ports

И это почти всё уже. Нам остаётся выбрать тип установки - с ftp или компакт-диска (меню
«Media») и, если ставим с ftp, то надо выбрать источник установки ftp-сервер ну и
настроить сеть в соответствии с вашими текущими параметрами для того, чтобы до этого
самого ftp можно было добраться (IP-адрес, шлюз, DNS).

Начинаем установку - нажимаем «Commit». Инсталляция проходит быстро (5-10 мин.) и


задаёт вопрос: «Вернуться ли к послеинсталляционным настройкам?» Мы, конечно же,
возвращаемся и не трогаем ничего (всё будем настраивать потом - так нагляднее и
правильнее), кроме раздела «Packages». Здесь нам нужны только две вещи:
Security > sudo
Shells > bash

После установки этих пакетов остаётся выбрать свой часовой пояс - меню «Time Zone» и
всё готово. Выходим из программы Sysinstall и перезагружаемся (предварительно вытащив
дискеты и CD-диски). Если система выдает вам приглашение «login:», то всё прошло
успешно (рис.3).
itarting devd.
ш.acpi.cpu.cx_lowest: Cl -> Cl
Ienerating nsswitch.conf.
Ienerating host.conf.
lounting NFS file systeMs:.
Ireating and/or trinning log files:.
Starting syslogd.
!LF ldconfig path: /lib /usr/lib /usr/1ib/conpat /usr/local/1 ib
j.out ldconfig path: /usr/1 ib/aout /usr/1ib/conpat/aout
Initial i386 initialization:.
Additional FIB I support:.
Starting local daeMons:.
Jpdating Motd.
"lounting late file systeMs:.
Configuring syscons : кеумар blanktiMe.
Starting cron.
Local package initialization:.
Additional TCP options:.
Starting background file systeM checks in 68 seconds.
Sun Jun 17 19:38:39 EEST 2BB7

FreeBSD/i386 (fli-inesiac) (ttyyB)

login: I

Если понадобится в дальнейшем вызвать меню Sysinstall, используйте команду:


# /usr/sbin/sysinstall

9
Так как вся работа в системе FreeBSD будет происходить в текстовом режиме, то и
скриншоты в книге, в принципе, больше не имеют смысла, а значит «картинок» больше не
будет. Продолжим.

3. Базовая настройка FreeBSD


Заходим в систему под пользователем root без пароля и, сразу же, запомните раз и
навсегда: первое, что нужно сделать, - это установить пароль для пользователя root:
# passwd root

Второе, что нужно сделать, - это установить правильную дату и время:


# date 200801171935 ( 2008 г., январь, 17 число, 19:35 )

А теперь приступим, собственно, к настройке. Допустим, мы имеем:


1.42. Локальную офисную сеть 10.0.0.0/24;
1.43. Подключение к Интернет:
-IP-адрес: 222.111.33.100;
-Шлюз: 222.111.33.99;
-DNS1: 222.111.0.1;
-DNS2: 222.111.0.2;
3. Только что установленную FreeBSD на компьютер с двумя сетевыми картами - в
системе пусть это будут интерфейсы edO и fxpO.

3.01. Создание пользователя с правами root

То есть, с правами администратора. То есть, создаём в системе самого себя:


# adduser

Система последовательно будет задавать вопросы о логине, полном имени и т.д. В ответ на
вопрос о группе, введите wheel - это название администраторской группы. В ответ на
вопрос о shell, введите bash. Всё остальное можно оставить, как есть. Не забудьте создать
себе сразу пароль. Далее нужно разрешить пользователям из группы wheel получать в
системе администраторские права:
# visudo

Находим и раскомментируем строчку (нужно убрать символ # в начале строки):

# %wheel ALL=(ALL) NOPASSWD: SETENV: ALL

Сохранить и выйти из редактора vi - команда: :wq [Enter]. Здесь и далее -для того, чтобы
понять, как работать в текстовом редакторе vi, прочитайте главу 5.03.

Теперь можно и даже нужно выйти из системы (Ctrl-D) и зайти уже под своим именем.
Никогда не работайте в UNIX под пользователем root - на то есть много причин и, кроме
того, это считается плохим тоном. После входа в систему, получаем права root: $ sudo —s
#

3.02. Проверка и настройка сети

Для начала посмотрим, какие сетевые интерфейсы у нас в системе есть:


# ifconfig

10
Вы должны увидеть список сетевых интерфейсов системы, среди которых есть ваши
сетевые карты (fxpO и ео!0). Присвоим нашему серверу внутренний IP 10.0.0.1, а внешний
-тот, который выдал провайдер. Для этих целей используется команда ifconfig:
#1 ifconfig fxpO inet 10.0.0.1 netmask 255.255.255.0
#2 ifconfig edO inet 222.111.33.100 netmask 255.255.255.252

Пропишем шлюз по умолчанию - команда route:


# route add default 222.111.33.99

Пропишем DNS-серверы, причём сначала пропишем самого себя, а потом DNS-серверы


провайдера - файл /etc/resolv.conf:
# vi /etc/resolv.conf
nameserver 127.0.0.1
nameserver 222.111.0.1
nameserver 222.111.0.2

Теперь мы должны «увидеть» и нашу локальную сеть и мир. Проверяем обычной для всех
командой ping:
# ping freebsd.org
PING freebsd.org (69.147.83.40): 56 data bytes
64 bytes from 69.147.83.40: icmp_seq=0 ttl=41 time=207.519 ms
64 bytes from 69.147.83.40: icmp_seq=l ttl=46 time=201.388 ms

3.03. Если провайдер выдаёт ADSL

Сейчас очень популярной является технология ADSL - асинхронный цифровой канал


передачи данных. Причина популярности - неплохие качество и скорость при дешевизне
подключения и использования. Для того, чтобы получить полноценный сервер, необходимо
получить у провайдера статический IP-адрес, а модем установить в режиме Bridge. Это
принципиально важный момент. Это нужно для того, чтобы этот самый IP-адрес ссылался
именно на сетевой интерфейс вашего сервера, а не на ADSL-модем. Затем:
# vi /etc/ppp/ppp.conf
default:
set log Phase Chat LCP IPCP CCP tun command
enable dns

provider name:
set device PPPoE:edO
set authname ppp login
set authkey ppp password
set dial
set login
add default HISADDR

Естественно, параметры provider_name, pppjogin и ppp_password, стоит изменить в


соответствии с параметрами вашего подключения (имя можно выбрать любое, а ррр-логин
и ррр-пароль выдаёт Интернет-провайдер). Запускаем ррр для установки соединения:
# /usr/sbin/ppp -background provider_name

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

11
существующими физическими интерфейсами ео!0 и fxpO. Таким образом, если у вас ADSL,
то просто меняйте в дальнейших сетевых настройках ео!0 на tunO там, где это нужно.

3.04. Редактирование параметров загрузки

Всё, что мы сделали до этого момента вручную, нужно прописать в файле /etc/rc.conf - это
основной файл параметров загрузки системы. Сейчас самое время придумать имя вашему
серверу. Наверняка у вас есть какой-то домен, частью которого вы планируете быть. Не
забудьте, что «как вы сервер назовёте, так он и будет работать»... Допустим, у вас есть
почтовый домен mail.ua и вы хотите назвать свой сервер elbrus. Пропишите в файле зоны
вашего домена хост elbrus.mail.ua (как это делается читайте в разделе 3.07) и вперёд:
# vi /etc/rc.conf
sshd_enable="YES"
inetd_enable="YES"
gateway enable="YES"
sendmail enable="YES"
hostname="elbrus.mail.ua"
ifconfig_fxpO="inet 10.0.0.1 netmask 255.255.255.0"
ifconfig_ed0="inet 222.111.33.100 netmask 255.255.255.252"
defaultrouter="222.111.33.99"
named_enable="YES"
natd_enable="YES"
natd interface="ed0"
firewall_enable="YES"
firewall type="/usr/local/etc/firewall.conf"
# vi /usr/local/etc/firewall.conf
add divert natd ip from any to any via edO

Только что мы разрешили автоматический запуск кое-каких процессов и определили IP-


адреса сетевых интерфейсов, шлюз по-умолчанию, имя сервера и параметры фаерволла.
Если вы используете ADSL, то нужно убрать настройки интерфейса edO и шлюза по
умолчанию, т.к. эти параметры мы получим при запуске ррр от провайдера. Так же мы
меняем сетевые интерфейсы с которыми будут работать natd и ipfw (фаерволл). Таким
образом, эти два файла должны иметь следующий вид:

# vi /etc/rc.conf
sshd_enable="YES"
gateway enable="YES"
sendmail enable="YES"
hostname="elbrus.sint.ua"
ifconfig_fxp0="inet 10.0.0.1 netmask 255.255.255.0"
ppp_enable="YES"
ppp mode="background"
ppp profile="provider name"
named_enable="YES"
natd_enable="YES"
natd interface="tun0"
firewall_enable="YES"
firewall type="/usr/local/etc/firewall.conf"
# vi /usr/local/etc/firewall.conf
add divert natd ip from any to any via tunO

12
Некоторые строки в /etc/rc.conf мы прописали наперёд, чтобы потом не останавливаться
ещё раз на этом файле, читайте дальше и вы должны понять что к чему. Далее в книге мы
не будем больше так подробно останавливаться на вариациях с ADSL, т.к. надеемся, что
для читателя это элементарно и понятно. Итак, настраиваем дальше.

3.05. Конфигурирование ядра

Это очень ответственная процедура и перед тем, как начать редактировать ядро, нужно для
самого себя понять «зачем». В нашем случае нужно включить поддержку NAT на уровне
ядра (для работы в режиме прозрачного шлюза), FIREWALL (фильтр сетевых пакетов) и
IPSEC (для связки удалённых хостов в виртуальную сеть). Текстовый файл ядра, которое
работает сейчас, находится здесь: /usr/src/sys/i386/conf/GENERIC. Скопируем его и
добавим нужные нам строки в соответствующие разделы файла:
#3 cd /usr/src/sys/i386/conf/
#4 ср GENERIC ELBRUS

Если вы используете мультипроцессорный сервер, тогда копируйте не GENERIC, a SMP:


# ср SMP ELBRUS

Итак, добавляем опции и собираем новое ядро:


# vi ELBRUS

options IPFIREWALL
options IPFIREWALL FORWARD
options IPFIREWALL DEFAULT TO ACCEPT
options IPDIVERT
options DUMMYNET
options IPSEC
options IPSEC ESP
options IPSEC DEBUG
# config ELBRUS
cd ../compile/ELBRUS/
# make cleandepend
make depend
# make
# make install

Четыре последние команды можно объединить в одну строку (об операторе && позже): #
make cleandepend && make depend && make && make install

В этом случае не придётся ждать окончания предыдущей обработки, чтобы руками


запустить следующую - команды запускаются одна за другой. Компиляция ядра - процесс
долгий (около 30 минут, в зависимости от мощности компьютера), поэтому, чтобы не терять
времени, можно параллельно продолжить настройку нашего сервера в другой консоли.
Переключение между консолями: ALT + F1 .. F8 (всего их 8 шт.). Продолжим:

3.06. Настройка обновления дерева портов

Дерево портов - это тематический список расположения дистрибутивов программ, патчей и


библиотек на серверах поддержки FreeBSD в сети Интернет. То есть, если вам нужно
установить какую-либо программу, вы заходите по дереву портов в определённый каталог и
выполняете всего две команды - make (скачать всё, что нужно из сети и подготовить к

13
установке) и make install (установить в систему). Естественно, что дерево портов
желательно держать в актуальном состоянии. В этом нам поможет программа cvsup.
Установим её же из портов:
#5 cd /usr/ports/net/cvsup-without-gui/
#6 make && make install

Находим файл ports-supfile, копируем его в свой домашний каталог, редактируем его и
запускаем процедуру обновления дерева портов:
#7 ср /usr/share/examples/cvsup/ports-supfile /home/admin/
#8 vi /home/admin/ports-supfile

*default host=cvsup2.ua.FreeBSD.org
# cvsup -g -L 2 /home/admin/ports-supfile

Этот процесс так же небыстрый (около 40 минут, в зависимости от скорости подключения к


сети Интернет), поэтому переходим в третью консоль и продолжаем.

3.07. Настройка службы DIMS

Это нужно для того, чтобы наш сервер мог сам обрабатывать dns-запросы пользователей, а
так же, если понадобится, держать у себя доменные зоны. Нам нужен правильно
работающий демон named, подправим его конфигурационный файл (нужно найти,
раскомментировать и отредактировать раздел forwarders): # cd /etc/namedb/
vi named . conf
forwarders {
222.111 0 l
222.111 0 2 ;
};

В принципе этого достаточно. Однако, можно ещё прописать у себя обратную зону нашей
локальной сети. Напомним в двух словах, что прямой DNS-запрос - это когда нужно узнать
IP-адрес по имени хоста, а обратный - когда нужно узнать имя хоста по его IP-адресу.
Некоторые программы (например sshd), при обращении к ним по сети, пытаются узнать имя
хоста, который к ним обращается и, если долго не получают ответа, могут завершиться по
таймауту. Обратная зона нашей локальной сети нужна для того, чтобы наш сервер каким-то
образом присваивал имена нашим локальным хостам. Как правило, в 99,9% случаев, это
не нужно, однако отметить стоит:
# vi named.conf
zone "0.0.10.IN-ADDR.ARPA" {
type master; file
"0.0.10.rev";
};
# vi 0.0.10.rev
$TTL 86400
0.0.10.IN-ADDR.ARPA. IN SOA elbrus.mail.ua. root.elbrus.mail.ua. (
20060606 ; serial
28800 ; refresh
1800 ; retry
604800 ; expire
8 6400 ) ; minimum IN NS
elbrus.mail.ua. $ORIGIN 0.0.10.IN-ADDR.ARPA.
$GENERATE 1-255 $ PTR local-$.mail.ua.

Теперь просто перезапускаем демона named:


# killall -HUP named

14
Можно тут же локально проверить, как работает ваш named. Следующая команда
выполнит dns-запрос к вашему серверу и вы должны увидеть ответ: # dig 0127.0.0.1
freebsd.org А

3.08. Настройка почтовой службы

Для того, чтобы наш сервер мог принимать и отправлять почту, нужно немного поработать с
настройками sendmail, а именно: разрешить из локальной сети пользоваться им, как smtp,
прописать домены, для которых принимать почту извне, ограничить размер письма (не
обязательно, но полезно). Кроме того, нужно дать возможность пользователям забирать
почту по протоколу рорЗ. Итак:
#9 cd /etc/mail/
#10 ср access.sample access
#11 vi access

10.0.0 RELAY
# vi local-host-names
mail.ua
# vi sendmail.cf

О MaxMessageSize=4096000
# make maps && make restart

Чтобы создать почтовый ящик, нужно просто создать пользователя в системе. Если этот
пользователь создается только ради почты (ни ftp, ни shell ему не нужен), то можно не
пользоваться командой adduser, а получить прямой доступ к системной базе пользователей
и паролей:
# vipw
admin:3CpZ$jX:1001:0::0:0:User &:/home/admin:/usr/local/bin/bash
info:W3Y$vX0:7001:777::0:0:User &:/nonexistand:/sbin/nologin

Каждому пользователю определена строка, разделённая на поля двоеточиями (имя :


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

Для того, чтобы отдавать почту пользователям по рорЗ, необходимо установить


соответствующую программу, например cucipop. Тут нам снова помогает дерево портов:
#12 cd /usr/ports/mail/cucipop/
#13 make && make install
#14 vi /etc/inetd.conf

рорЗ stream tcp nowait root /usr/local/libexec/cucipop cucipop


# killall -HUP inetd

Здесь мы коснулись конфигурационного файла демона inetd - демона, который попросту


говоря запускает нужную программу при обращении к серверу по определённому порту (tcp
или udp). Добавленная строка в inetd.conf говорит о том, что при обращении к серверу на
110 порт (рорЗ), следует запустить cucipop, который и обработает запрос (проверит пароль
и отдаст пользователю его почту). Информацию о том, что рорЗ - это есть именно 110 порт,
содержит файл: /etc/services.

15
Если вы хотите назначить псевдонимы почтовым ящикам - используйте файл
/etc/mail/aliases. Если же вы собираетесь принимать почту на одном сервере для разных
почтовых доменов и, при этом, хотите разделить пользователей - используйте файл
/etc/mail/virtusertable. После редактирования этих файлов, не забывайте сделать:

# make maps && make restart

3.09. Установка и базовая настройка proxy-сервера

Proxy-сервер нужен для кеширования ответов на http-запросы для их последующего


использования, а так же для организации доступа в Интернет из локальной сети. Ставим
squid, и не забываем поправить squid.conf, чтобы вашим сервером не пользовались все,
кому не лень, т.е. squid должен отвечать только на запросы вашей локальной сети.
#15 cd /usr/ports/www/squid/
#16 make && make install
#17 cd /usr/local/etc/squid/
#18 vi squid.conf

acl users src 10.0.0.0/255.255.255.0

http access allow users


http access deny all

visible hostname elbrus.mail.ua


#19 squid -z
#20 vi /etc/rc.conf
squid_enable="YES"
# /usr/local/etc/rc.d/squid start

Здесь отметим, что каталог /usr/local/etc/rc.d/, содержит скрипты автозапуска программ,


которые вы устанавливаете. При загрузке компьютера они запускаются автоматически,
однако, ничего не мешает пользоваться ими в процессе работы и запускать вручную. Вы
можете так же помещать сюда свои собственные скрипты, если хотите, чтобы они
запускались при старте системы.
Теперь, для того, чтобы пользоваться proxy-сервером, нужно прописать этот момент у себя
в обозревателе Internet Explorer-адрес: 10.0.0.1, порт: 3128.

3.10. Обновление индексной базы поиска файлов

В UNIX-системах есть хорошая программа поиска файлов - locate. Однако, для того, чтобы
она работала, необходимо создать индексную базу файловой системы, которая
обновляется автоматически один раз в неделю, но, так как мы только установили наш
сервер, её ещё попросту нет. Команда для создания или ручного обновления следующая:
# /etc/periodic/weekly/310.locate

Теперь можно пользоваться командой locate для поиска файлов по всей системе:
# locate squid.conf

3.11. Справочная система FreeBSD

Подробно не будем останавливаться на том, как же всё-таки пользоваться командой locate,


т.к. в ОС FreeBSD есть прекрасная справочная система - команда man. Так что, если вас
что-то интересует, спрашивайте у своего сервера, он подскажет. Например:

16
# man locate

Если не понятно, как пользоваться справкой, то есть даже для тех, кто в танке: #
man man

3.12. Завершение базовой настройки FreeBSD

Здесь сразу отметим, что все вышеперечисленные действия по предварительной


настройке сервера нужно выполнять последовательно и именно в том порядке, в котором
они описаны, иначе, при инсталляции или запуске той или иной программы, вы можете
попасть на сообщения об ошибке из-за того, что вы ещё не выполнили какую-то операцию,
которая описана ранее. Будьте внимательны.

Вот собственно и всё, что касается основной базовой настройки системы. Когда закончатся
процессы компиляции нового ядра и обновления портов, просто перегрузите сервер, чтобы
запустилось собственно новое ядро, а с ним firewall, natd и всё остальное. Перегружаем
сервер любой из следующих команд:
#21 reb
oot или:
#22 shutdown —r now

Чтобы увидеть запущенные процессы, используйте команду ps:


#23 ps -ax
#24 ps —ax | grep squid

Чтобы увидеть свободное место на диске, используйте команду df:


# df -h

Как вы догадались, перегружать сервер кнопкой Reset не рекомендуется, т.к. хоть FreeBSD
и надёжнее Windows, но всё-таки файловая система есть и там и там, а с любой файловой
системой завершать работу следует корректно. Для выключения компьютера используйте:
#25 halt
или:
#26 shutdown —h now

Так вот, теперь мы имеем полноценный Интернет-сервер на базе ОС FreeBSD, который


умеет:
#27 Отвечать на DNS-запросы (named);
#28 Работать как SMTP-сервер для нашей локальной сети (sendmail);
#29 Принимать входящую почту для пользователей, созданных в системе (sendmail);
#30 Отдавать пользователям их почту по протоколу РОРЗ (cucipop);
#31 Работать как прозрачный Интернет-шлюз (ipfw + natd);
#32 Работать как кеширующий PROXY-сервер для нашей локальной сети (squid).

То есть теперь рабочие станции вашей локальной сети вы настраиваете например


следующим образом:
#33 IP-адрес: 10.0.0.2 .. 255 (10.0.0.1 - это уже наш
сервер)
#34 Маска: 255.255.255.0
#35 Шлюз по умолчанию 10.0.0.1
#36 DNS-сервер: 10.0.0.1
#37 Proxy-сервер: 10.0.0.1
#38 порт proxy: 3128
17
Для того, чтобы вносить какие-либо изменения в работу вашего сервера, совсем не
обязательно иметь постоянный доступ к консоли. Используйте программу PuTTY, которая
устанавливается на Windows для удалённого администрирования FreeBSD.

И, конечно же, это далеко не всё, что вам может понадобиться, и что вы можете получить,
работая с ОС FreeBSD. Движемся дальше.

4. Дальнейшая настройка FreeBSD


4.01. Антивирусный контроль почты

Раз уж у нас появился сервер приёма электронной почты, то было бы неплохо сразу
настроить и антивирусный контроль входящих и исходящих писем. Использовать будем
антивирус DrWeb, т.к. он элементарно устанавливается из портов и не создаёт проблем в
процессе дальнейшей работы:
#39 cd /usr/ports/security/drweb-sendmail/
#40 make && make install
#41 vi /etc/mail/sendmail.cf
# Input mail filters О
InputMailFilters=drweb-filter
Xdrweb-filter, S=local:/var/drweb/run/drweb-smf.skt, F=T,
T=S:320s;R:32 0s;E:In
#42 killall sendmail
#43 /usr/local/etc/rc.d/drwebd start
#44 /usr/local/etc/rc.d/002.drweb-smf.sh start
#45 cd /etc/mail/
#46 make start

И настроим обновление антивирусных баз каждые 2 часа:


# vi /etc/crontab
0 */2 * * * root /usr/local/drweb/update/update.pi
# killall -HUP cron

4.02. Работа почты по протоколу IMAP

Для чего это нужно? Очень часто бывает так, что пользователь работает со своим
почтовым ящиком с разных компьютеров и при этом пользуется разными почтовыми
клиентами. В этом случае необходимо, чтобы вся почта пользователя находилась на
сервере. При этом, каждый раз, подключаясь к почтовому серверу, пользователь получает
только заголовки всех своих писем, а при необходимости может получить и прочитать
письмо целиком. Такая схема работы достигается при использовании протокола IMAP. Для
реализации мы предлагаем использовать программу dovecot:
#47 cd /usr/ports/mail/dovecot/
#48 make && make install

Собственно, это всё. Конфигурационный файл трудностей вызвать не должен, там всё
просто и понятно. Единственное, что остаётся сделать:
# vi /etc/rc.conf
dovecot_enable="YES"
#49 ср /usr/local/etc/dovecot-example.conf /usr/local/etc/dovecot.conf
#50 vi /usr/local/etc/dovecot.conf

disable plaintext auth = no

18
ssl disable = yes #
/usr/local/etc/rc.d/dovecot start

Здесь отметим, что dovecot работает и по протоколу IMAP и по протоколу РОРЗ


одновременно. Так что пользователи могут настраивать работу своих почтовых клиентов
как им удобнее.

4.03. Борьба со спамом

Со спамом нужно бороться. Существует два основных способа блокировки нежелательной


почты: проверка хостов, от которых приходит почта, самим сендмейлом - это раз. И
использование внешних программ фильтрации - это два. Рассмотрим первый случай. Что
нас может интересовать при проверке хоста-отправителя почты? Во-первых, есть ли у хоста
имя DNS (используем обратный DNS-запрос). Если нет, то скорее всего это спам. Во-вторых,
можно проверить, содержится ли в имени хоста слова adsl, dhcp и так далее. Если да, то
тоже можно предположить, что письмо окажется спамом, хотя и с меньшей долей
вероятности. И наконец, в-третьих, необходимо настроить сверку с одним из серверов
«чёрных списков» спамеров, которые постоянно обновляются, например spamhaus.org.
Каждый из этих пунктов требует добавления в sendmail.cf одной строки в конец секции
«local info» и небольшого блока кода в конец секции «check_relay». Внимательно
просмотрев листинг вы должны понять что к чему (порядок строк и блоков соответствует
описанию): # vi /etc/mail/sendmail.cf
#51DNS-PTR Checking
Kdnsname dns -R PTR
#52ADSL-DHCP Checking
Kfrmail regex -aFRRRMAIL л (.*-.*-.*-.* | .*adsl.*| .*dhcp.*)$
#53sbl-xbl.spamhaus.org Checking
Kdnsbl dns -R A -T<TMP>

#54Configuration version number


DZ8.12.11

######################################################################
### check relay -- check hostname/address on SMTP startup
######################################################################

# DNS based (DNS-name - PTR-record)


R$* $: $&{client_addr}
R$-.$-.$-.$- $: <?> $(dnsname $4.$3.$2.$1.in-addr.arpa. $: OK $)
R<?>OK $#error $@ 5.7.1 $: "550 I don't receive SPAM!!!"
R<?>$+ $: OKSOFAR

# DNS based (DNS-name - *-*-*-*)


R$* $
R$-.$-.$-.$- $
R$* $
$&{client addr}
<?> $(dnsname $4 . $3.$2.$1.in-addr.arpa. $: OK $)
$(frmail $1 $)
R$*FRRRMAIL $#error $@ 5.7.1 $: "550 I don't receive SPAM!!!"
R<?>$+ $: OKSOFAR

# DNS based IP address spam list sbl-xbl.spamhaus.org


R$* $ $&{client addr}
R$-.$-.$-.$- $
R<?>OK $
R<?>$+<TMP> $
<?> $(dnsbl $4.$3.$2.$1.sbl-xbl.spamhaus.org. $: OK $)
OKSOFAR
TMPOK
R<?>$+ $#error $@ 5.7.1 $: "550 I don't receive SPAM!!!"

######################################################################

19
### check_mail — check SMTP NMAIL FROM:' command argument
######################################################################
# make restart

Второй вариант блокирования спама заключается в использовании внешнего фильтра,


который выдаёт оценку приходящему сообщению. В этом направлении особенно преуспела
программа SpamAssassin. Попробуем настроить и его. Для этого, пожалуй, вернём
sendmail.cf в исходное состояние (оставим только настройки drweb) и добавим в него
следующие строки:
# vi /etc/mail/sendmail.cf
# Input mail filters
О InputMailFilters=drweb-filter,spamassassin
Xdrweb-filter, S=local:/var/drweb/run/drweb-smf.skt, F=T, T=S:320s;R:320s;E:lh
О Milter.macros.connect=t, b, j, , {daemon name}, {if name}, {if addr}
О Milter.macros.helo=s, {tls version}, {cipher}, {cipher bits}, {cert subject},
{cert issuer}
О Milter.macros.envfrom=i, {auth type}, {auth authen], {auth ssf},
{auth author}, {mail mailer}, {mail host}, {mail addr}
О Milter.macros.envrcpt={rcpt mailer}, {rcpt host}, {rcpt addr}
О Milter.macros.eom={msg id}
Xspamassassin, S=local:/var/run/spamass-milter.sock, F=, T=C:15m;S:4m;R:4m;E:10m

Теперь установим в систему SpamAssassin:


#55 cd /usr/ports/mail/p5-Mail-SpamAssassin/
#56 make && make install
#57 cd /usr/ports/mail/spamass-milter/
#58 make && make install

Конфигурационный файл фильтра находится в каталоге /usr/local/etc/mail/spamassassin, a


пример рабочего конфигурационного файла ниже:
# vi /usr/local/etc/mail/spamassassin/local.cf
rewrite_header Subject *****SPAM*****
use bayes 1
bayes auto learn 1
bayes path /usr/local/etc/mail/spamassassin/bayes/bayes
lock method flock
bayes min spam num 5 0
bayes min ham num 5 0
bayes ignore header X-Spam-Flag
bayes ignore header X-Spam-Status
required score 10.0
score HTTP_USERNAME_USED 9.99
score FAKE_HELO 9.99
score FORGED_RCVD 9.99
score UNWANTED_LANGUAGE_BODY 1.02
score MLM 5.55
score RCVD_NUMERIC_HELO 4.95
ok locales ru en

Теперь в принципе всё готово. Для того, чтобы запустить систему в ручном режиме,
необходимо сначала остановить sendmail, запустить spamd + spamass-milter и затем снова
запустить sendmail (и не забыть подправить rc.conf):
# vi /etc/rc.conf
spamd_enable="YES"
spamass milter enable="YES"
#59 cd /etc/mail
#60 make stop
#61 /usr/local/etc/rc.d/spamass-milter start
#62 /usr/local/etc/rc.d/sa-spamd start

20
# make start

Всё должно заработать. Как проверить? Отправляем откуда-то извне письмо на свой
почтовый ящик, получаем его и внимательно читаем заголовок RFC-822. Там должно быть
написано и про DrWeb и про SpamAssassin. Можно ещё посмотреть лог самого sendmail: #
tail —n 50 /var/log/maillog

Теперь наш спам-фильтр сходу должен различить около 60 - 70% спама. Но это ещё не всё.
Для того, чтобы спам-фильтр заработал в полную силу, а это примерно 96 - 98% спама, его
необходимо обучить. Для этого создадим 2 почтовых ящика: spam - для перенаправления
на него писем, которые являются спамом, но не были помечены, как спам; и ham - для
перенаправления на него писем, которые были помечены, как спам ошибочно. Теперь
напишем скрипт для обучения встроенного Bayes и будем периодически перенаправлять на
эти ящики письма для обучения:
# vi /home/admin/scripts/sa_learn.sh
#!/bin/sh
sa-learn --spam /var/mail/spam
sa-learn --ham /var/mail/ham
exit 0
# vi /etc/crontab
0 22 * * * root /home/admin/scripts/sa-learn.sh

4.04. Настройка ftp-сервера

Очень часто бывает полезно иметь возможность попасть на свой сервер по ftp. Для того,
чтобы можно было попадать по ftp к себе в домашнюю директорию, нужно всего лишь
раскомментировать кое-что кое-где:
# vi /etc/inetd.conf
ftp stream tcp nowait root /usr/libexec/ftpd ftpd -1
# killall -HUP inetd

При этом лучше не оставлять без внимания 2 файла:


/etc/f tpusers - «чёрный список» пользователей, которым запрещен доступ по ftp; /etc/f
tpchroot - пользователи, для которых изменен корневой каталог, в результате чего им
доступен лишь их домашний каталог (выше не пустит).

Можно ещё сделать анонимный ftp. Очень не рекомендуем из соображений безопасности,


но всё же опишем. Проще всего - запустить утилиту /usr/sbin/sysinstall, затем перейти к
разделу Configure и Networking и затем к опции Anon FTP. Анонимный вход по ftp на ваш
сервер готов. Теперь любой может попасть к вам в директорию /var/ftp, разместить там что
угодно (например, образы CD-дисков) и разослать всему миру ссылку, чтоб качали.
Догадываетесь, к чему может привести? Поэтому, если уж решили открыть ftp для всех
-внимательно настраивайте права доступа внутри /var/ftp.

Отключить анонимный ftp при помощи sysinstall не получится. Вот 3 способа:


Удалить дерево /var/ftp; Удалить пользователя ftp;
Добавить пользователя ftp в файл /etc/ftpusers (как отмечалось выше, в этом
файле прописываются пользователи, которым запрещено входить по ftp).

21
4.05. Зашита сети -firewall

Подробно описывать принципы написания фаерволла при помощи системы IPFW мы


будем, однако не в этой книге. Остановимся только на самом принципе написания правила.
Если читать правило слева направо, то получается примерно такой алгоритм:
Номер правила \ действие \ протокол \ откуда \ куда \ доп. условие
Например:
# ipfw add 200 deny tcp from 10.0.0.5 to any 110

Эта команда добавит правило с номером 200, которое запрещает любой tcp-трафик от
хоста 10.0.0.5 на любой другой хост по 110 порту. Т.е. пользователь 10.0.0.5 не сможет
подсоединиться ни к одному рорЗ-серверу в мире. Теперь предлагаем вашему вниманию
написанный нами, проверенный временем и отработанный в реальных условиях фаерволл.
Конечно же у каждого своя специфика работы, однако, вот вам базовая модель, которая
сразу подойдёт 90% из вас:
# vi /usr/local/etc/firewall.conf
add 100 divert natd ip from any to any via edO
add 10010 count ip from any to 222.111.33.100 in recv edO
add 10020 count ip from 222.111.33.100 to any out xmit edO
add 40000 allow ip from any to any via loO
add allow udp from any to any
add allow icmp from any to any
add allow tcp from any to any established
add allow ip from any to any frag
add allow tcp from any to any 22 setup
add allow tcp from any 20 to any setup
add allow tcp from any to any 21 setup
add allow tcp from any to any 25 setup
add allow tcp from any to any 110 setup
add allow tcp from any to any 143 setup
add allow tcp from any to me 80 setup
add allow tcp from me to any 80 setup
add allow tcp from me to any 443 setup
add allow tcp from 10.0.0.0/24 to me 3128 setup
add deny tcp from 10.0.0.0/24 to any 80
add allow tcp from any to any 1024-65535 setup
add 65500 deny ip from any to any

Фаерволл написан по принципу: «Открыть всё, что нужно, остальное - закрыть».


Естественно, это простейший фаерволл, однако, его можно брать за основу и развивать.
Для удаления правила (например с номером 200) используйте:
# ipfw delete 200
Для того, чтобы видеть в реальном времени кто куда пошёл, необходимо установить из
портов trafshow:
#63 cd /usr/ports/net/trafshow/
#64 make && make install
#65 trafshow —i edO

Здесь же опишем, как ограничить скорость трафика по определённым условиям (это нам
пригодится в дальнейшем):
22
#66 ipfw add pipe 1 tcp from any to 10.0.0.3 out
#67 ipfw pipe 1 config bw 32Kbit/s

To есть любой трафик на хост 10.0.0.3, исходящий от сервера, отдавать со скоростью не


более 32 Кбит в секунду. Пока подумайте, для чего мы это будем использовать. :)

4.06. Более тонкая настройка proxy-сервера

Очень часто бывает так, что всем разрешать пользоваться Интернетом не стоит. Это очень
просто можно ограничить прямо в файле настройки squid:
# vi /usr/local/etc/squid/squid.conf

acl users src "/usr/local/etc/squid/users.txt"

http access allow users


http access deny all
# vi /usr/local/etc/squid/users.txt
10.0.0.3/2 55.255.255.255
10.0.0.8/2 55.255.255.255

Таким образом, мы разрешили пользоваться squid только определённым IP-адресам. Так


же можно запретить доступ к определённым ресурсам Интернет:
# vi /usr/local/etc/squid/squid.conf

acl users src "/usr/local/etc/squid/users.txt"


acl url deny url regex "/usr/local/etc/squid/url deny.txt"

http access allow users !url deny


http access deny all
# vi /usr/local/etc/squid/url_deny.txt
xxx.com
porno.ru

Можно ещё более усилить ограничение доступа - ввести проверку пароля пользователя
при попытке выйти в Интернет:
# vi /usr/local/etc/squid/squid.conf

authenticate program /usr/local/sbin/ncsa auth /usr/local/etc/passwd


authenticate children 4

acl password proxy auth REQUIRED

http access allow password


http access deny all

И наконец, если нужно фильтровать http-запросы пользователей более гибко, не пускать их


на ненужные сайты, перенаправлять их на определённые сайты при определённых
условиях, ограничивать доступ в Интернет по времени и так далее и тому подобное, то
лучше всего настроить фильтрацию при помощи программы SquidGuard:
#68 cd /usr/ports/www/squidguard/
#69 make && make install
#70 vi /usr/local/etc/squid/squid.conf

redirect program /usr/local/bin/squidGuard

23
redirect children 4
# vi /usr/local/etc/squid/squidGuard.conf
dbhome /var/db/squidGuard
logdir /usr/local/squid/logs
time workhours {
weekly mtwhfa 08:00 - 21:00
}

source admins {
ip 10.0.0.3
}
source users {
ip 10.0.0.0/24
}
rewrite media {
s@.*\.mp3$@http://10.0.0.1/replace/oblaka.mp3@i
s@.*\.avi$@http://10.0.0.1/replace/nikolaev.avi@i
log replace.txt
}
# DESTINATION CLASSES

acl {
admins {
pass any
}
users within workhours {
pass !ads !aggressive !audio-video !drugs !gambling !
hacking !mail !porn Iproxy Iviolence Iwarez any
redirect http://www.google.com
rewrite media
log squidGuard.txt
} else {
pass none
redirect http://www.google.com
log squidGuard.txt
} default
{
pass none
redirect http://www.google.com } }
# squid —к reconfigure

В секции «rewrite media» описана очень интересная вещь - подмена трЗ и avi файлов
своим, заранее заготовленным фаиликом. Таким образом, если какой-то вредитель захочет
скачать из сети много музыки или видео, то он накачает себе много-много одинаковых
файлов - копий ваших заготовок. Закачка будет происходить локально с вашего сервера, а
значит и внешнего трафика никакого не будет.

Для того, чтобы пользователи локальной сети ходили в Интернет только через squid и не
имели возможности выйти в мир напрямую (отключив в своих браузерах proxy-сервер),
можно реализовать перехват соединения по 80 порту и заворот этого соединения на наш
squid на порт 3128:
# vi /usr/local/etc/squid/squid.conf

httpd accel host virtual


httpd accel port 80 httpd
accel with proxy on

24
httpd accel uses host header on # ipfw add 200 fwd 127.0.0.1,3128

tcp from any to any http in via fxpO

4.07. Установка и настройка web-сервера

Одно из самых приятных и интересных занятий - установить и настроить свой собственный


сервер Apache. Несмотря на развитие версии 2, нам всё ещё больше нравится версия 1.3:
#71 cd /usr/ports/www/apachel3
#72 make && make install
#73 vi /etc/rc.conf
apache_enable="YES"

И это, как ни странно, всё. Осталось запустить httpd и ваш сервер будет отвечать на
запросы по 80 порту:
# /usr/local/etc/rc.d/apache start

Предполагая, что у вас будет жить не один сайт, настроим сразу виртуальные хосты с
некоторыми полезными опциями (например прямой доступ к файлам в директории):
# vi /usr/local/etc/apache/httpd.conf
Include etc/apache/virtual.conf
# vi /usr/local/etc/apache/virtual.conf
NameVirtualHost 222.111.33.100:80
<VirtualHost 222.Ill.33.100:80>
ServerAdmin admin@mail.ua
DocumentRoot /home/admin/www
ServerName mail.ua
ServerAlias www.mail.ua
CustomLog etc/apache/logs/mail.ua-access log common
ErrorLog etc/apache/logs/mail.ua-error log
</VirtualHost> <Directory "/nome/admin/www/fotos/">
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
Allow from all
</Directory>

Теперь содержимое сайта www.mail.ua нужно поместить в каталог /home/admin/www. Для


размещения второго и последующих сайтов, просто дописывайте в файл virtual.conf
аналогичные секции «VirtualHost».

4.08. Популярная связка apache + php + mysql

Здесь писать много не будем. Отметим только, что установив некоторые программы и
библиотеки из портов, и ничего не настраивая, вы будете иметь эту самую связку:
#74 cd /usr/ports/databases/mysql51-server/
#75 make && make install
#76 cd /usr/ports/lang/php4/
#77 make && make install
#78 cd /usr/ports/databases/phpmyadmin/
#79 make && make install

25
4.09. Web-интерфейс для доступа пользователей к почте

Теперь, когда у нас есть свой web-сервер, мы можем сделать полезную вещь для наших
пользователей - настроить доступ к их почтовым ящикам по web-интерфейсу:
#80 cd /usr/ports/mail/openwebmail
#81 make && make install

Либо, если вы установили dovecot и имеете возможность работать по протоколу IMAP, то


даже лучше будет использовать другой интерфейс:
#82 cd /usr/ports/mail/squirrelmail
#83 make && make install

Осталось подправить конфигурационные файлы httpd.conf и virtual.conf так, чтобы по


определённому http-запросу Apache направлял нас в рабочий каталог openwebmail или
squirrelmail, и всё - можно пользоваться.

4.10. Держим у себя файл доменной зоны

Если вы регистрируете себе домен самостоятельно, то вам необходимо держать где-то


файл своей зоны. Почему бы не сделать это у себя, т.е. выступить первичным сервером
своего доменного имени. А вторичный взять на каком-либо бесплатном сервисе, например
secondary.net.ua:
# vi /etc/namedb/named.conf
zone "admin.kiev.ua" { type master; file
"/etc/namedb/admin.kiev.ua";
};
# vi /etc/namedb/admin.kiev.ua
$TTL 10800
@ IN SOA ns.admin.kiev.ua. root.admin.kiev.ua. (
@ IN NS
@ IN NS
@ IN MX
@ IN A
ns IN A
office IN
www IN CNAME
2008011701 ; Serial 10800
; Refresh 3 600 ;
Retry 604800 ; Expire 8
6400 ) ; Minimum
ns.admin.kiev.ua.
ns.secondary.net.ua. 10
ns.admin.kiev.ua.
222.111.33.100
222.111.33.100 A
222.111.33.100 ns
# killall -HUP named

Для работы с secondary.net.ua, открываем ему в firewall:


# ipfw add 65000 allow tcp from 193.201.116.2 to me setup
26
4.11. Соединения через сокет

Нередко бывает нужно перенаправить входящее соединение извне на определённый хост


внутрь сети по определённому порту. Например, у вас есть терминальный сервер, который
не подключён напрямую к сети Интернет, но к нему необходимо подключаться извне. Для
этих целей используем сокеты:
#84 cd /usr/ports/sysutils/socket
#85 make && make install
#86 vi /etc/services
rdp 3389/tcp
# vi /etc/inetd.conf
rdp stream tcp nowait root /usr/local/bin/socket -v 10.0.0.5 3389
# killall -HUP inetd
Теперь можно подключаться терминальным клиентом к нашему серверу на его внешний IP-
адрес (222.111.33.100) - сервер перенаправит входящее соединение внутрь нашей
локальной сети на хост 10.0.0.5.

4.12. Организуем виртуальную локальную сеть

Теперь представьте себе, что у вас есть второй удалённый офис. Он так же подсоединён к
сети Интернет и вы хотите соединить две локальные сети офисов в единую виртуальную
локальную сеть и иметь доступ с любого компьютера одного офиса на любой компьютер и
принтер другого. Построим такую сеть (VPN) средствами IPSec. Необходимые опции в ядро
мы уже включили выше. Пусть второй офис имеет параметры: локальную сеть
192.168.1.0/24 и подключение к Интернет с адресом 111.111.11.1. Для организации VPN нам
необходим будет FreeBSD сервер, аналогичный нашему. Теперь добавляем у нас:
# vi /etc/rc.conf
gif interfaces="gif0"
gifconfig_gif0="22 2.111.33.100 111.111.11.1"
ifconfig_gif0="inet 10.0.0.1 192.168.1.1 netmask 255.255.255.0"
# vi /etc/rc.local
route add 192.168.1.0/24 192.168.1.1
# vi /usr/local/etc/firewall.conf
add 20000 allow ip from me to 111.111.11.1
add 20010 allow ip from 111.111.11.1 to me
add 20020 allow ip from 10.0.0.0/24 to 192.168.1.0/24
add 20030 allow ip from 192.168.1.0/24 to 10.0.0.0/24

Аналогичную операцию проделываем на удалённой FreeBSD машине (логически меняем


IP-адреса местами) и, после перезагрузки, наблюдаем нашу работающую виртуальную
локальную сеть. Таким образом можно соединить не только 2 удалённых сети, а гораздо
больше.

4.13. Второй способ организовать VPN

Можно построить VPN не на уровне ядра системы, а при помощи утилиты openvpn. Минус
в том, что в этом случае наша сеть будет менее стабильна и устойчива. Плюс в том, что

27
таким образом можно настраивать не только связку FreeBSD - FreeBSD, а и, например,
FreeBSD - Windows 2000 / 2003. Подробно описывать настройку openvpn мы здесь не
будем. Кому интересно - в Интернете масса статей по этому поводу.

4.14. Беспрепятственное копирование файлов между серверами FreeBSD

Рано или поздно у вас появится не один, а несколько FreeBSD серверов и вы захотите
копировать между ними файлы в автоматическом режиме (например, логи squid или
графики загрузки канала). Для этого есть прекрасная команда scp (secure copy), однако,
она требует ввода пароля. Для беспрепятственного же копирования файлов между
серверами UNIX (чтобы можно было использовать эту функцию в скриптах) нужно
сформировать ключ по алгоритму DSA. Генерировать его надо на том сервере, с которого
планируется копировать файлы:
# ssh-keygen -t dsa

А теперь перепишем его на тот сервер, на который будем копировать файлы,


предварительно создав там каталог .ssh в домашнем каталоге пользователя, от имени
которого будем входить на удалённую машину:
#87 ssh admin@10.0.0.1 'mkdir /home/admin/.ssh'
#88 cat /root/.ssh/id_dsa.pub | ssh admin@10.0.0.1
'cat » /home/admin/.ssh/authorized_keys'

Теперь можно без ввода пароля проделывать, например, следующее:


# scp /etc/rc.conf admin@10.О.О.1:/home/admin/rс.conf

Если всё равно вы видите запрос пароля, проверьте конфигурационный файл демона sshd
на удалённой машине:
# vi /etc/ssh/sshd_config
PubkeyAuthentication yes AuthorizedKeysFile
.ssh/authorized keys

4.15. Графики статистики использования сетевого трафика

Весьма небесполезная программа mrtg построит вам любые графики любых параметров,
которые можно измерять с течением времени. Мы же будем использовать её в связке с
snmp для построения графиков загрузки нашего Интернет-канала:
#89 cd /usr/ports/net-mgmt/net-snmp/
#90 make && make install
#91 cd /usr/ports/net-mgmt/mrtg/
#92 make && make install
#93 vi /usr/local/share/snmp/snmpd.conf
rwuser root noauth
rouser root noauth
rwcommunity public 222.111.33.100
rocommunity public 222.111.33.100
# vi /usr/local/etc/mrtg/mrtg.cfg
WorkDir: /usr/local/etc/mrtg/www
Target[elbrus]: 1:public@222.Ill.33.100
MaxBytes[elbrus]: 256000
Title[elbrus]: Traffic Analysis for Elbrus
PageTop[elbrus]: <Hl>Stats for Elbrus server</Hl>
# vi /etc/rc.conf
snmpd enable="YES"

28
# vi /etc/crontab
*/5 * * * * root /usr/local/bin/mrtg /usr/local/etc/mrtg/mrtg.cfg
# killall -HUP cron

Здесь отметим, что такое /etc/crontab и демон cron. Это своего рода планировщик
заданий. Чуть выше мы задали выполнение команды mrtg каждые 5 минут (назначение
первых пяти записей в строке (*/5 * * * *) описано в самом файле /etc/crontab).

4.16. Подсчёт и ограничение трафика пользователей

Вот мы подобрались к одной из самых востребованных и интересных задач, которые


обязательно должен решать «правильный» Интернет-сервер - это подсчёт и ограничение
трафика пользователей. Для подсчёта трафика мы будем использовать программу ipa в
связке с ipfw. Для ограничения же будем писать собственные скрипты. Приступим:
#94 cd /usr/ports/sysutils/ipa
#95 make && make install
#96 cd /usr/ports/net/ipa_ipfw
#97 make && make install
#98 cd /usr/ports/databases/ipa_sdb
#99 make && make install

Теперь нужно добавлять правила ipfw для того, чтобы ipa снимала с них информацию о
проходящем объёме трафика. Такие два правила у нас уже есть - они считают общий
объём входящего и исходящего внешнего трафика нашего сервера. После этого нужно
создать ipa.conf и ipastat.conf:
10010 count ip from any to 222.111.33.100 in recv edO
10020 count ip from 222.111.33.100 to any out xmit edO
# vi /usr/local/etc/ipa.conf
ac mod "ipa ipfw.so"; db
mod "ipa db sdb.so";
global {
update time = 30s;
append time = In;
ac list = ipfw;
db list = sdb;
sdb:db group = wheel;
}
rule 10010 {
ipfw:rules = 10010;
ipfw:maxchunk = IOC-
info = "IP incoming";
}
rule 10020 {
ipfw:rules = 10020;
ipfw:maxchunk = IOC-
info = "IP outgoing";
}
# vi /usr/local/etc/ipastat.conf
st mod "ipa st sdb.so";
dynamic rules = yes;
global {
st list = sdb; }

Всё готово. Запускаем демона ipa и наблюдаем за подсчётом проходящих по правилам


фаерволла байтов:
#100 /usr/local/bin/ipa
#101 ipastat -q -r 10010 | grep Total

29
* Total 1024 (1 day)

По такому же принципу создаём правила для подсчёта трафика конкретных хостов


локальной сети по конкретным портам, т.е. моделируем счётчики как нам хочется.
Напишем теперь скрипты для автоматической проверки и ограничения трафика
пользователей по объёму и по скорости. В данном примере мы будем анализировать
только трафик, проходящий через squid, однако в жизни вы можете делать всё, что угодно.
Напишем скрипт для автоматической проверки локальной сети и добавления правил-
счётчиков для новых компьютеров: # vi ~/scripts/ipa_check_network.sh #!/bin/sh net="10.0.0"
i=l f=0
while [ $i -le 254 ] do
echo "$net.$i ..."
sl="ping -c 1 -t 1 $net.$i | grep from\ $net"
if [ "$sl" ]
then
echo "$net.$i is UP!!!"
n="expr 12000 + $i"
s2="ipfw show | grep $n"
if [ -z "$s2" ] then
f=l
ipfw add $n count tcp from me 3128 to $net.$i fi
s3="less /usr/local/etc/ipa.conf | grep $n"
if [ -z "$s3" ] then
f=l
exec 6>&1
exec » /usr/local/etc/ipa.conf
echo "rule $n {" echo "
ipfw:rules = $n;" echo "
ipfw:maxchunk = 10G;"
echo " info = \"WWW incoming for $net.$i \";" echo "}"
exec 1>&6 6>&-fi else
echo "$net.$i ..."
fi
i="expr $i + 1"
done
if [ $f -eq 1 ]
then
killall -HUP ipa fi
echo " "
echo "Net Lookup Done!!!"
exit 0

30
Символ ~ в командной строке заменяет путь к домашнему каталогу пользователя, т.е.
предыдущая команда эквивалентна следующей записи: # vi /home/admin/scripts/ipa
check network.sh

Однако в скриптах нужно всегда писать полный путь к используемым файлам, т.к. они
могут быть запущены от имени разных пользователей.
Теперь напишем скрипт для проверки объёма скачанного трафика в текущем месяце и
сравнения его с назначенной пользователю квотой:
# vi ~/scripts/ipa_check_quotas.sh
#!/bin/sh
net="10.0.0"
ipfw show 17000-17255 > /home/admin/scripts/ipfw quota.txt
I
while
cut -flread
-d" str
do -f2 -d"
cut
echo
cut -f3 -d"$str
echo $str
echo $str
expr 17000 + $i"
expr 12000 + $i"
date | cut -f2 -d' '"
="/usr/local/bin/ipastat ="expr $sl" ="expr
$sl / 1024" ="expr $sl / 1024" = "less
/home/admin/scripts/ipfw quota.txt | cut
[ "$s2" ]

exec < $1
-fl-i $m -r $n | grep Total | cut -f4
-q
| grep $1
i=
q=
e=
1=
n=
m=
si
si
si
si
s2
if [
then
s2="expr $s2"
if [ $s2 -ne $1 ]
then
s2=""
fi fi
if [ $sl -ge $q ]
then
if [ -z "$s2" ]
then
| mail $e
ipfw add $1 deny tcp from $net.$i to me 3128 echo "Your HTTP-
access was blocked. Your quota is $q Mb. fi else
if [ "$s2" ]
then
ipfw delete $1
| mail $e
echo "Your HTTP-access was opened. Your quota is $q Mb.' fi fi done
exit 0 # vi ~/scripts/quotas.conf 7:1000:admin@mail.ua
15:200:jurist@mail.ua

Несложно понять, что в случае превышения квоты, система ipfw просто запретит
пользователю доступ к серверу по порту 3128, т.е. у человека пропадёт доступ к Интернету

31
о чём он получит уведомление по почте. В следующем же месяце доступ автоматически
откроется. Запуск скрипта будет иметь следующий вид:
# ~/scripts/ipa_check_quotas.sh ~/scripts/quotas.conf

Второй вариант - при достижении определённого объёма в текущем месяце снизить


скорость пользователю до «безопасной». Этот вид воспитания наверное более
демократичен и красив. Принцип написания тот же, однако в данном случае, чтобы немного
сократить записи, обойдёмся без отдельного файла с квотами:
# vi ~/scripts/ipa_check_pipe.sh
#!/bin/sh
net="10.0.0"
ipfw show 15000-15255 > /home/admin/scripts/ipfw pipe.txt
ipfw show 12000-12255 > /home/admin/scripts/ipfw count.txt
exec < /home/admin/scripts/ipfw count.txt
while read str
do
q="expr $1"
n="echo $str | cut -fl -d' '
i="expr $n - 12000"
p="expr 15000 + $i"
m= ~ date | cut -f2 -d' '
sl="/usr/local/bin/ipastat -q -i $m -r $n | grep Total | cut -f4 -
sl="expr $sl"
sl="expr $sl / 1024"
sl="expr $sl / 1024"
s2="less /home/admin/scripts/ipfw pipe.txt | cut -fl -d' ' | grep
if [ "$s2" ]
then
s2="expr $s2"
if [ $s2 -ne $p ]
then
s2="" fi
fi
if [ $sl -ge $q ]
then
if [ -z "$s2" ]
then
ipfw add $p pipe $i tcp from any to $net.$i out
ipfw pipe $i config bw 32Kbit/s
echo "$net.$i was down to 32Kbit/s. ($sl MB)" | mail admin@mai
fi else
if [ "$s2" ]
then
ipfw delete $p fi
fi done exit 0

В случае превышения числа, которое вводится в командной строке в качестве параметра,


система ipfw понизит весь трафик от сервера к провинившемуся хосту до 4 Килобайт в
секунду, т.е. получится обычный dialup. Так безопаснее. В следующем же месяце скорость
автоматически вернётся на место. Запуск скрипта будет иметь следующий вид:
# ~/scripts/ipa_check_pipe.sh 300

И не забудьте добавить всё, что вы написали в сгоп:

32
# vi /etc/crontab
*/20 * * * * root /home/admin/scripts/ipa check network.sh
*/10 * * * * root /home/admin/scripts/ipa check pipe.sh 300

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

4.17. Настройка общения с сервером по sms

В некотором роде полезную, а в основном конечно же просто для «прикола», вещь так же
можно написать при помощи скриптов shell. Это отправка команд вашему серверу при
помощи обычных sms с вашего мобильного телефона. Для начала нужно создать почтовый
адрес (например sms@mail.ua) специально для приёма команд (ведь sms сообщение будет
попадать на ваш сервер, как обычное письмо) и прописать алиас, чтобы письмо
сохранялось, как текстовый файл в системе, который, собственно и будет обрабатывать
наш скрипт:
# vi /etc/mail/aliases
sms: admin, /sms/sms.txt
#102 newaliases
#103 mkdir /sms
#104 chown mailnull:mailnull /sms
#105 chmod 0700 /sms
#106 vi /etc/crontab
***** root /sms/sms.sh
# vi /sms/sms.sh
#!/bin/sh
adr="grep "From 380777777777" /sms/sms.txt"
operl="grep "CMD:" /sms/sms.txt"
oper2="grep "RBT:" /sms/sms.txt"
echo " " > /sm/sms.txt
if [ "$adr" ]
then
if [ "$operl" ]
then
cmd="echo "$operl" | cut -d: -f2"
ans="$cmd"
echo "$ans" | mail 380777777777@sms.mobileoperator.com fi
if [ "$oper2" ]
then
time="echo "$oper2" | cut -d: -f2"
shutdown -r $time fi fi exit 0

Надеемся, что принцип действия скрипта вам понятен. Вы должны отправить со своего
телефона сообщение на почтовый адрес sms@mail.ua. Скрипт запускается каждую минуту
и проверяет, было ли получено новое письмо. Если да, то проверяет с вашего ли телефона
и верен ли формат команд. Если всё ОК - выполняется команда и отправляется ответ.
Ничего сложного. Формат сообщения должен иметь следующий вид:
sms@mail.ua CMD:ipfw add 50 deny ip from any to 10.0.0.3
или:
sms@mail.ua RBT:now Вы можете добавлять свои дополнительные условия
(например ещё пароль) и вообще модифицировать работу скрипта как хотите. Главное -
идея. :)

33
Не забывайте перезапускать процесс после того, как отредактируете его конфигурацион-
ный файл. В данном случае речь идёт о демоне сгоп. Только после его перезапуска он
начнёт обрабатывать строку, которую мы в него добавили.

4.18. Для красоты - меняем приветствие сервера при входе в консоль

Теперь, когда ваш сервер полностью настроен и готов к тому, чтобы вы про него
благополучно забыли, самое время сделать себе лично приветствие при входе на сервер: #
vi /etc/motd

ELBRUS WellCome to
Korney's FreeBSD Server!!!

Admin: Korney A. Kornienko


Contact: +380777777777
e-mail: admin@mail.ua
icq: 33333333

Ну, теперь можно наслаждаться даже входом в систему - ваш сервер полностью готов!

Так вот, теперь мы имеем полноценный Интернет-сервер на базе ОС FreeBSD, который


умеет всё или почти всё, что нам от него может понадобиться. Самое главное, что он
теперь хорошо защищен, выполняет все необходимые нам функции, настроен на сбор
нужной нам статистики, на базе которой может даже самостоятельно принять определённое
решение. Многие вещи автоматизированы, однако, проявив немного фантазии, вы можете
автоматизировать себе вообще всё.

И напоследок маленький совет. Так как мы имеем дело всё-таки с техникой, делайте
резервные копии ваших конфигурационных файлов. В случае чего, вы сможете поднять
ваш сервер заново за 1 час, а это лучше, чем 1 день. Так что, если придумывать лень, вот
вам элементарный скрипт. Пусть он вам не пригодится никогда, но если вдруг что - потом
спасибо скажете: # vi ~/backup.sh #!/bin/sh

cd /home/admin/backup/
mkdir /home/admin/backup/temp
cp -r /etc ./temp/
cp -r /usr/local/etc ./temp/usr.local.etc
rm -r ./temp/usr.local.etc/squid/errors
cp -r /usr/src/sys/i386/conf ./temp/kernel
cp -r /home/admin/scripts ./temp/

chown -R admin:wheel ./*


tar czf backup $l.tar.gz ./temp/*
rm -r /home/admin/backup/temp

exit 0

34
5. Инструменты на каждый день
5.01. Работа с файлами в shell

В этом коротком разделе мы опишем далеко не все, но очень нужные команды в shell,
которыми вы будете пользоваться каждый день. Так же опишем далеко не все, но очень
нужные ключи к этим командам. Если вы работали в MS-DOS, то некоторые вещи будут вам
знакомы. В ином случае вам потребуются некоторые вспомогательные сведения. Как и
большинство современных операционных систем, FreeBSD сохраняет файлы в
иерархической древовидной структуре. Такой же тип файловой системы используется в
системах Windows и Macintosh. Единственная разница заключается в том, что в Windows и
Macintosh используется графическое представление папок и файлов в графическом
диспетчере файлов, а в консоли FreeBSD - текстовое. В Windows или DOS при регистрации
пользователь, как правило, попадает в корневой каталог. Во FreeBSD дело обстоит иначе.
После регистрации пользователь попадает в свой начальный каталог, который расположен
на несколько уровней ниже корневого каталога. Теперь по командам:

is [ключи] [путь] - вывод содержимого каталога.


is -a - вывод полностью (со скрытыми файлами и папками);
is -1 - вывод в подробной форме (с правами, размером, датами и т.д.);
is -G - вывод в цвете (различные типы файлов отображаются разными цветами).

cd [путь] - перемещение по файловой системе (изменение текущего каталога). Не стоит


забывать, что путь может быть абсолютным (начинается с символа / - корневой
каталог в системе), а так же относительным (начинается не с символа / - путь
считается относительно текущего каталога).

pwd-для заблудившихся, вывод имени текущего каталога (полный путь).

ср [файл] [путь] - копирование файлов и каталогов.


ср -г - рекурсивное копирование каталога и всего, что в нём находится.

mv [файл] [путь] - перемещение файлов и каталогов.


mv -r - рекурсивное перемещение каталога и всего, что в нём находится.

rm [файл] [путь] -удаление файлов и каталогов.


пп -г - рекурсивное удаление каталога и всего, что в нём находится;
rm -f-удаление, не задавая вопросов;
пп -р - физическое удаление (три раза перезаписывает содержимое файла
случайной последовательностью байтов);
rm -w- попытка восстановить файл, удаленный командой rm.

df [ключи] - вывод информации о свободном месте на диске.

du [ключи] - вывод информации о размере каталогов в текущей ветви.


du -h -d l - вывод информации о размере каталогов, глубиной 1 уровень.

35
Помните, что большинство команд UNIX выполняют указанные действия над файлами и
каталогами, не задавая лишних вопросов, даже в тех случаях, когда они могут уничтожить
существующие файлы. UNIX не ведет пользователей за руку, как Windows. В UNIX по
умолчанию предполагается, что пользователь знает, что он делает, когда просит систему
выполнить что-либо. Поэтому в тех случаях, когда вы не уверены в своих действиях,
используйте опцию -i. Тогда большинство команд будет запрашивать подтверждения, если
возникнет угроза повреждения существующих файлов.

Все предыдущие команды поддерживают метасимволы и символы-заместители. Они


замещают один или несколько неизвестных символов. Три основных оператора замены,
используемые в командной строке FreeBSD:

? - совпадает с любым одиночным символом;


# - совпадает с любой последовательностью символов;
[ ] -совпадает с диапазоном символов;
[! ] - не совпадает с диапазоном символов.

Теперь несколько слов об именах файлов. Хотя технически UNIX позволяет включить в имя
файла любой символ (некоторые символы нельзя просто ввести, их следует указывать как
двусимвольные последовательности, начинающиеся с косой черты), желательно все-таки
ограничиться только буквами, цифрами, точкой, дефисом и символом подчеркивания.
Нежелательно начинать имя с дефиса, поскольку в UNIX дефис, как правило,
интерпретируется как символ, за которым следует опция (ключ). В имя можно включать и
пробелы. Однако в этом случае его необходимо заключить в кавычки, чтобы интерпретатор
мог воспринять имя целиком, а не как список нескольких файлов. Я рекомендую
воспользоваться распространенной практикой: заменять пробелы на символы
подчеркивания. Тогда имена легко читаются и не требуют кавычек при работе с ними.
Избегайте применения в именах файлов специальных символов. В противном случае,
пользуйтесь специальным escape-символом - это символ обратной косой черты «\». Он
указывает, что следующий за ним символ следует рассматривать в его первичном (а не в
специальном)значении.

Искать файлы в системе можно двумя командами:

find [путь] -name [шаблон имени файла]


locate [шаблон имени файла]

Отличаются они тем, что команда locate использует свою собственную индексную базу
файловой системы, следовательно поиск происходит намного быстрее, однако индексная
база обновляется с некоторой периодичностью, следовательно, нельзя рассчитывать на то,
что команда locate покажет только что созданный (скопированный/перемещённый) файл.
Индексную базу locate можно обновить вручную:

# /etc/periodic/weekly/310.locate

Иногда бывает нужно что-то заархивировать или разархивировать:

#107 tar czvf backup. tar. gz /etc/* - заархивировать файлы;


#108 tar xzvf backup. tar. gz -C /bkp. etc/ - разархивировать файлы.

Далее рассмотрим команды для работы с текстовыми файлами. UNIX и FreeBSD включают
множество команд обработки текстовых данных в интерпретаторе. Здесь мы рассмотрим
наиболее полезные из них:

wc [файл] - подсчет числа строк, слов и символов.

36
less [файл] - просмотр текстовых файлов.

grep [шаблон] [файл] - поиск строк в текстовом файле по определённому шаблону,


grep -i - поиск без учёта регистра;
grep -с - не выводить строки с вхождениями шаблона, а напечатать только количество
вхождений в файле; grep -v - обратить операцию и выводить строки, не включающие
указанный шаблон.

sort [файл] - сортировка строк в файле.

cut [опции] [файл] - вывод частей строк из файлов. Опции обычно имеют вид:
-f[номер поля] -d'[символ-разделитель]'

И наконец, мы подобрались к самому интересному в этом разделе - как все


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

>- перенаправить вывод слева направо;


< - перенаправить вывод справа налево;
I - конвейер.

Примеры без комментариев (догадайтесь сами):


#109 Is > listing.txt
#110 locate program | grep ports
#111 grep word < filel.txt > file2.txt
#112 less filel.txt | grep word > file2.txt
#113 cut -fl —d' ' access.log | sort | uniq -с | less
#114 cut -f1 —d' ' access.log | sort | uniq -c > hits.txt

Ну и так далее. Поэкспериментировав и потренировавшись, вы без труда овладеете


искусством управления текстовыми файлами, что очень и очень пригодится вам при
написании собственных скриптов.

5.02. Пользователи, группы и права доступа

Модель пользователей и прав доступа, применяемая во FreeBSD (и большинстве систем


UNIX), является одноуровневой. Есть три типа пользователей:
1.44. root - суперпользователь, который свободен от каких бы то ни было
ограничений;
1.45. пользователи группы wheel - пользователи, которые могут получить права
root, обычно это администраторы системы;
1.46. все остальные пользователи, права доступа которых так или иначе
ограничивают их действия в системе.

Пользователей системы можно так же разделить на реальных людей, подключающихся к


системе, и псевдопользователей (таких как bin, operator, daemon, nobody и другие).
Последние необходимы системе для того, чтобы управлять процессами. Файл для
редактирования списка пользователей: /etc/passwd, файл со списком групп пользователей
в системе: /etc/group.

Далее следует разобраться с моделью владения файлами. Все варианты UNIX имеют
одинаковую структуру: каждый файл или каталог принадлежит и пользователю, и группе.
Тем не менее это не означает, что все пользователи или члены группы имеют одинаковые
права доступа. Режим доступа к файлу задаётся строкой вида:
37
-rwxr-xr-x

Для каждой разновидности пользователей (пользователь, группа, все остальные)


существует набор битов полномочий. Эти биты предоставляют возможность читать файл,
модифицировать его и выполнять, иначе говоря, предоставляют три вида доступа: чтение
(read), запись (write) и выполнение (execute). Смысл этих битов для файлов следующий: г -
файл можно читать;
w - файл можно модифицировать, удалять и переименовывать;
х - файл можно выполнять.
Так, например, права доступа к файлу определяются записью типа -rwxr-xr-x. Первый
дефис означает, что данный объект является файлом, следующая тройка символов (rwx)
указывает права владельца файла (можно всё), вторая тройка (г-х) определяет права
членов группы, к которой принадлежит пользователь, и последние три символа (г-х)
относятся к правам всех остальных пользователей. Таким образом, в данном случае
пользователям группы, как и всем остальным, можно только читать и выполнять файл (но
не модифицировать или удалять).

Теперь рассмотрим строки, задающие права доступа к каталогам. Прежде всего, каталоги
распознаются по первому биту в строке - d. Это просто флажок, не связанный с правами
доступа. Полномочия на работу в каталоге действуют по тому же принципу, что и
полномочия на файлы, но здесь есть отличия:
г - каталог можно читать (выполнить команду Is);
w - каталог и файлы внутри него можно модифицировать, удалять и переименовывать;
х - в каталоге можно производить поиск файлов.

Так, например, запись drwxr-xr-x означает, что данный объект является каталогом (d), его
владелец может выполнять в этом каталоге любые действия, а его группа и остальные
могут только читать и выполнять поиск.

Нам осталось рассмотреть команды, модифицирующие собственность и права доступа к


каталогам и файлам:

chown [пользователь:группа] [файл] - установка пользователя и группы в качестве


владельцев файла;

chmod [режим] [файл] - установка прав доступа к файлу.

Режим можно задавать числовыми и символическими аргументами. Числовой способ


проще и удобнее, поэтому рассмотрим только его. Он заключается в установке
трехзначного восьмеричного числа, которое уникальным образом задает права доступа
для каждого типа владельца. Каждая цифра определяет режим владельца: пользователя,
группы и всех остальных. Число, задающее режим, получается путем суммирования чисел,
отвечающих битам прав доступа. Возможные значения битов:
4 -доступ на чтение (г).
2 -доступ на запись (w);
1 -доступ на выполнение (х);
о - нет доступа (-);

Таким образом, режиму "чтение и запись" соответствует 6, режиму "чтение и выполнение" -


5, а режиму "чтение, запись и выполнение" - 7. Комбинация цифр формирует трехзначное
число, задающее стандартные права доступа к файлу. Например:
0755 - всё для владельца, чтение/выполнение для группы и остальных;
0644 - чтение/запись для владельца, только чтение для группы и остальных;
0600 - чтение/запись для владельца, для группы и остальных доступа нет.
Самая первая цифра управляет "дополнительными" свойствами - задает особое
поведение файлов и каталогов при определенных обстоятельствах:
38
1.47. - обычные права доступа;
1.48. - бит устойчивости. Он устанавливается только для каталогов: владелец имеет право
удалять или переименовывать только файлы, которыми он владеет, причем лишь при
наличии права на запись в этот каталог;
2 - установить идентификатор группы, setgid. Когда такой бит установлен для
выполняемого файла, последний выполняется с правами группы, владеющей файлом, а не
с правами пользователя, запустившего его;
4 - установить идентификатор пользователя, setuid. Когда такой бит установлен для
выполняемого файла, последний выполняется с правами пользователя, владеющего
файлом, а не с правами того, кто его запустил.

Значение дополнительного бита формируется так же суммированием.

5.03. Текстовый редактор vi

Редактор vi - один из первых редакторов, разработанных для операционных систем UNIX.


Он и по сей день остается одним из самых мощных редакторов и стандартно поставляется
практически с каждой операционной системой типа UNIX. К сожалению, среди новичков
редактор vi пользуется репутацией программы, известной своей загадочностью и
трудностью в изучении. В нем отсутствует меню, и все действия осуществляются с
помощью клавиш и клавиатурных комбинаций. Понятно, что на их изучение требуется
время. Так зачем же изучать редактор vi? Есть, по меньшей мере, две причины.

Во-первых, он имеется в любой операционной системе UNIX, с которой вам быть может,
придется работать. Как знать, он может оказаться и единственным редактором в
операционной системе...

Во-вторых, когда вы изучите различные комбинации клавиш и команды, окажется, что в


вашем распоряжении очень мощное средство. Редактор vi обеспечит возможность очень
быстрой работы, так как для набора большинства команд не придется убирать руки с
базовых клавиш. Приступим к его описанию.

Сразу после запуска редактор vi будет находиться в командном режиме. В этом режиме
нажатия клавиш интерпретируются как команды редактору, а не как текст, вводимый в
документ. Чтобы переключиться в режим ввода текста, необходимо нажать одну из клавиш:
а - append (присоединить). В этом режиме вводимый текст вставляется после символа, на
котором находится курсор.
i - insert (вставить). В этом режиме вводимый текст вставляется перед символом, на
котором находится курсор.
0 - open (открыть). Это приводит к тому, что после строки, на которой находится курсор, в
текст вставляется новая строка. Затем курсор перемещается на новую строку и редактор vi
переходит в режим insert, разрешая ввод текста на новой строке.

Для возврата в командный режим, нажмите клавишу Esc.

Перемещаться по тексту в режиме ввода текста можно, как правило, с помощью курсорных
клавиш или клавиш Page Up / Page Down. Однако имеются и другие клавиши, позволяющие
перемещаться по документу в командном режиме: h - перемещает курсор влево на один
символ; j - перемещает курсор вниз на один символ; к - перемещает курсор вверх на один
символ;
1 - перемещает курсор вправо на один символ;
w - перемещает курсор вперед на одно слово;
ь - перемещает курсор назад на одно слово;
е - перемещает курсор в конец следующего слова;

39
0 - перемещает курсор в начало строки;
$ - перемещает курсор в конец строки;
) - перемещает курсор в начало следующего предложения;
( - перемещает курсор в начало предыдущего предложения;
} - перемещает курсор в начало следующего абзаца;
{ - перемещает курсор в начало предыдущего абзаца;
G - перемещает курсор в конец текущего документа;
Л
- перемещает курсор к первому символу строки, не являющемуся пробелом;
н - перемещает курсор на первую строку на экране;
1 - перемещает курсор на последнюю строку на экране.

Обратите внимание, что с каждой командой этой таблицы по умолчанию используется


число 1. Клавиша j перемещает курсор вниз на одну строку, клавиша к перемещает его
вверх на одну строку, клавиша w перемещает вправо на одно слово и так далее. Все эти
команды можно модифицировать, вводя перед ними число. Так, например, команда 5j
перемещает курсор вниз не на одну строку, а на пять. Команда 75G перемещает курсор на
75-ю строку файла, редактируемого в данный момент. А команда 5L перемещает курсор на
пятую снизу строку экрана. Данный синтаксис справедлив для всех команд, кроме Л,
которая перемещает курсор к первому символу строки, не являющемуся пробелом.

В редакторе vi клавиши Backspace и Delete не выполняют тех действий, которых от них


можно ожидать. Для удаления текста и тому подобного придется пользоваться различными
клавишами в командном режиме. Рассмотрим команды для редактирования текста:
D - удаляет текст от позиции курсора до конца строки;
dd - удаляет всю текущую строку целиком;
R - замещает текущий текст вводимым текстом, начиная с позиции курсора;
s - удаляет текущую строку и начинает ввод текста на новой пустой строке;
х - удаляет символ в позиции курсора и сдвигает следующие за ним символы влево;
х - удаляет символ перед курсором и сдвигает следующие за ним символы влево;
~ - заменяет букву на позиции курсора той же буквой другого регистра;
j - объединяет текущую строку с предыдущей;
yw - помещает в буфер слово, на котором в данный момент находится курсор;
у$ - помещает в буфер текст от текущей позиции курсора до конца данной строки;
уу - помещает в буфер всю текущую строку;
р - вставляет текст в документ после курсора;
р - вставляет текст перед курсором.

В редакторе vi имеется так же ряд команд для выполнения поиска и замены текста: /текст -
поиск в прямом направлении до первого совпадения с заданным текстом; / - повтор поиска
текста в прямом направлении до обнаружения очередного совпадения; ?текст - поиск в
обратном направлении до первого совпадения с заданным текстом; ? - повтор поиска
текста в обратом направлении до обнаружения очередного совпадения; % - перемещение
курсора на соответствующую парную скобку (для программистов); : з/текст1 /текст2 - замена
в текущей строке каждого совпадения текста1 на текст2; : %з/текст1 /текст2 - замена в
файле каждого совпадения текста1 на текст2;

И последнее, что нам осталось, - это операции над файлами и выход из редактора:
: wq - сохраняет изменения в текущем файле и осуществляет выход из редактора;
: w - сохраняет изменения в текущем файле;
: w! - сохраняет изменения в текущем файле в любом случае;
: q - осуществляет выход из редактора;
:q! - осуществляет выход из редактора в любом случае;
:е - файл загружает заданный файл в редактор для редактирования;
: е! - отбрасывает все изменения и перезагружает с диска старый вариант файла.

40
Вот в принципе и всё, что вам необходимо знать для эффективной работы с текстовыми
файлами в редакторе vi.

5.04. Программирование в shell

О том, насколько полезным является умение программировать на языке командного


интерпретатора, наверное говорить не стоит. Достаточно взглянуть только на пятый раздел
этой книги, где практически в каждой главе мы пишем собственный скрипт. Потратив время
на изучение работы интерпретатора, осознав, как он обрабатывает команды, и каким
образом вывод одной команды с помощью конвейера можно отправить на ввод другой, вы
сможете писать очень серьезные и сложные программы. Особенно хорошо это будет
получаться после изучения сотни специализированных команд FreeBSD, предназначенных
для решения узких задач. Вот шесть основных причин, по которым стоит изучать
программирование на языке командного интерпретатора в FreeBSD:
1.49. Его легко выучить. Если вы часто работаете с командной строкой FreeBSD,
вы, наверняка, уже знакомы со многими командами, используемыми в сценариях;
1.50. Он экономит время. Для решения некоторых задач, требующих часы или
даже дни программирования на С, достаточно 5-10 минут программирования на
языке интерпретатора;
1.51. Этот язык позволяет автоматизировать рутину. Скажем, если требуется
внести одно и то же изменение в 100 файлов, достаточно воспользоваться циклом
"for" для автоматизации этого процесса;
1.52. Он позволяет изучить новые полезные методы работы с системой. При
программировании вы столкнетесь с командами, о которых никогда раньше не
слышали, и узнаете о новых способах решения известных задач. Вы лучше изучите
командную строку FreeBSD и поймете, какой мощью она обладает;
1.53. Он развивает креативный потенциал. Вы всегда сможете создать нужную вам
программу на языке командного интерпретатора. Одним из главных преимуществ
FreeBSD является философия "Делай по-своему". Существует множество способов
достижения цели, и не обязательно общепринятый прием является наилучшим;
1.54. Он обучает думать. Возможно, это идеальный язык для того, чтобы научиться
программировать, поскольку он, работая со знакомыми командами, позволяет
сосредоточиться на логике программы.

В данной главе мы очень кратко пройдёмся по основным операторам и оставим читателю


возможность изучить искусство программирования в shell самостоятельно эксперименталь-
ным путём. Итак, перейдем к изучению одного из самых мощных средств FreeBSD.

По традиции обучение начинается с написания программы "Hello, World!":


# vi ./hello.sh
#!/bin/sh
# Программа "Hello, World!"
echo "Hello, World!"
exit 0
#115 chmod 0755 ./hello.sh
#116 ./hello.
sh Hello,
World!

Скрипт должен начинаться с последовательности символов #!, которая сообщает, что за


ней следует имя интерпретатора для выполнения сценария. Вторая строка в нашем
примере - это комментарий. Третья строка - это оператор echo, который выводит саму
фразу "Hello, World!" в стандартный вывод (в нашем случае экран). Последняя строка
завершает работу программы и возвращает код родительской программе. Код завершения,
41
равный 0, указывает, что программа нормально завершила работу, код, отличный от О,
сообщает об ошибке.

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

Для доступа к информации в переменной перед ее именем следует указывать символ $:


echo ${myvar}

Фигурные скобки не являются обязательными, однако они улучшают читаемость кода,


выделяя имена переменных. Использовать их или нет - решайте сами. Значение одной
переменной можно присвоить другой:
newvar=$myvar

Создание переменной среды похоже на создание переменной интерпретатора.


Единственное различие заключается в том, что ее необходимо экспортировать:
MYVAR=5 export

Теперь MYVAR является переменной среды, которая будет доступна другим программам,
запущенным из данного командного интерпретатора.

Кроме присвоения значений переменным и их использования в сценарии, командный


интерпретатор предоставляет возможность обрабатывать их ввод - команда read. Обычно
этот ввод набирается пользователем (или читается из файла, если применяется
перенаправление):
#!/bin/sh
echo -n "Please enter your name: "
read name
echo "Hello, $name!"
exit 0

Программа выводит следующее:


Please enter your name: Ivan
Hello, Ivan!

Команда read в качестве аргументов может иметь несколько переменных.

Получить информацию от пользователя можно также при чтении аргументов командной


строки. Командный интерпретатор автоматически сохраняет значения этих аргументов в
специальных переменных $1 - $9. Переменная $0 содержит имя самой программы,
переменная $@ - все аргументы, а $# - количество аргументов. Например:
# vi ./yourname.sh
#!/bin/sh
echo "The name of the program is: $0"
echo "The total number of arguments received is: $#"
echo "The complete argument string is: #@"
echo "Your first name is: $1"
echo "Your last name is: $2"
exit 0

Вот пример запуска программы:


# ./yourname.sh Ivan Petrov

42
The name of the program is: ./yourname.sh The
total number of arguments received is: 2 The
complete argument string is: Ivan Petrov Your
first name is: Ivan Your last name is: Petrov
#

Подстановка команд.
Подстановка команд позволяет запустить команду и присвоить ее вывод переменной.
Выполняемую команду следует заключить в символы \ Их не следует путать с одинарными
кавычками. Символ " представляет собой символ обратной кавычки (на клавиатуре он, как
правило, совмещен с символом тильды ~). Например, оператор:
TodayDate="date" запускает команду date и присваивает ее вывод переменной
TodayDate. После этого к значению переменной можно обращаться обычным образом.

Арифметические операции в сценариях.


Простейшие арифметические операции с целыми числами можно выполнять при помощи
команды ехрг и подстановки команд:
var3="expr varl + var2" — сложение; var3="expr varl -
var2 " — вычитание; var3="expr varl \* var2 " -
умножение; var3="expr varl / var2" — целое от
деления; var3="expr varl % var2"-остаток от
деления.
Попытка использования чисел с плавающей точкой приведет к ошибке. Кроме того,
изменение порядка операций с помощью скобок не поддерживается. Символы, имеющие
специальное значение для интерпретатора, следует экранировать (V). Команда ехрг
позволяет работать и с логическими выражениями, значением которых является истина
(ехрг возвращает 1) или ложь (ехрг возвращает 0):
ехрг varl = var2 — равно;
ехрг varl != var2— не равно;
ехрг varl \> var2 — больше;
ехрг varl \< var2— меньше;
ехрг varl \>= var2 - больше или равно;
ехрг varl \<= var2 - меньше или равно.
Не забываем экранировать специальные символы < и >. Команда ехрг не ограничивается
сравнением лишь чисел. Эта команда позволяет сравнивать также и строки. И хотя ехрг
подходит для простых операций в сценариях, возможности этой команды весьма
ограничены. Для операций с числами с плавающей точкой, а также обработки сложных
выражений, где порядок операций изменен, применяется команда be. Она представляет
собой специальный язык программирования, предназначенный для математических
действий. Применяется на практике обычно так:
var3="echo "$varl+$var2" | be -l"
var3="echo "(100-$varl)/(100+$var2)" | be -1"

Данный пример демонстрирует простейший способ использования команды be. На самом


же деле, она является мощным средством, возможности которого гораздо шире.

Циклы.
В некоторых случаях требуется повторять действие до тех пор, пока соблюдаются
определённые условия. В таких случаях стоит воспользоваться циклами. Командный
интерпретатор поддерживает три вида циклических конструкций: while, until и for.

43
Цикл while выполняет операторы, заключенные в нем, до тех пор, пока условие цикла
является истинным:
i=l
while [ $i -le 10 ]
do
echo $i i="expr $i
+ 1"
done Команда while содержит условие, заключенное в квадратные скобки. На самом
деле, они представляют собой сокращенную запись команды под названием test.
Последняя часто используется в сценариях командного интерпретатора. Команда
test использует достаточно прозрачный синтаксис, близкий к Фортрану: -eq - истина, если
операнды равны; -пе - истина, если операнды не равны; -gt - истина, если первый операнд
больше второго; -де - истина, если первый операнд больше или равен второму; -it - истина,
если первый операнд меньше второго; -le - истина, если первый операнд меньше или равен
второму.

Цикл until по смыслу противоположен циклу while. Он выполняет последовательность


операций до тех пор, пока условие не станет истинным:
i=l
until [ $i -gt 10 ]
do
echo $i
i="expr $i + 1"
done

Циклы while и until позволяют работать с логическими операторами AND и OR. Логическое
выражение AND возвращает значение истина лишь в том случае, когда оба операнда
истинны, а выражение OR - когда лишь один из операндов имеет значение истина:
while [ $varl -gt 10 ] && [ $varl -it 20 ] - истина, если 10 < varl < 20;
while [ $vari -it 10 ] || [ $vari -gt 20 ] - истина, если varl < 10 или varl > 20.
Цикл for отличается от while и until. Вместо проверки истинности условия цикл for
выполняет операторы внутри тела цикла в зависимости от количества аргументов в списке.
Цикл for содержит переменную, которая при каждой итерации получает следующий
аргумент из списка. Цикл for продолжается до тех пор, пока список не будет исчерпан:
for num in "jot 10 10 2 0 " do
sq root="echo "scale=3; sqrt($num)" | be -1
echo $sq root done

Программа выводит квадратные корни чисел от 10 до 20.

В программировании сценариев используются операторы true и false. Их единственным


назначением является возвращение значения истина (1) или ложь (0), соответственно.
Этими операторами можно воспользоваться для создания бесконечных циклов.

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


воспользоваться одним из двух следующих операторов: break или continue. Оператор
break прерывает цикл немедленно, независимо от того, выполнено ли условие окончания
цикла. Оператор continue заставляет цикл перейти к началу и проверить условие.

Условные операторы.

44
Очень часто программу нужно построить так, чтобы определённые участки кода
выполнялись только при определённых условиях. Существует две общих формы условных
операторов: if и case. Кроме того, есть ещё логические операторы AND/OR.

Операторы if проверяют числовые выражения. Если условие истинно, выполняются


операторы внутри блока if. Если оно ложно, то либо выполняются операторы внутри блока
else, либо не выполняется ничего:

#!/bin/sh
if [ $# -ge 1 ]
then
echo "You supplied $# arguments."
else
echo "Usage: $0 filel file2..." fi
exit 0

Часть then оператора if является обязательной, а часть else - нет. Операторы в блоке then
выполняются тогда, когда условие истинно. Но иногда возникает необходимость выполнить
действия лишь тогда, когда выражение ложно. В этом случае нужно воспользоваться
двоеточием:
if [$# -ge l ]
then

else
echo "Usage: $0 filel file2..." fi

В некоторых случаях возникает необходимость проверить два или несколько разных


условий и предпринять различные действия в зависимости от результатов каждого этапа.
Для этих целей используется оператор elif. Когда используется оператор elif, программа
вначале выполняет оператор if. Если его условие истинно, выполняется его код, а затем
управление передается следующему оператору (т.е. оператору, расположенному после fi).
Если условие ложно, проверяется условие в первом операторе elif. Если оно истинно,
выполняются операторы из его блока, и программа переходит к концу блока if. Если оно
ложно, проверяется следующий оператор elif и т.д. Фактически, условия проверяются до тех
пор, пока одно из них не даст значение истина. Если такого условия нет, ничего не
происходит либо запускаются операторы, заключенные в блоке else (если он присутствует).

Второй условный оператор - case, аргументом которого является переменная, содержит


блоки, выполнение которых зависит от значения переменной. Его лучше использовать при
проверке строковых значений, т.к. он сравнивает переменную с конкретными значениями,
кроме того поддерживает символы-заместители и конвейеры:
#!/bin/sh
echo "Do you really want to shut down now? (yes, no)"
read ans
case "$ans" in
[Yy] | [Yy] [Ее] [Ss] )
echo "OK. Good b y e . "
shutdown -h now
r r
[Nn] | [Nn] [Oo] )
echo "OK. Go on."

echo "Error. Please, type yes or no."

45
esac exit 0

Логические операторы AND/OR (&& и ||) в некоторых случаях заменяют операторы if. Код
завершения первой команды используется как условие запуска второй. Мы часто
пользуемся ими в командной строке. Например:
# tar czvf backup.tar.gz ./scripts && rm -r ./scripts

Если первая операция прошла успешно, то выполняется вторая. Если нет, то вторая
команда не выполняется. Другими словами: "Необходимо выполнить команды А и В. Но
если команда А невыполнима, то не следует исполнять и В". Второй пример:
# tar czvf backup.tar.gz ./scripts || echo "Operation failed."

Если первая операция прошла успешно, то вторую выполнять не нужно. Если нет, то
выполнить вторую. Другими словами: "Если А невыполнимо, исполнить В. Но если А
завершилось успешно, В не выполнять".

Функции.
Теперь стоит отметить то, что иногда приходится повторять один и тот же набор команд в
скрипте. Здесь нам на помощь приходят функции. Они представляют собой группы
операторов, вызываемые одной командой. Их можно рассматривать как "минипрограммы
внутри программ". О важности и полезности функций говорить не будем, т.к. надеемся, что
это и так понятно. Прежде всего, если определенный набор операций требуется выполнить
в нескольких местах программы, достаточно воспользоваться лишь одной командой. Во-
вторых, если вы захотите изменить то, как исполняется операция, достаточно будет внести
изменения лишь в одном фрагменте кода: on exit() {
echo "Good b y e . "
mail korney@mail.ua < ./report.txt
rm ./report.txt }

on exit

Между вызовом функции и вызовом другой программы существует важное различие.


Функция выполняется текущим интерпретатором, а отдельная программа запускается в
другой копии командного интерпретатора. Это значит, что функциям доступны и
переменные среды, и внутренние переменные вызывающей, ее программы. Отдельной
программе, исполняемой другим интерпретатором, они недоступны.

Файловые дескрипторы.
Файловые дескрипторы представляют собой числовые идентификаторы, устанавливаемые
ядром при запуске каждого нового процесса. По умолчанию командный интерпретатор
открывает три файловых дескриптора:
F.D. О STDIN. Это стандартный входной поток. Обычно ввод поступает с клавиатуры,
однако его можно перенаправить из файла или какого-либо другого источника;
F.D. 1 STDOUT. Это стандартный выходной поток. Обычно вывод поступает на экран,
однако, как вы понимаете, его также можно перенаправить;
F.D. 2 STDERR. Это стандартный поток ошибок. Обычно выводится на экран, но и его
можно перенаправить.
Для открытия файлового дескриптора используется команда exec:
#!/bin/sh
exec > ./testfile.txt
echo "Line 1 of the file"
echo "Line 2 of the file"
echo "Line 3 of the file"

46
exit 0

Оператор exec во второй строке примера перенаправляет поток STDOUT в файл testfile.txt.
В результате, операторы echo выводят информацию в testfile.txt, а не на экран, хотя в
каждом из них поток не перенаправлен явно. Если в файл нужно вывести более одной
строки текста, эффективнее использовать файловый дескриптор, а не перенаправление
вывода в каждом операторе. Этот же подход применяется при работе с файловым
дескриптором STDIN и командой read:
#!/bin/sh
exec < ./testfile.txt
while read string do
echo $string
done
exit 0

Если файл testfile.txt, созданный в предыдущем примере, существует, то программа


выведет на экран по очереди все его строки. Пример иллюстрирует важную концепцию
использования файлового дескриптора с командой read. Поскольку между
последовательными вызовами read файл не закрывается, read помнит последнюю
прочитанную строку и передвигает указатель на следующую строку файла. Таким образом,
read автоматически последовательно читает все строки файла.

Отладка сценариев.
И в завершение коснёмся отладки сценариев командного интерпретатора, которая рано
или поздно вам понадобится. Хотя интерпретатор не имеет полноценного отладчика, он
обеспечивает простейшие возможности для мониторинга всех выполняемых действий.
Трассировка включается посредством редактирования первой строки:
#! /bin/sh -xv

После этого, при запуске программы, вы будете видеть на экране последовательно все
действия, которые она выполняет.

47
5.05. Справочник по командам и конфигурационным файлам

Is Работа в файловой системе


cd Вывести содержимое каталога
pwd Перейти в каталог
ср Вывести текущий каталог
mv Копировать файлы и каталоги
touch Переместить или переименовать файлы и каталоги
mkdir Создать пустой файл
rm Создать каталог
rmdir Удалить файл или каталог
In Удалить каталог
find Создать ссылку
locate Найти файл или каталог
mount Найти файл или каталог
umount Монтировать файловую систему
tar Демонтировать файловую систему
Архивировать файлы и каталоги

adduser Работа с пользователями и правами


rmuser Создать нового пользователя
passwd Удалить пользователя
vipw Изменить пароль пользователя
sudo Редактировать файл /etc/passwd и базу данных пользователей
visudo Получить права администратора
chmod Редактировать файл /etc/sudoers
chown Изменить права доступа к файлам и каталогам
chgrp Изменить права владения файлами для пользователей и групп
Изменить права владения файлами для групп

more Работа с текстовыми файлами


less Вывести поэкранно содержимое файла
grep Вывести поэкранно содержимое файла
cat Найти и вывести шаблон в файле
wc Вывести содержимое файла (обычно используется в конвейерах)
diff Подсчитать число строк, слов и символов в файле
fmt Сравнить содержимое файлов и вывести различия
cut Преобразовать содержимое файла к формату электронного письма
head Вывести определенный столбец или поле из файла
tail Вывести первые строки файла
sort Вывести последние строки файла
vi Сортировать содержимое файла
Открыть файл в текстовом редакторе vi

man date Работа в системе


cal ps Вывести справочную информацию о программе Вывести или
изменить текущую дату и время Вывести календарь Вывести
список процессов, запущенных в системе
48
top Вывести список процессов и статистику использования ими ресурсов
kill Завершить работу процесса по идентификатору
killall Завершить работу процессов по имени программы
shutdown Остановить или перезагрузить систему
halt Остановить систему
reboot Перезагрузить систему
uptime Вывести время работы системы с момента включения или
перезагрузки
pkg_info Вывести список пакетов, установленных в системе
pkg_add Установить пакет в систему
pkg_delete Удалить пакет из системы
make Получить файлы порта и собрать его
make install Инсталлировать собранный порт
make deinstall Деинсталлировать собранный порт
make clean Удалить рабочие файлы, созданные при сборке порта
make distclean Удалить рабочие файлы, созданные при сборке порта, и дистрибутивы

ifconfi Работа в сети


g Вывести или настроить параметры сетевых
route интерфейсов
ping Создать маршрут в таблице маршрутизации
t rase Отправить тестовые пакеты и проверить соединение
route с хостом по сети
netsta Вывести маршрут к удалённому хосту
t Вывести текущую таблицу маршрутизации
nsloo Обработать dns-запрос
kup Обработать dns-запрос
dig Вывести или задать правила системы ipfw
ipfw Вывести активные соединения через интерфейс
trafsh Вывести информацию о трафике через ipfw
ow Подключиться к виртуальной консоли удалённого
tcpdu хоста
mp Копировать файлы и каталоги между хостами по
ssh сети по ssh
scp

Основ /etc/mail/virtusertable /etc/ppp/ppp.conf


ные кон /etc/rc.conf /usr/src/sys/i386/conf/GENERIC
/etc/rc.local
/etc/rc.firewall
/etc/adduser.conf
/etc/passwd /etc/m
aster, passwd
/etc/group
/etc/sudoers
/etc/resolv.conf
/etc/hosts
/etc/inetd.conf
/etc/services
/etc/crontab /etc/m
otd /etc/ftpusers
/etc/ftpchroot
/etc/namedb/named.con
f /etc/mail/freebsd.mc
/etc/mail/sendmail.cf
/etc/mail/access
/etc/mail/aliases
/etc/mail/local-host-
names
фиг автоза ы Чёрный список пользователей ftp
урац грузки Сетевой Определения корневого каталога для
ион Основ конфигурационный пользователей ftp
ные ной файл - хосты Конфигурационный файл named
фай файл Конфигурационный Основной конфигурационный файл
лы с файл inetd sendmail для правки
(без прави Конфигурационный Основной конфигурационный файл
учёт лами файл соответствия sendmail для работы
а фаерв сервисов и портов Разрешения пользоваться sendmail
порт олла Конфигурационный Псевдонимы почтовых ящиков
ов) Конфи файл сгоп Домены для которых принимать почту
О гураци Приветственное Виртуальные домены и почтовые ящики
сн онный сообщение при входе Конфигурационный файл ррр
о файл в консоль или ssh Ядро системы после инсталляции
в addus
н er 49
о Файл
й со
ф списко
а м
й пользо
л вателе
с й
п систем
а ы
р Файл
а со
м списко
ет м
р пользо
а вателе
м й
и систем
ав ыс
то парол
за ями
гр Файл
уз со
ки списко
Д м
оп групп
ол пользо
ни вателе
те й
ль систем
н ы
ы Конфи
й гураци
ф онный
ай файл
л sudo
с Сетев
ко ой
м конфи
ан гураци
д онный
а файл -
м dns
и сервер
/usr/src/sys/i386/conf/LINT Полное ядро системы со всеми возможными опциями

6. Заключение
Итак, вы установили свой собственный Интернет-сервер на базе ОС FreeBSD 6.3, с
чем вас сердечно поздравляем. Вы так же познакомились вкратце с основными
инструментами, которые могут вам пригодиться во время работы с вашими серверами. Что
теперь? А теперь, что касается FreeBSD, вам открыта дорога в любом направлении:
1.55. Вот именно теперь самое время купить новую книгу более высокого уровня -
какую-нибудь «Энциклопедию системного администратора FreeBSD». Эффект от её
прочтения теперь будет гораздо выше - вы ведь уже поработали со своим сервером
и знаете, чего можно ожидать и требовать от FreeBSD и, наверняка уже
вынашиваете какие-то идеи - осталось только их реализовать.
1.56. Именно теперь вы сможете намного более эффективно искать нужную
информацию и нужные программы для FreeBSD в сети Интернет.
1.57. Именно теперь вы перестали бояться UNIX. Всем пользователям Windows
становится немного не по себе, глядя на то, как работает системный администратор
UNIX в командной строке. И теперь вы - один из нас. :)

50