You are on page 1of 50

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

Корпоративный Интернет-сервер
на базе ОС FreeBSD.
Киев - 2006
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 8
3. Базовая настройка FreeBSD 9
1.7. Создание пользователя с правами root 9
1.8. Проверка и настройка сети (ifconfig) 9
1.9. Если провайдер выдаёт ADSL (ppp) 10
1.10. Редактирование параметров загрузки (/etc/rc.conf)
10
1.11.Конфигурирование ядра 11
1.12. Настройка обновления дерева портов (cvsup)
12
1.13. Настройка службы DNS (named)
12
1.14. Настройка почтовой службы (sendmail)
13
1.15. Установка и базовая настройка proxy-сервера (squid)
13
1.16. Обновление индексной базы поиска файлов (locate) 14
1.17. Справочная система FreeBSD 14
1.18. Завершение базовой настройки FreeBSD 14
4. Дальнейшая настройка FreeBSD 15
1.19. Антивир
усный контроль почты (sendmail + drweb) 15
1.20. Более тонкая настройка proxy-сервера (squid)
15
1.21. Защита сети -firewall (ipfw)
16
1.22. Соединения через сокет (socket)
17
1.23. Настройка ftp-сервера
17
1.24. Установка и настройка web-сервера (apache)
17
1.25. Популярная связка apache + php + mysql
18
1.26. Web-интерфейс для доступа пользователей к почте (openwebmail)
18
1.27. Держим у себя файл зоны (первичный DNS)
18
1.28. Организуем виртуальную локальную сеть (ipsec) 19
1.29. Второй способ организовать VPN (openvpn) 19
1.30. Беспрепятственное копирование файлов между серверами FreeBSD 20
1.31. Графики статистики использования сетевого трафика (mrtg) 20
1.32. Подсчёт и ограничение трафика пользователей (ipa) 21
1.33. Настройка общения с сервером по sms 25
1.34. Завершение полной настройки FreeBSD - наводим красоту 26
5. Инструменты на каждый день 27
1.35. Работа с файлами в shell
27
1.36. Пользователи, группы и права доступа
29
1.37. Текстовый редактор vi
31
1.38. Программирование в shell
33
1.39. Справоч
ник по командам и конфигурационным файлам 40
6. Заключение 42

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 вышла из проекта, и программисты Computing Science Research
Center остались без вычислительной среды, однако, к этому моменту они уже разработали
базовую структуру файловой системы, которая впоследствии превратилась в файловую
систему 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. Здесь основное

4
внимание уделялось доступности и универсальности системы. Если существует аппаратная
платформа, то наверняка имеется и работающая на ней версия NetBSD. Второй проект
породил 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 пользуются
крупнейшие компании и интенсивно используемые сайты. Даже «славная» Microsoft
использует у себя эту ОС (например, в проекте hotmail.com).

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


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

5
набрать нужную команду гораздо быстрее, чем добиться того же самого эффекта с
помощью системы разветвленных меню.
Второе основное отличие - ядро Windows невозможно изменить. Ядро - это сердце
операционной системы, оно контролирует все аспекты её работы. FreeBSD позволяет
создать новое ядро, которое будет максимально соответствовать назначению конкретной
ОС. Благодаря этому существенно возрастает быстродействие и снижаются требования к
аппаратным ресурсам. В 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. Для кого эта книга

Эта книга адресована прежде всего системным администраторам, которые решили


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

6
Для того, чтобы вы сразу смогли эффективно проделывать то, что описано в книге,
советуем с самого начала прочитать главы 5.01, 5.02 и особенно 5.03. Когда в книге
начнётся разговор о программировании скриптов, перед тем, как продолжить, прочитайте
главу 5.04. Удачи... :)

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

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

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


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

Необходимо загрузить два файла kern.flp и msfroot.flp. Если загрузочные диски


предполагается создавать в системе DOS или Windows, также потребуется программа
fdimage.exe, расположенная в каталоге: /рглЬ/FreeBSD/ tools/

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


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

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


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

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


инсталляции.

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

При загрузке с дискет или компакт-диска, попадаем в меню, в котором выбираем первый
пункт:
Skip kernel configuration and continue with installation.

Далее попадаем в меню Sysinstall. Естественно выбираем «Custom» и затем идем


разбивать жёсткий диск. Точнее сначала размечать, а потом уже разбивать. Занимаем под
FreeBSD всю область жёсткого диска, выбираем стандартный загрузчик и приступаем к
разметке.
Допустим, мы используем системный блок следующей конфигурации: CPU 500 MHz; RAM
128 Mb; HDD 10 Gb... Да, да, не удивляйтесь, этого действительно хватит. Лишь бы само
железо оказалось стабильным и не вызывало сбоев в работе. Более слабую конфигурацию
брать можно, но лучше не надо - намучаетесь. Так вот, разбиваем диск следующим
образом:
/ 512 мь ( больше не нужно )

7
swap 256 Mb ( обычно в 2 раза больше объёма ОЗУ)
/trap 256 Mb (больше не нужно)
/var з Gb (здесь будут все логи)
/home 1 Gb (домашние каталоги пользователей)
/usr всё остальное ( программы, пакеты, базы данных и т.д.)
Кто не разобрался:
#3 Раздел создаём клавишей «с»;
#4 Объём можно писать сокращённо, например: 256М, 3G и т.д.

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

2.03. Выбор Distributions и Packages

Заходим в раздел Distributions и выбираем:


Bin Crypto Man Catman Src Ports

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

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

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

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


/stand/sysinstall

Удивляемся тому, насколько быстро прошла установка системы и двигаемся дальше - ещё
много чего нужно настроить.
3. Базовая настройка FreeBSD
Если загрузка системы пройдёт удачно, вы увидите приглашение: «login: » - это значит, что
всё прошло хорошо и у вас теперь есть установленная, но пока ещё ненастроенная
FreeBSD. Заходим в систему под пользователем root без пароля и, сразу же, запомните раз
и навсегда: первое, что нужно сделать, - это установить пароль для пользователя root:
# passwd root

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


# date 200601011200 ( 2006 г., январь, 01 число, 12:00 )

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


1.40. Локальную офисную сеть 10.0.0.0/24;
1.41. Подключение к Интернет:
-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

С начала вам будет предложено ответить на некоторые вопросы, чтобы сформировать


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

Находим, раскомментируем и немного видоизменяем строчку:


%wheel ALL = NOPASSWD: ALL

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

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

Присвоим нашему серверу внутренний IP 10.0.0.1, а внешний - тот, который выдал


провайдер. Для этих целей используется команда ifconfig:
#5 ifconfig fxpO inet 10.0.0.1 netmask 255.255.255.0
#6 ifconfig edO inet 222.111.33.100 netmask 255.255.255.252

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


# route add default 222.111.33.99
9
Пропишем DNS-серверы провайдера-файл/etc/resolv.conf.
# vi /etc/resolv.conf
nameserver 222.111.0.1
nameserver 222. 111.0.2 Теперь мы должны «увидеть» и нашу локальную сеть и мир.
Проверяем обычной для всех командой ping.

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

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


передачи данных. Причина популярности - неплохие качество и скорость при дешевизне
подключения и использования. Для того, чтобы получить полноценный сервер, нам
необходимо получить статический IP-адрес, а модем установить в режиме Bridge. Затем:
# 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, ppp_login и ppp_password, стоит изменить в


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

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

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

Сейчас самое время придумать имя вашему серверу. Наверняка у вас есть какой-то домен,
частью которого вы планируете быть. Не забудьте, что «как вы сервер назовёте, так он и
будет работать»... Допустим, у вас есть почтовый домен mail.ua и вы хотите назвать свой
сервер elbrus. Пропишите в файле зоны вашего домена хост elbrus.mail.ua (как это
делается читайте в разделе 3.07) и вперёд:
# vi /etc/rc.conf
sshd_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"
10
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

Если вы используете ADSL, то нужно убрать настройки интерфейса edO и шлюза по


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

# vi /etc/rc.conf
sshd_enable="YES"
gateway enable="YES"
sendmail enable="YES"
hostname="elbrus.sint.ua"
ifconfig_fxpO="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="tunO"
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

Некоторые строки в /etc/rc.conf мы прописали наперёд, чтобы потом не останавливаться


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

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

Чтобы заработал NAT (трансляция адресов), FIREWALL (надеюсь понятно, что это) и IPSEC
(об этом далее), необходимо пересобрать ядро. Т.е. добавить кое-какие строки в кое-какой
файл и выполнить три команды:
#7 cd /usr/src/sys/i386/conf/
#8 ср GENERIC ELBRUS
#9 vi ELBRUS
options IPFIREWALL
options IPFIREWALL_DEFAULT_TO_ACCEPT
options IPDIVERT
options DUMMYNET
options IPSEC
options IPSEC_ESP
options IPSEC_DEBUG

pseudo-device gif 4
pseudo-device bpf 4
#10 config ELBRUS
#11 cd .. /.. /corapile/ELBRUS/
#12 make depend
#13 make
#14 make install

Три последние команды можно объединить в одну строку, но об этом позже:

11
# make depend && make && make install

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


запустить следующую - команды запускаются одна за другой.

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

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


библиотек на серверах поддержки FreeBSD в сети Интернет. То есть, если вам нужно
установить какую-либо программу, вы заходите по дереву портов в определённый каталог и
выполняете всего две команды - make (скачать всё, что нужно из сети, подготовить) и make
install (установить в систему). Естественно, что дерево портов желательно держать в
актуальном состоянии. В этом нам поможет программа cvsup. Установим её же из портов:
#15 cd /usr/ports/net/cvsup-without-gui/
#16 make && make install

Находим файлик ports-supfile, копируем его в свой домашний каталог и редактируем его и
запускаем процедуру обновления дерева портов:
#17 ср /usr/share/examples/cvsup/ports-supfile /home/admin/
#18 vi /home/admin/ports-supfile
*default host=cvsup2.ua.FreeBSD.org
# cvsup -g -L 2 /home/admin/ports-supfile

Вот теперь можно расслабиться, это процесс долгий.

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

Это нужно для того, чтобы наш сервер мог сам обрабатывать dns-запросы, а так же, если
понадобится, держать у себя доменные зоны. Нам нужен работающий демон named.
#19 cd /etc/namedb/
#20 /bin/sh /etc/namedb/make-localhost
#21 vi named.conf
forwarders {
222.111.0.1;
222.111.0.2;
};
# vi /etc/hosts
222.111.33.100 elbrus.mail.ua
10.0.0.1 elbrus.mail.ua

В принципе этого достаточно. Однако, можно ещё прописать у себя обратную зону нашей
локальной сети. Как правило, в 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 r
serial
28800 r
refresh
1800 r
retry
604800 r
expire
86400 ) r
minimum
IN NS e lbrus mail.ua.
$ORIGIN 0 . 10 IN-ADDR.ARPA
12
$GENERATE 1-254 $ PTR local-$.mail.ua.

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


# killall -HUP named

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

Для того, чтобы наш сервер мог принимать и отправлять почту, нужно немного подстроить
sendmail, а именно: разрешить локальной сети пользоваться им, как smtp, прописать
домены, для которых принимать почту извне, ограничить размер письма (не обязательно,
но полезно) и дать возможность забирать почту по протоколу рорЗ:
#22 cd /etc/mail/
#23 ср access.sample access
#24 vi access
10.0.0 RELAY
# vi local-host-names
mail.ua
# vi sendmail.cf
О MaxMessageSize=4096000
# make maps && make restart

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


соответствующую программу, например cucipop. Вот тут нас снова спасает дерево портов:
#25 cd /usr/ports/mail/cucipop/
#26 make && make install
#27 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.

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

Автор надеется, что читатель знает, что такое proxy и для чего он нужен. Естественно, что в
локальной сети, которой нужен доступ в Интернет, без него не обойтись. Ставим squid, и не
забываем поправить squid.conf, чтобы вашим сервером не пользовались все, кому не лень,
т.е. squid должен отвечать только на запросы вашей локальной сети.
#28 cd /usr/ports/www/squid/
#29 make && make install
#30 cd /usr/local/etc/squid/
#31 vi squid.conf
acl users src 10.0.0.0/255.255.255.0

http access allow users


http access deny all
#32 squid -z
#33 vi /etc/rc.conf
squid_enable="YES"
# /usr/local/etc/rc.d/squid.sh start

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


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

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

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

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

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


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

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

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

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


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

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

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

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


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

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

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

И настроим авто-обновление антивирусных баз:


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

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

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

http access allow good


http access deny all
# vi /usr/local/etc/squid/good.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
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

15
И наконец, если нужно фильтровать http-запросы пользователей, не пускать их на
ненужные сайты, перенаправлять их на определённые сайты при определённых условиях,
ограничивать доступ в Интернет по времени и так далее и тому подобное, то лучше всего
настроить фильтрацию при помощи программы SquidGuard:
#52 cd /usr/ports/www/squidguard/
#53 make && make install
#54 vi /usr/local/etc/squid/squid.conf
redirect program /usr/local/bin/squidGuard
redirect children 4
# vi /usr/local/etc/squid/squidGuard.conf

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


Надеемся, что читатель самостоятельно разберётся с файлом squidguard.conf при помощи
команды man. После всех манипуляций не забудьте перезапустить демон squid: # killall
-HUP squid

4.03. Защита сети -firewall

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


будем, однако не в этой книге. Предлагаем вашему вниманию написанный нами,
проверенный временем и отработанный в реальных условиях фаерволл. Не нужно
изобретать велосипед заново. Однако, если хотите, никто вас отговаривать не станет.
# vi /usr/local/etc/firewall.conf
add 100 divert natd ip from any to any via edO
add 30001 count ip from any to 222.111.33.100 in recv edO
add 30002 count ip from 222.111.33.100 to any out xmit edO
add 40100 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 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

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


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

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

16
# ipfw pipe 1 config bw 32Kbit/s

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

4.04. Соединения через сокет

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


внутрь сети по определённому порту. Например, у вас есть терминальный сервер, который
не подключён напрямую к сети Интернет, но к нему необходимо подключаться извне. Для
этих целей используем сокеты:
#58 cd /usr/ports/sysutils/socket
#59 make && make install
#60 vi /etc/services
rdp 3389/tcp
# vi /etc/inetd.conf
rdp stream tcp nowait root /usr/local/bin/socket -v 10.0.0.100 3389
# killall -HUP inetd

Теперь можно подключаться терминальным клиентом к нашему серверу на его внешний IP-
адрес (222.111.33.100) - сервер перенаправит входящее соединение внутрь нашей
локальной сети на хост 10.0.0.5.

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

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

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


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

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


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

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


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

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

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


сервер Apache. Несмотря на развитие версии 2, нам всё ещё нравится версия 1.3:

17
#61 cd /usr/ports/www/apachel3
#62 make && make install
#63 vi /etc/rc.conf
apache_enable="YES"

И это, как ни странно, всё. Осталось запустить httpd и ваш сервер будет отвечать на 80
порту. Предполагая, что у вас будет жить не один сайт, настроим сразу виртуальные хосты с
некоторыми полезными опциями (например прямой доступ к файлам в директории):
# 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>

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

Здесь писать много не будем. Отметим только, что установив некоторые программы и
библиотеки из портов, и ничего не настраивая, вы будете иметь эту самую связку:
#64 cd /usr/ports/databases/mysql51-server/
#65 make && make install
#66 cd /usr/ports/lang/php4/
#67 make && make install
#68 cd /usr/ports/databases/phpmyadmin/
#69 make && make install

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

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

Осталось подправить конфигурационные файлы httpd.conf и virtual.conf и всё - можно


пользоваться.

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

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


файл своей зоны. Почему бы не сделать это у себя, т.е. выступить первичным сервером
своего доменного имени. А вторичный взять на каком-либо бесплатном сервисе, например
secondary.net.ua:
# vi /etc/namedb/named.conf

18
zone "admin.kiev.ua" { type master; file
"/etc/namedb/domains/admin.kiev.ua'
};

# vi /etc/namedb/domains/admin.kiev.ua
$TTL 10800
@ IN SOA ns.admin.kiev.ua . root.admin.kiev.ua
2006010101 10800 ; Serial
3600 604800 86400 ; Refresh
) ; Retry
; Expire
; Minimum
@ IN NS ns.admin.kiev.ua .
@ IN NS ns.secondary.net . ua.
@ IN MX 10 ns.admin.kiev.ua.
@ IN A 222.111.33.100
ns IN A 222.111.33.100
office IN A 222.111.33. 100
www IN CNAME ! ns
# killall -HUP named

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


# ipfw add 65000 allow tcp from 193.201.116.2 to me setup

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

Теперь представьте себе, что у вас есть второй удалённый офис. Он так же подсоединён к
сети Интернет, однако, вам этого мало. Вы хотите соединить две локальные сети офисов в
единую виртуальную локальную сеть и иметь доступ с любого компьютера одного офиса на
любой компьютер и принтер другого. Построим такую сеть (VPN) средствами IPSec.
Необходимые опции в ядро мы уже включили выше. Пусть второй офис имеет параметры:
1.42. Локальную офисную сеть 192.168.1.0/24;
1.43. Подключение к Интернет IP-адрес: 111.111.11.1;
Для организации VPN нам необходим будет FreeBSD сервер, аналогичный нашему. Теперь
пишем у нас:
# vi /etc/rc.conf
ipsec enable="YES"
gif interfaces="gif0"
gifconfig_gif0="22 2.111.33.100 111.111.11.1"
ifconfig_gifO="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 allow ip from me to 111.111.11.1
add allow ip from 111.111.11.1 to me
add allow ip from 10.0.0.0/24 to 192.168.1.0/24
add allow ip from 192.168.1.0/24 to 10.0.0.0/24

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


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

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

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

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

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

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


# cat /root/.ssh/identity.pub | ssh root@192.168.1.1 'cat »
/root/.ssh/authorized_keys'
# cat /root/.ssh/id_rsa.pub | ssh root@192.168.1.1 'cat »
/root/.ssh/authorized_keys2'
# cat /root/.ssh/id_dsa.pub | ssh root@192.168.1.1 'cat »
/root/.ssh/authorized_keys2'

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


# scp /usr/local/etc/mrtg/www/* root@222.Ill.33.100:/home/raph/mrtg/

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

Весьма небесполезная программа mrtg построит вам любые графики любых параметров,
которые можно измерять с течением времени. Мы же будем использовать её в связке с
snmp для построения графиков загрузки нашего Интернет-канала:
#75 cd /usr/ports/net-mgmt/net-snrap/
#76 make && make install
#77 cd /usr/ports/net-mgmt/mrtg/
#78 make && make install
#79 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.local
/usr/local/sbin/snmpd
# vi /etc/crontab
*/5 * * * * root /usr/local/bin/mrtg /usr/local/etc/mrtg/mrtg.cfg
# killall -HUP cron

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

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


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

Теперь нужно добавлять правила ipfw для того, чтобы ipa снимала с них информацию о
проходящем объёме трафика. Такие два правила у нас уже есть - они считают общий
объём входящего и исходящего внешнего трафика нашего сервера. После этого нужно
создать ipa.conf и ipastat.conf:
# vi /usr/local/etc/firewall.conf

add 30001 count ip from any to 222.111.33.100 in recv edO


add 30002 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 30001 {
ipfw:rules = 30001;
ipfw:maxchunk = IOC-
info = "IP incoming";
}
rule 30002 {
ipfw:rules = 30002;
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 и наблюдаем за подсчётом проходящих по правилам


фаерволла байтов:
# /usr/local/bin/ipa
21
# ipastat -q -r 30001 | grep Total
* 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
n="expr 33000 + $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
echo " rule $n {" » /usr/local/etc/ipa.conf
echo " ipfw:rules = $n;" >> /usr/local/etc/ipa.conf ipfw:maxchunk =
echo " 10G;" >> /usr/local/etc/ipa.conf info = \"WWW incomingV; " >>
echo " /usr/local/etc/ipa. conf
echo " }" » /usr/local/etc/ipa.conf
fi
fi
i="expr $i + 1" done
if [ $f -eq 1 ] then
killall -HUP ipa fi
echo " "
echo "Net Lookup Done!!!" exit 0

22
Теперь
-q
| напишем
-i -fl
| cut
mail $m -d'$nскрипт
-r | grepдляTotal
проверки объёма
| cut -f4 скачанного трафика в текущем месяце и
| mailсравнения
f2 его с назначенной пользователю квотой: # vi
-d'
~/scripts/ipa_check_quotas.sh
#!/bin/sh
f3
net="10.0.0"
ipfw show > /home/raph/scripts/ipfw.txt
exec < $1
while read str
do
echo $str echo $str | cut
echo $str | cut expr
21000 + $i" expr 33000 +
$i" date | cut -f2 -d' '"
="/usr/local/bin/ipastat
="expr $sl" ="expr $sl /
1024" ="expr $sl / 1024"
= "less /home/raph/scripts/ipfw.txt | grep $1 | cut -fl -d'
[ "$s2" ]

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
ipfw add $1 deny tcp from $net.$i to me 3128 echo "Your
www access was blocked. Your quota is $q Mb. fi else
if [ "$s2" ]
then
ipfw delete $1
echo "Your www access was opened. Your quota is $q Mb.' fi fi
done exit 0 # vi ~/scripts/quotas.conf 7:600:korney@mail.ua
15:200:jurist@mail.ua

Несложно понять, что в случае превышения квоты, система ipfw просто


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

23
Второй вариант - при достижении определённого объёма в текущем месяце снизить
скорость пользователю до безопасной. Этот вид воспитания наверное более демократичен
и красив. Принцип написания тот же, однако в данном случае обойдёмся без отдельного
файла с квотами:
# vi ~/scripts/ipa_check_pipe.sh
#!/bin/sh
net="10.0.0"
ipfw show > /home/raph/scripts/ipfw.txt
ipfw show | grep count\ tcp > /home/raph/scripts/ipfw .txt
exec < /home/raph/scripts/ipfw .txt
while read str
do
q="expr $1"
n="echo $str | cut -fl -d' '
i="expr $n - 33000"
p="expr 39000 + $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/raph/scripts/ipfw.txt | grep $p | cut -fl -d' '
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 fi else
if [ "$s2" ]
then
ipfw delete $p fi fi
done exit 0

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


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

Кому хочется - может комбинировать эти два метода как угодно. И не забудьте добавить всё,
что вы написали в сгоп:

24
# vi /etc/crontab
0 * * * * root /home/raph/scripts/ipa check network.sh 5
* * * * root /home/raph/scripts/ipa check pipe.sh 150

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

В некотором роде полезную, а в основном конечно же просто для «прикола», вещь можно
написать при помощи скриптов shell. Это отправка команд вашему серверу при помощи
обычных sms с вашего мобильного телефона. Для начала нужно создать почтовый адрес
(например sms@mail.ua) специально для приёма команд (ведь sms сообщение будет
попадать на ваш сервер, как обычное письмо) и прописать алиас, чтобы письмо
сохранялось, как текстовый файл в системе, который, собственно и будет обрабатывать
наш скрипт:
# vi /etc/mail/aliases
sms: raph, /sms/sms.txt
#86 newaliases
#87 mkdir /sms
#88 chown mailnull:mailnull /sms
#89 chmod 0700 /sms
#90 vi /etc/crontab
*/2 * * * * 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. Скрипт запускается каждые 2
минуты и проверяет, было ли получено письмо. Если да, то проверяет с вашего ли
телефона и верен ли формат команд. Если всё ОК - выполняется команда и отправляется
ответ. Ничего сложного. Формат сообщения должен иметь следующий вид:
sms@mail.ua CMD:ipfw add 50 deny ip from any to 10.0.0.3
или:
sms@mail.ua RBT: now Вы можете добавлять свои дополнительные условия
(например ещё пароль) и вообще модифицировать работу скрипта как хотите. Главное -
идея. :)

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

Теперь, когда ваш сервер полностью настроен и готов к тому, чтобы вы про него
благополучно забыли, самое время сделать себе лично приветствие при входе на сервер: #
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 ~/bkp/bkp.sh
#!/bin/sh
ср -г /home/raph/scripts ./
ср -г /etc ./
ср -г /usr/local/etc ./usr.local.etc
ср /usr/src/sys/i386/conf/* ./
rm ./GENERIC
rm ./LINT
cp /usr/local/share/snmp/snmpd.conf ./
chown raph:wheel ./*
chown raph:wheel . / * / *
chown raph:wheel . / * / * / *
chown raph:wheel . / * / * / * / *
chown raph:wheel . / * / * / * / * / *
exit 0

26
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.

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

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

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


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

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

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

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


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

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

# /etc/periodic/weekly/310.locate

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

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


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

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

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

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

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


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

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

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

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


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

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


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

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


#93 Is > listing.txt
#94 locate program | grep ports
#95 grep word < filel.txt > file2.txt
#96 less filel.txt | grep word > file2.txt
#97 cut -fl —d' ' access.log | sort | uniq -с | less
#98 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 имеют
одинаковую структуру: каждый файл или каталог принадлежит и пользователю, и группе.
Тем не менее это не означает, что все пользователи или члены группы имеют одинаковые
права доступа. Режим доступа к файлу задаётся строкой вида: -rwxr-xr-x

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


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

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

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

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

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


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

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


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

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

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


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

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


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

30
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 - перемещает курсор вперед на одно слово;
ь - перемещает курсор назад на одно слово;
е - перемещает курсор в конец следующего слова;
о - перемещает курсор в начало строки;
$ - перемещает курсор в конец строки;
) - перемещает курсор в начало следующего предложения;
( - перемещает курсор в начало предыдущего предложения;

31
} - перемещает курсор в начало следующего абзаца;
{ - перемещает курсор в начало предыдущего абзаца;
G - перемещает курсор в конец текущего документа;
Л
- перемещает курсор к первому символу строки, не являющемуся пробелом;
н - перемещает курсор на первую строку на экране;
L - перемещает курсор на последнюю строку на экране.

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


число 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! - осуществляет выход из редактора в любом случае;
:е - файл загружает заданный файл в редактор для редактирования;
: е! - отбрасывает все изменения и перезагружает с диска старый вариант файла.

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

32
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
#99 chmod 0755 ./hello.sh
#100 ./hello.
sh Hello,
World!

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


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

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

34
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.

Цикл while выполняет операторы, заключенные в нем, до тех пор, пока условие цикла
является истинным:
i=l
while [ $i -le 10 ]
do

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

Цикл 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 заставляет цикл перейти к началу и проверить условие.

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

36
Операторы 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."


r r
esac
exit 0

37
Логические операторы 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"
exit 0

38
Оператор 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

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

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

Работа в сети
ifconfig Вывести или настроить параметры сетевых интерфейсов
route Создать маршрут в таблице маршрутизации
ping Отправить тестовые пакеты и проверить соединение с хостом по сети
t rase route Вывести маршрут к удалённому хосту
netstat Вывести текущую таблицу маршрутизации
nslookup Обработать dns-запрос
dig Обработать dns-запрос
ipfw Вывести или задать правила системы ipfw
trafshow Вывести активные соединения через интерфейс
tcpdump Вывести информацию о трафике через ipfw
ssh Подключиться к виртуальной консоли удалённого хоста
scp Копировать файлы и каталоги между хостами по сети по ssh

Основ фигурационные файлы (без учёта портов)


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

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

42