Корпоративный Интернет-сервер
на базе ОС FreeBSD.
Киев - 2008
1. Введение 4
1.1. Краткая история FreeBSD 4
1.2. Преимущества FreeBSD 5
1.3. Для кого эта книга 6
2. Инсталляция FreeBSD 7
2.1. Создание загрузочных дискет 7
2.2. Создание разделов на жёстком диске 7
2.3. Выбор Distributions и Packages 9
3. Базовая настройка FreeBSD 10
3.1. Создание пользователя с правами root 10
3.2. Проверка и настройка сети (ifconfig) 10
3.3. Если провайдер выдаёт ADSL (ppp) 11
3.4. Редактирование параметров загрузки (/etc/rc.conf) 12
3.5. Конфигурирование ядра 13
3.6. Настройка обновления дерева портов (cvsup) 13
3.7. Настройка службы DNS (named) 14
3.8. Настройка почтовой службы (sendmail) 15
3.9. Установка и базовая настройка proxy-сервера (squid) 16
3.10. Обновление индексной базы поиска файлов (locate) 16
3.11. Справочная система FreeBSD 16
3.12. Завершение базовой настройки FreeBSD 17
4. Дальнейшая настройка FreeBSD 18
4.1. Антивирусный контроль почты (sendmail + drweb) 18
4.2. Работа почты по протоколу IMAP (sendmail + dovecot) 18
4.3. Борьба со спамом (sendmail + spamassassin) 19
4.4. Настройка ftp-сервера (ftpd) 21
4.5. Защита сети – firewall (ipfw) 22
4.6. Более тонкая настройка proxy-сервера (squid) 23
4.7. Установка и настройка web-сервера (apache) 25
4.8. Популярная связка apache + php + mysql 25
4.9. Web-интерфейс для доступа к почте (openwebmail, squirrelmail) 26
4.10. Держим у себя файл зоны (первичный DNS) 26
4.11. Соединения через сокет (socket) 27
4.12. Организуем виртуальную локальную сеть (ipsec) 27
4.13. Второй способ организовать VPN (openvpn) 27
4.14. Беспрепятственное копирование файлов между серверами FreeBSD 28
4.15. Графики статистики использования сетевого трафика (mrtg) 28
4.16. Подсчёт и ограничение трафика пользователей (ipa) 29
4.17. Настройка общения с сервером по sms 33
4.18. Завершение полной настройки FreeBSD – наводим красоту 34
5. Инструменты на каждый день 35
5.1. Работа с файлами в shell 35
5.2. Пользователи, группы и права доступа 37
5.3. Текстовый редактор vi 39
5.4. Программирование в shell 41
5.5. Справочник по командам и конфигурационным файлам 48
6. Заключение 50
3
1. Введение
1.01. Краткая история FreeBSD
4
Второй проект породил FreeBSD. В этой разработке внимание было сконцентрировано на
том, чтобы система стала проще в использовании. Иначе говоря, эта система была
ориентирована на широкий круг пользователей и на платформу Intel x86. Сегодня FreeBSD
– самая известная UNIX-система из семейства BSD.
Причин для того, чтобы использовать в своих задачах FreeBSD масса. Рассмотрим
же самые основные ее преимущества и недостатки.
Итак, главным преимуществом FreeBSD мы, безусловно, считаем её стабильность.
По данным компании Netcraft (netcraft.com), изучавшей сайты с самым продолжительным
календарным временем беспрерывной работы, из 50 первых в её списке сайтов 47
функционирует под управлением FreeBSD. С момента последней перезагрузки Web-
сервера №1 прошло уже более 5 лет! И, конечно же, он работает под FreeBSD.
Второе неоспоримое преимущество – это то, что FreeBSD бесплатная система, не
обременяющая пользователя дорогой лицензией. Вы можете бесплатно установить копию
FreeBSD на всех своих компьютерах, сколько бы их ни было. Если вы устанавливаете
сервер, вам не потребуется платить за каждое дополнительное сетевое подключение, как в
некоторых коммерческих операционных системах.
Третье – это доступность тысяч бесплатных пакетов прикладных программ всегда в
режиме online! Эти свободно распространяемые программы элементарно устанавливаются
из дерева портов всего двумя командами – система сама найдёт нужные дистрибутивы и
патчи в сети и скомпилирует всё, что нужно на вашу FreeBSD. Требуется только
подключение к Интернет.
Четвёртое – это открытость системы. Доступно всё дерево исходного кода ОС
FreeBSD, в код можно вносить изменения, выполнять любые проверки и т.д.
Ну и наконец, показателем качества является то, что системой FreeBSD пользуются
крупнейшие компании и интенсивно используемые Web-сервисы.
5
аппаратным ресурсам. В Windows же предпочтение отдается простоте эксплуатации, а не
производительности и эффективному использованию аппаратных средств.
Что касается Linux, то об этой системе сейчас знают все, впрочем, как и о Windows.
В последнее время она стала особенно популярной. Фактически Linux – это клон UNIX. Как
и FreeBSD, это открытая операционная система, разработанная добровольцами из разных
стран мира. У FreeBSD и Linux много общего, однако, для Linux создано больше программ,
чем для FreeBSD, но последняя, в свою очередь, позволяет запускать практически все
программы, разработанные для Linux. Более того, под FreeBSD они работают даже
быстрее, чем под Linux. Что касается политики разработки и поддержки, то у FreeBSD
только один дистрибьютор, а у Linux их более 30. FreeBSD будет работать одинаково на
любой системе. В случае с Linux это не так. У каждого дистрибьютора свой подход, что
нередко вводит пользователей в заблуждение, когда они переходят с одного дистрибутива
Linux на другой. FreeBSD является полноценной ОС, поддерживаемой основным составом.
Linux – это только ядро, поддерживаемое Линусом Торвальдсом (создателем Linux).
Компании, занимающиеся распространением Linux, комплектуют свои дистрибутивы целым
рядом программ, специально разработанных для Linux и, естественно, каждый
дистрибьютор имеет собственное мнение относительно того, что должно входить в
дистрибутив. Кроме того, процесс обновления кода FreeBSD отслеживается и
координируется намного тщательнее, чем в Linux. Для большинства пользователей это
позитивное явление, поскольку они уверены в том, что код был протестирован
специалистами на отсутствие проблем. Поскольку в системе FreeBSD поддерживается
одно дерево исходного кода, она стабильнее Linux и в большей степени соответствует
производственным целям. Основным недостатком FreeBSD, вызванным таким подходом,
является то, что нововведения допускаются в систему медленней, чем в Linux. Но есть
выбор: либо вы предпочтёте стабильность и неприступность ОС, либо остановите свой
выбор на модных вещичках и новых игровых устройствах, пожертвовав ради этого
надежностью.
6
И последнее, в данной книге мы используем дистрибутив FreeBSD версии 6.3 –
последней вышедшей стабильной версии на момент написания книги.
Удачи… :)
2. Инсталляция FreeBSD
В офисных условиях ОС FreeBSD можно установить двумя основными способами – с
загрузочных CD-дисков, либо с ftp-сервера, однако, в последнем случае, необходимо
создать ещё загрузочные дискеты. Если вы планируете устанавливать ОС с CD-дисков, то
можете пропустить следующий раздел о загрузочных дискетах.
Необходимо загрузить файл boot.flp и файлы kern1.flp, kern2.flp, kern3.flp. Если загрузочные
диски предполагается создавать в системе DOS или Windows, также потребуется
программа fdimage.exe, расположенная в каталоге:
/pub/FreeBSD/tools/
7
При загрузке на экране появится текстовое меню для выбора варианта загрузки. По
умолчанию выбирается пункт 1. Boot FreeBSD, после чего попадаем в меню Sysinstall
(рис.1). Естественно выбираем «Custom» и затем идем разбивать жёсткий диск – меню
«Partition». Попадаем в программу, чем-то напоминающую fdisk для DOS. Подсказки по
меню расположены внизу экрана. Основные команды – клавиша «C» (создать раздел), «D»
(удалить раздел). Советуем сразу нажать «A» (использовать весть диск). Выходим отсюда
клавишей «ESC», выбираем стандартный загрузчик (Standard) и приступаем к разметке –
пункт меню «Label».
Допустим, мы используем системный блок следующей конфигурации: CPU 800 MHz; RAM
256 Mb; HDD 10 Gb. Можно взять системный блок ещё слабее, но лучше не надо. Так вот,
мы попадаем в ещё одну утилиту, напоминающую fdisk. Подсказки так же отображены
внизу экрана. Последовательность действий следующая: нажимаем «C» (создать),
определяем размер (например 512M или 2G), выбираем «file system» это у нас будет или
«swap» и определяем имя файловой системы, начиная от корневого каталога. Первым
нужно создать корневой каталог ( / ), затем swap, затем все остальные. Можно сразу
нажать «A» (автоматическое разбиение), тогда система сама разобьёт вам диск, как
посчитает нужным. Если что-то создали не так, нажмите «D» (удалить). В итоге должно
получиться нечто, похожее на рис.2.
8
желательно не меньше 2Gb. В принципе у каждого системного администратора своя
манера разбивать место на HDD, всё приходит с опытом.
Выходим отсюда (ESC) и двигаемся в меню «Distributions».
И это почти всё уже. Нам остаётся выбрать тип установки – с ftp или компакт-диска (меню
«Media») и, если ставим с ftp, то надо выбрать источник установки ftp-сервер ну и
настроить сеть в соответствии с вашими текущими параметрами для того, чтобы до этого
самого ftp можно было добраться (IP-адрес, шлюз, DNS).
После установки этих пакетов остаётся выбрать свой часовой пояс – меню «Time Zone» и
всё готово. Выходим из программы Sysinstall и перезагружаемся (предварительно вытащив
дискеты и CD-диски). Если система выдает вам приглашение «login:», то всё прошло
успешно (рис.3).
9
Так как вся работа в системе FreeBSD будет происходить в текстовом режиме, то и
скриншоты в книге, в принципе, больше не имеют смысла, а значит «картинок» больше не
будет. Продолжим.
Система последовательно будет задавать вопросы о логине, полном имени и т.д. В ответ
на вопрос о группе, введите wheel – это название администраторской группы. В ответ на
вопрос о shell, введите bash. Всё остальное можно оставить, как есть. Не забудьте создать
себе сразу пароль. Далее нужно разрешить пользователям из группы wheel получать в
системе администраторские права:
# visudo
Сохранить и выйти из редактора vi – команда: :wq [Enter]. Здесь и далее – для того, чтобы
понять, как работать в текстовом редакторе vi, прочитайте главу 5.03.
Теперь можно и даже нужно выйти из системы (Ctrl-D) и зайти уже под своим именем.
Никогда не работайте в UNIX под пользователем root – на то есть много причин и, кроме
того, это считается плохим тоном. После входа в систему, получаем права root:
$ sudo –s
#
10
Вы должны увидеть список сетевых интерфейсов системы, среди которых есть ваши
сетевые карты (fxp0 и ed0). Присвоим нашему серверу внутренний IP 10.0.0.1, а внешний –
тот, который выдал провайдер. Для этих целей используется команда ifconfig:
# ifconfig fxp0 inet 10.0.0.1 netmask 255.255.255.0
# ifconfig ed0 inet 222.111.33.100 netmask 255.255.255.252
Теперь мы должны «увидеть» и нашу локальную сеть и мир. Проверяем обычной для всех
командой ping:
# ping freebsd.org
PING freebsd.org (69.147.83.40): 56 data bytes
64 bytes from 69.147.83.40: icmp_seq=0 ttl=41 time=207.519 ms
64 bytes from 69.147.83.40: icmp_seq=1 ttl=46 time=201.388 ms
. . .
provider_name:
set device PPPoE:ed0
set authname ppp_login
set authkey ppp_password
set dial
set login
add default HISADDR
При этом в системе появится виртуальный сетевой интерфейс tun0, и весь трафик
логически будет проходить именно через него, а не через ed0. В рамках данной книги мы
будем описывать традиционное подключение к сети Интернет, т.е. работать с
11
существующими физическими интерфейсами ed0 и fxp0. Таким образом, если у вас ADSL,
то просто меняйте в дальнейших сетевых настройках ed0 на tun0 там, где это нужно.
Всё, что мы сделали до этого момента вручную, нужно прописать в файле /etc/rc.conf – это
основной файл параметров загрузки системы. Сейчас самое время придумать имя вашему
серверу. Наверняка у вас есть какой-то домен, частью которого вы планируете быть. Не
забудьте, что «как вы сервер назовёте, так он и будет работать»… Допустим, у вас есть
почтовый домен mail.ua и вы хотите назвать свой сервер elbrus. Пропишите в файле зоны
вашего домена хост elbrus.mail.ua (как это делается читайте в разделе 3.07) и вперёд:
# vi /etc/rc.conf
sshd_enable="YES"
inetd_enable="YES"
gateway_enable="YES"
sendmail_enable="YES"
hostname="elbrus.mail.ua"
ifconfig_fxp0="inet 10.0.0.1 netmask 255.255.255.0"
ifconfig_ed0="inet 222.111.33.100 netmask 255.255.255.252"
defaultrouter="222.111.33.99"
named_enable="YES"
natd_enable="YES"
natd_interface="ed0"
firewall_enable="YES"
firewall_type="/usr/local/etc/firewall.conf"
# vi /usr/local/etc/firewall.conf
add divert natd ip from any to any via ed0
# vi /etc/rc.conf
sshd_enable="YES"
gateway_enable="YES"
sendmail_enable="YES"
hostname="elbrus.sint.ua"
ifconfig_fxp0="inet 10.0.0.1 netmask 255.255.255.0"
ppp_enable="YES"
ppp_mode="background"
ppp_profile="provider_name"
named_enable="YES"
natd_enable="YES"
natd_interface="tun0"
firewall_enable="YES"
firewall_type="/usr/local/etc/firewall.conf"
# vi /usr/local/etc/firewall.conf
add divert natd ip from any to any via tun0
12
Некоторые строки в /etc/rc.conf мы прописали наперёд, чтобы потом не останавливаться
ещё раз на этом файле, читайте дальше и вы должны понять что к чему. Далее в книге мы
не будем больше так подробно останавливаться на вариациях с ADSL, т.к. надеемся, что
для читателя это элементарно и понятно. Итак, настраиваем дальше.
Это очень ответственная процедура и перед тем, как начать редактировать ядро, нужно
для самого себя понять «зачем». В нашем случае нужно включить поддержку NAT на
уровне ядра (для работы в режиме прозрачного шлюза), FIREWALL (фильтр сетевых
пакетов) и IPSEC (для связки удалённых хостов в виртуальную сеть). Текстовый файл
ядра, которое работает сейчас, находится здесь: /usr/src/sys/i386/conf/GENERIC.
Скопируем его и добавим нужные нам строки в соответствующие разделы файла:
# cd /usr/src/sys/i386/conf/
# cp GENERIC ELBRUS
Четыре последние команды можно объединить в одну строку (об операторе && позже):
# make cleandepend && make depend && make && make install
13
установке) и make install (установить в систему). Естественно, что дерево портов
желательно держать в актуальном состоянии. В этом нам поможет программа cvsup.
Установим её же из портов:
# cd /usr/ports/net/cvsup-without-gui/
# make && make install
Находим файл ports-supfile, копируем его в свой домашний каталог, редактируем его и
запускаем процедуру обновления дерева портов:
# cp /usr/share/examples/cvsup/ports-supfile /home/admin/
# vi /home/admin/ports-supfile
. . .
*default host=cvsup2.ua.FreeBSD.org
# cvsup -g -L 2 /home/admin/ports-supfile
Это нужно для того, чтобы наш сервер мог сам обрабатывать dns-запросы пользователей,
а так же, если понадобится, держать у себя доменные зоны. Нам нужен правильно
работающий демон named, подправим его конфигурационный файл (нужно найти,
раскомментировать и отредактировать раздел forwarders):
# cd /etc/namedb/
# vi named.conf
forwarders {
222.111.0.1;
222.111.0.2;
};
В принципе этого достаточно. Однако, можно ещё прописать у себя обратную зону нашей
локальной сети. Напомним в двух словах, что прямой DNS-запрос – это когда нужно узнать
IP-адрес по имени хоста, а обратный – когда нужно узнать имя хоста по его IP-адресу.
Некоторые программы (например sshd), при обращении к ним по сети, пытаются узнать
имя хоста, который к ним обращается и, если долго не получают ответа, могут завершиться
по таймауту. Обратная зона нашей локальной сети нужна для того, чтобы наш сервер
каким-то образом присваивал имена нашим локальным хостам. Как правило, в 99,9%
случаев, это не нужно, однако отметить стоит:
# vi named.conf
zone "0.0.10.IN-ADDR.ARPA" {
type master;
file "0.0.10.rev";
};
# vi 0.0.10.rev
$TTL 86400
0.0.10.IN-ADDR.ARPA. IN SOA elbrus.mail.ua. root.elbrus.mail.ua. (
20060606 ; serial
28800 ; refresh
1800 ; retry
604800 ; expire
86400 ) ; minimum
IN NS elbrus.mail.ua.
$ORIGIN 0.0.10.IN-ADDR.ARPA.
$GENERATE 1-255 $ PTR local-$.mail.ua.
14
Можно тут же локально проверить, как работает ваш named. Следующая команда
выполнит dns-запрос к вашему серверу и вы должны увидеть ответ:
# dig @127.0.0.1 freebsd.org A
Для того, чтобы наш сервер мог принимать и отправлять почту, нужно немного поработать
с настройками sendmail, а именно: разрешить из локальной сети пользоваться им, как
smtp, прописать домены, для которых принимать почту извне, ограничить размер письма
(не обязательно, но полезно). Кроме того, нужно дать возможность пользователям
забирать почту по протоколу pop3. Итак:
# cd /etc/mail/
# cp access.sample access
# vi access
. . .
10.0.0 RELAY
# vi local-host-names
mail.ua
# vi sendmail.cf
. . .
O MaxMessageSize=4096000
# make maps && make restart
Чтобы создать почтовый ящик, нужно просто создать пользователя в системе. Если этот
пользователь создается только ради почты (ни ftp, ни shell ему не нужен), то можно не
пользоваться командой adduser, а получить прямой доступ к системной базе
пользователей и паролей:
# vipw
admin:3CpZ$jX:1001:0::0:0:User &:/home/admin:/usr/local/bin/bash
info:W3Y$vX0:7001:777::0:0:User &:/nonexistand:/sbin/nologin
15
Если вы хотите назначить псевдонимы почтовым ящикам – используйте файл
/etc/mail/aliases. Если же вы собираетесь принимать почту на одном сервере для разных
почтовых доменов и, при этом, хотите разделить пользователей – используйте файл
/etc/mail/virtusertable. После редактирования этих файлов, не забывайте сделать:
В UNIX-системах есть хорошая программа поиска файлов – locate. Однако, для того, чтобы
она работала, необходимо создать индексную базу файловой системы, которая
обновляется автоматически один раз в неделю, но, так как мы только установили наш
сервер, её ещё попросту нет. Команда для создания или ручного обновления следующая:
# /etc/periodic/weekly/310.locate
Теперь можно пользоваться командой locate для поиска файлов по всей системе:
# locate squid.conf
16
# man locate
Если не понятно, как пользоваться справкой, то есть даже для тех, кто в танке:
# man man
Вот собственно и всё, что касается основной базовой настройки системы. Когда закончатся
процессы компиляции нового ядра и обновления портов, просто перегрузите сервер, чтобы
запустилось собственно новое ядро, а с ним firewall, natd и всё остальное. Перегружаем
сервер любой из следующих команд:
# reboot
или:
# shutdown –r now
Как вы догадались, перегружать сервер кнопкой Reset не рекомендуется, т.к. хоть FreeBSD
и надёжнее Windows, но всё-таки файловая система есть и там и там, а с любой файловой
системой завершать работу следует корректно. Для выключения компьютера используйте:
# halt
или:
# shutdown –h now
17
Для того, чтобы вносить какие-либо изменения в работу вашего сервера, совсем не
обязательно иметь постоянный доступ к консоли. Используйте программу PuTTY, которая
устанавливается на Windows для удалённого администрирования FreeBSD.
И, конечно же, это далеко не всё, что вам может понадобиться, и что вы можете получить,
работая с ОС FreeBSD. Движемся дальше.
Раз уж у нас появился сервер приёма электронной почты, то было бы неплохо сразу
настроить и антивирусный контроль входящих и исходящих писем. Использовать будем
антивирус DrWeb, т.к. он элементарно устанавливается из портов и не создаёт проблем в
процессе дальнейшей работы:
# cd /usr/ports/security/drweb-sendmail/
# make && make install
# vi /etc/mail/sendmail.cf
# Input mail filters
O InputMailFilters=drweb-filter
Xdrweb-filter, S=local:/var/drweb/run/drweb-smf.skt, F=T,
T=S:320s;R:320s;E:1h
# killall sendmail
# /usr/local/etc/rc.d/drwebd start
# /usr/local/etc/rc.d/002.drweb-smf.sh start
# cd /etc/mail/
# make start
Для чего это нужно? Очень часто бывает так, что пользователь работает со своим
почтовым ящиком с разных компьютеров и при этом пользуется разными почтовыми
клиентами. В этом случае необходимо, чтобы вся почта пользователя находилась на
сервере. При этом, каждый раз, подключаясь к почтовому серверу, пользователь получает
только заголовки всех своих писем, а при необходимости может получить и прочитать
письмо целиком. Такая схема работы достигается при использовании протокола IMAP. Для
реализации мы предлагаем использовать программу dovecot:
# cd /usr/ports/mail/dovecot/
# make && make install
Собственно, это всё. Конфигурационный файл трудностей вызвать не должен, там всё
просто и понятно. Единственное, что остаётся сделать:
# vi /etc/rc.conf
dovecot_enable="YES"
# cp /usr/local/etc/dovecot-example.conf /usr/local/etc/dovecot.conf
# vi /usr/local/etc/dovecot.conf
. . .
disable_plaintext_auth = no
. . .
18
ssl_disable = yes
# /usr/local/etc/rc.d/dovecot start
. . .
# DNS based (DNS-name - PTR-record)
R$* $: $&{client_addr}
R$-.$-.$-.$- $: <?> $(dnsname $4.$3.$2.$1.in-addr.arpa. $: OK $)
R<?>OK $#error $@ 5.7.1 $: "550 I don't receive SPAM!!!"
R<?>$+ $: OKSOFAR
######################################################################
19
### check_mail -- check SMTP `MAIL FROM:' command argument
######################################################################
# make restart
Теперь в принципе всё готово. Для того, чтобы запустить систему в ручном режиме,
необходимо сначала остановить sendmail, запустить spamd + spamass-milter и затем снова
запустить sendmail (и не забыть подправить rc.conf):
# vi /etc/rc.conf
spamd_enable="YES"
spamass_milter_enable="YES"
# cd /etc/mail
# make stop
# /usr/local/etc/rc.d/spamass-milter start
# /usr/local/etc/rc.d/sa-spamd start
20
# make start
Всё должно заработать. Как проверить? Отправляем откуда-то извне письмо на свой
почтовый ящик, получаем его и внимательно читаем заголовок RFC-822. Там должно быть
написано и про DrWeb и про SpamAssassin. Можно ещё посмотреть лог самого sendmail:
# tail –n 50 /var/log/maillog
Теперь наш спам-фильтр сходу должен различить около 60 – 70% спама. Но это ещё не
всё. Для того, чтобы спам-фильтр заработал в полную силу, а это примерно 96 – 98%
спама, его необходимо обучить. Для этого создадим 2 почтовых ящика: spam – для
перенаправления на него писем, которые являются спамом, но не были помечены, как
спам; и ham – для перенаправления на него писем, которые были помечены, как спам
ошибочно. Теперь напишем скрипт для обучения встроенного Bayes и будем периодически
перенаправлять на эти ящики письма для обучения:
# vi /home/admin/scripts/sa_learn.sh
#!/bin/sh
sa-learn --spam /var/mail/spam
sa-learn --ham /var/mail/ham
exit 0
# vi /etc/crontab
0 22 * * * root /home/admin/scripts/sa-learn.sh
Очень часто бывает полезно иметь возможность попасть на свой сервер по ftp. Для того,
чтобы можно было попадать по ftp к себе в домашнюю директорию, нужно всего лишь
раскомментировать кое-что кое-где:
# vi /etc/inetd.conf
ftp stream tcp nowait root /usr/libexec/ftpd ftpd -l
# killall -HUP inetd
21
4.05. Защита сети – firewall
Эта команда добавит правило с номером 200, которое запрещает любой tcp-трафик от
хоста 10.0.0.5 на любой другой хост по 110 порту. Т.е. пользователь 10.0.0.5 не сможет
подсоединиться ни к одному pop3-серверу в мире. Теперь предлагаем вашему вниманию
написанный нами, проверенный временем и отработанный в реальных условиях фаерволл.
Конечно же у каждого своя специфика работы, однако, вот вам базовая модель, которая
сразу подойдёт 90% из вас:
# vi /usr/local/etc/firewall.conf
add 100 divert natd ip from any to any via ed0
add 10010 count ip from any to 222.111.33.100 in recv ed0
add 10020 count ip from 222.111.33.100 to any out xmit ed0
add 40000 allow ip from any to any via lo0
add allow udp from any to any
add allow icmp from any to any
add allow tcp from any to any established
add allow ip from any to any frag
add allow tcp from any to any 22 setup
add allow tcp from any 20 to any setup
add allow tcp from any to any 21 setup
add allow tcp from any to any 25 setup
add allow tcp from any to any 110 setup
add allow tcp from any to any 143 setup
add allow tcp from any to me 80 setup
add allow tcp from me to any 80 setup
add allow tcp from me to any 443 setup
add allow tcp from 10.0.0.0/24 to me 3128 setup
add deny tcp from 10.0.0.0/24 to any 80
add allow tcp from any to any 1024-65535 setup
add 65500 deny ip from any to any
Здесь же опишем, как ограничить скорость трафика по определённым условиям (это нам
пригодится в дальнейшем):
22
# ipfw add pipe 1 tcp from any to 10.0.0.3 out
# ipfw pipe 1 config bw 32Kbit/s
Очень часто бывает так, что всем разрешать пользоваться Интернетом не стоит. Это очень
просто можно ограничить прямо в файле настройки squid:
# vi /usr/local/etc/squid/squid.conf
. . .
acl users src "/usr/local/etc/squid/users.txt"
. . .
http_access allow users
http_access deny all
# vi /usr/local/etc/squid/users.txt
10.0.0.3/255.255.255.255
10.0.0.8/255.255.255.255
. . .
Можно ещё более усилить ограничение доступа – ввести проверку пароля пользователя
при попытке выйти в Интернет:
# 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
23
redirect_children 4
# vi /usr/local/etc/squid/squidGuard.conf
dbhome /var/db/squidGuard
logdir /usr/local/squid/logs
time workhours {
weekly mtwhfa 08:00 - 21:00
}
source admins {
ip 10.0.0.3
}
source users {
ip 10.0.0.0/24
}
rewrite media {
s@.*\.mp3$@http://10.0.0.1/replace/oblaka.mp3@i
s@.*\.avi$@http://10.0.0.1/replace/nikolaev.avi@i
log replace.txt
}
# DESTINATION CLASSES
. . .
acl {
admins {
pass any
}
users within workhours {
pass !ads !aggressive !audio-video !drugs !gambling !
hacking !mail !porn !proxy !violence !warez any
redirect http://www.google.com
rewrite media
log squidGuard.txt
} else {
pass none
redirect http://www.google.com
log squidGuard.txt
}
default {
pass none
redirect http://www.google.com
}
}
# squid –k reconfigure
В секции «rewrite media» описана очень интересная вещь – подмена mp3 и avi файлов
своим, заранее заготовленным файликом. Таким образом, если какой-то вредитель захочет
скачать из сети много музыки или видео, то он накачает себе много-много одинаковых
файлов – копий ваших заготовок. Закачка будет происходить локально с вашего сервера, а
значит и внешнего трафика никакого не будет.
Для того, чтобы пользователи локальной сети ходили в Интернет только через squid и не
имели возможности выйти в мир напрямую (отключив в своих браузерах proxy-сервер),
можно реализовать перехват соединения по 80 порту и заворот этого соединения на наш
squid на порт 3128:
# vi /usr/local/etc/squid/squid.conf
. . .
httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_with_proxy on
24
httpd_accel_uses_host_header on
# ipfw add 200 fwd 127.0.0.1,3128 tcp from any to any http in via fxp0
И это, как ни странно, всё. Осталось запустить httpd и ваш сервер будет отвечать на
запросы по 80 порту:
# /usr/local/etc/rc.d/apache start
Предполагая, что у вас будет жить не один сайт, настроим сразу виртуальные хосты с
некоторыми полезными опциями (например прямой доступ к файлам в директории):
# vi /usr/local/etc/apache/httpd.conf
Include etc/apache/virtual.conf
# vi /usr/local/etc/apache/virtual.conf
NameVirtualHost 222.111.33.100:80
<VirtualHost 222.111.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 "/home/admin/www/fotos/">
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
Allow from all
</Directory>
Здесь писать много не будем. Отметим только, что установив некоторые программы и
библиотеки из портов, и ничего не настраивая, вы будете иметь эту самую связку:
# cd /usr/ports/databases/mysql51-server/
# make && make install
# cd /usr/ports/lang/php4/
# make && make install
# cd /usr/ports/databases/phpmyadmin/
# make && make install
25
4.09. Web-интерфейс для доступа пользователей к почте
Теперь, когда у нас есть свой web-сервер, мы можем сделать полезную вещь для наших
пользователей – настроить доступ к их почтовым ящикам по web-интерфейсу:
# cd /usr/ports/mail/openwebmail
# make && make install
26
4.11. Соединения через сокет
Теперь представьте себе, что у вас есть второй удалённый офис. Он так же подсоединён к
сети Интернет и вы хотите соединить две локальные сети офисов в единую виртуальную
локальную сеть и иметь доступ с любого компьютера одного офиса на любой компьютер и
принтер другого. Построим такую сеть (VPN) средствами IPSec. Необходимые опции в ядро
мы уже включили выше. Пусть второй офис имеет параметры: локальную сеть
192.168.1.0/24 и подключение к Интернет с адресом 111.111.11.1. Для организации VPN
нам необходим будет FreeBSD сервер, аналогичный нашему. Теперь добавляем у нас:
# vi /etc/rc.conf
gif_interfaces="gif0"
gifconfig_gif0="222.111.33.100 111.111.11.1"
ifconfig_gif0="inet 10.0.0.1 192.168.1.1 netmask 255.255.255.0"
# vi /etc/rc.local
route add 192.168.1.0/24 192.168.1.1
# vi /usr/local/etc/firewall.conf
add 20000 allow ip from me to 111.111.11.1
add 20010 allow ip from 111.111.11.1 to me
add 20020 allow ip from 10.0.0.0/24 to 192.168.1.0/24
add 20030 allow ip from 192.168.1.0/24 to 10.0.0.0/24
Можно построить VPN не на уровне ядра системы, а при помощи утилиты openvpn. Минус
в том, что в этом случае наша сеть будет менее стабильна и устойчива. Плюс в том, что
27
таким образом можно настраивать не только связку FreeBSD – FreeBSD, а и, например,
FreeBSD – Windows 2000 / 2003. Подробно описывать настройку openvpn мы здесь не
будем. Кому интересно – в Интернете масса статей по этому поводу.
Рано или поздно у вас появится не один, а несколько FreeBSD серверов и вы захотите
копировать между ними файлы в автоматическом режиме (например, логи squid или
графики загрузки канала). Для этого есть прекрасная команда scp (secure copy), однако,
она требует ввода пароля. Для беспрепятственного же копирования файлов между
серверами UNIX (чтобы можно было использовать эту функцию в скриптах) нужно
сформировать ключ по алгоритму DSA. Генерировать его надо на том сервере, с которого
планируется копировать файлы:
# ssh-keygen -t dsa
Если всё равно вы видите запрос пароля, проверьте конфигурационный файл демона sshd
на удалённой машине:
# vi /etc/ssh/sshd_config
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
Весьма небесполезная программа mrtg построит вам любые графики любых параметров,
которые можно измерять с течением времени. Мы же будем использовать её в связке с
snmp для построения графиков загрузки нашего Интернет-канала:
# cd /usr/ports/net-mgmt/net-snmp/
# make && make install
# cd /usr/ports/net-mgmt/mrtg/
# make && make install
# 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.111.33.100
MaxBytes[elbrus]: 256000
Title[elbrus]: Traffic Analysis for ElbruS
PageTop[elbrus]: <H1>Stats for ElbruS server</H1>
# vi /etc/rc.conf
snmpd_enable="YES"
28
# vi /etc/crontab
*/5 * * * * root /usr/local/bin/mrtg /usr/local/etc/mrtg/mrtg.cfg
# killall –HUP cron
Здесь отметим, что такое /etc/crontab и демон cron. Это своего рода планировщик
заданий. Чуть выше мы задали выполнение команды mrtg каждые 5 минут (назначение
первых пяти записей в строке (*/5 * * * *) описано в самом файле /etc/crontab).
Теперь нужно добавлять правила ipfw для того, чтобы ipa снимала с них информацию о
проходящем объёме трафика. Такие два правила у нас уже есть – они считают общий
объём входящего и исходящего внешнего трафика нашего сервера. После этого нужно
создать ipa.conf и ipastat.conf:
10010 count ip from any to 222.111.33.100 in recv ed0
10020 count ip from 222.111.33.100 to any out xmit ed0
# vi /usr/local/etc/ipa.conf
ac_mod "ipa_ipfw.so";
db_mod "ipa_db_sdb.so";
global {
update_time = 30s;
append_time = 1h;
ac_list = ipfw;
db_list = sdb;
sdb:db_group = wheel;
}
rule 10010 {
ipfw:rules = 10010;
ipfw:maxchunk = 10G;
info = "IP incoming";
}
rule 10020 {
ipfw:rules = 10020;
ipfw:maxchunk = 10G;
info = "IP outgoing";
}
# vi /usr/local/etc/ipastat.conf
st_mod "ipa_st_sdb.so";
dynamic_rules = yes;
global {
st_list = sdb;
}
29
* Total 1024 (1 day)
30
Символ ~ в командной строке заменяет путь к домашнему каталогу пользователя, т.е.
предыдущая команда эквивалентна следующей записи:
# vi /home/admin/scripts/ipa_check_network.sh
Однако в скриптах нужно всегда писать полный путь к используемым файлам, т.к. они
могут быть запущены от имени разных пользователей.
Теперь напишем скрипт для проверки объёма скачанного трафика в текущем месяце и
сравнения его с назначенной пользователю квотой:
# vi ~/scripts/ipa_check_quotas.sh
#!/bin/sh
net="10.0.0"
ipfw show 17000-17255 > /home/admin/scripts/ipfw_quota.txt
exec < $1
while read str
do
i=`echo $str | cut -f1 -d':'`
q=`echo $str | cut -f2 -d':'`
e=`echo $str | cut -f3 -d':'`
l=`expr 17000 + $i`
n=`expr 12000 + $i`
m=`date | cut -f2 -d' '`
s1=`/usr/local/bin/ipastat -q -i $m -r $n | grep Total | cut -f4 -d' '`
s1=`expr $s1`
s1=`expr $s1 / 1024`
s1=`expr $s1 / 1024`
s2=`less /home/admin/scripts/ipfw_quota.txt | cut -f1 -d' ' | grep $l `
if [ "$s2" ]
then
s2=`expr $s2`
if [ $s2 -ne $l ]
then
s2=""
fi
fi
if [ $s1 -ge $q ]
then
if [ -z "$s2" ]
then
ipfw add $l deny tcp from $net.$i to me 3128
echo "Your HTTP-access was blocked. Your quota is $q Mb." | mail $e
fi
else
if [ "$s2" ]
then
ipfw delete $l
echo "Your HTTP-access was opened. Your quota is $q Mb." | mail $e
fi
fi
done
exit 0
# vi ~/scripts/quotas.conf
7:1000:admin@mail.ua
15:200:jurist@mail.ua
Несложно понять, что в случае превышения квоты, система ipfw просто запретит
пользователю доступ к серверу по порту 3128, т.е. у человека пропадёт доступ к Интернету
31
о чём он получит уведомление по почте. В следующем же месяце доступ автоматически
откроется. Запуск скрипта будет иметь следующий вид:
# ~/scripts/ipa_check_quotas.sh ~/scripts/quotas.conf
32
# vi /etc/crontab
*/20 * * * * root /home/admin/scripts/ipa_check_network.sh
*/10 * * * * root /home/admin/scripts/ipa_check_pipe.sh 300
В идеале, нужно скомбинировать эти два метода так, чтобы для всех квота была
константой, но можно было бы ещё вести персональные квоты (в отдельном файле).
В некотором роде полезную, а в основном конечно же просто для «прикола», вещь так же
можно написать при помощи скриптов shell. Это отправка команд вашему серверу при
помощи обычных sms с вашего мобильного телефона. Для начала нужно создать почтовый
адрес (например sms@mail.ua) специально для приёма команд (ведь sms сообщение будет
попадать на ваш сервер, как обычное письмо) и прописать алиас, чтобы письмо
сохранялось, как текстовый файл в системе, который, собственно и будет обрабатывать
наш скрипт:
# vi /etc/mail/aliases
sms: admin, /sms/sms.txt
# newaliases
# mkdir /sms
# chown mailnull:mailnull /sms
# chmod 0700 /sms
# vi /etc/crontab
* * * * * root /sms/sms.sh
# vi /sms/sms.sh
#!/bin/sh
adr=`grep "From 380777777777" /sms/sms.txt`
oper1=`grep "CMD:" /sms/sms.txt`
oper2=`grep "RBT:" /sms/sms.txt`
echo " " > /sm/sms.txt
if [ "$adr" ]
then
if [ "$oper1" ]
then
cmd=`echo "$oper1" | cut -d: -f2`
ans=`$cmd`
echo "$ans" | mail 380777777777@sms.mobileoperator.com
fi
if [ "$oper2" ]
then
time=`echo "$oper2" | cut -d: -f2`
shutdown -r $time
fi
fi
exit 0
Надеемся, что принцип действия скрипта вам понятен. Вы должны отправить со своего
телефона сообщение на почтовый адрес sms@mail.ua. Скрипт запускается каждую минуту
и проверяет, было ли получено новое письмо. Если да, то проверяет с вашего ли телефона
и верен ли формат команд. Если всё ОК – выполняется команда и отправляется ответ.
Ничего сложного. Формат сообщения должен иметь следующий вид:
sms@mail.ua CMD:ipfw add 50 deny ip from any to 10.0.0.3
или:
sms@mail.ua RBT:now
Вы можете добавлять свои дополнительные условия (например ещё пароль) и вообще
модифицировать работу скрипта как хотите. Главное – идея. :)
33
Не забывайте перезапускать процесс после того, как отредактируете его конфигурацион-
ный файл. В данном случае речь идёт о демоне cron. Только после его перезапуска он
начнёт обрабатывать строку, которую мы в него добавили.
Теперь, когда ваш сервер полностью настроен и готов к тому, чтобы вы про него
благополучно забыли, самое время сделать себе лично приветствие при входе на сервер:
# vi /etc/motd
======================================
ELBRUS
WellCome to Korney’s FreeBSD Server!!!
======================================
Ну, теперь можно наслаждаться даже входом в систему – ваш сервер полностью готов!
И напоследок маленький совет. Так как мы имеем дело всё-таки с техникой, делайте
резервные копии ваших конфигурационных файлов. В случае чего, вы сможете поднять
ваш сервер заново за 1 час, а это лучше, чем 1 день. Так что, если придумывать лень, вот
вам элементарный скрипт. Пусть он вам не пригодится никогда, но если вдруг что – потом
спасибо скажете:
# vi ~/backup.sh
#!/bin/sh
cd /home/admin/backup/
mkdir /home/admin/backup/temp
cp -r /etc ./temp/
cp -r /usr/local/etc ./temp/usr.local.etc
rm -r ./temp/usr.local.etc/squid/errors
cp -r /usr/src/sys/i386/conf ./temp/kernel
cp -r /home/admin/scripts ./temp/
exit 0
34
5. Инструменты на каждый день
5.01. Работа с файлами в shell
В этом коротком разделе мы опишем далеко не все, но очень нужные команды в shell,
которыми вы будете пользоваться каждый день. Так же опишем далеко не все, но очень
нужные ключи к этим командам. Если вы работали в MS-DOS, то некоторые вещи будут
вам знакомы. В ином случае вам потребуются некоторые вспомогательные сведения. Как и
большинство современных операционных систем, FreeBSD сохраняет файлы в
иерархической древовидной структуре. Такой же тип файловой системы используется в
системах Windows и Macintosh. Единственная разница заключается в том, что в Windows и
Macintosh используется графическое представление папок и файлов в графическом
диспетчере файлов, а в консоли FreeBSD – текстовое. В Windows или DOS при
регистрации пользователь, как правило, попадает в корневой каталог. Во FreeBSD дело
обстоит иначе. После регистрации пользователь попадает в свой начальный каталог,
который расположен на несколько уровней ниже корневого каталога. Теперь по командам:
35
Помните, что большинство команд UNIX выполняют указанные действия над файлами и
каталогами, не задавая лишних вопросов, даже в тех случаях, когда они могут уничтожить
существующие файлы. UNIX не ведет пользователей за руку, как Windows. В UNIX по
умолчанию предполагается, что пользователь знает, что он делает, когда просит систему
выполнить что-либо. Поэтому в тех случаях, когда вы не уверены в своих действиях,
используйте опцию -i. Тогда большинство команд будет запрашивать подтверждения,
если возникнет угроза повреждения существующих файлов.
Теперь несколько слов об именах файлов. Хотя технически UNIX позволяет включить в имя
файла любой символ (некоторые символы нельзя просто ввести, их следует указывать как
двусимвольные последовательности, начинающиеся с косой черты), желательно все-таки
ограничиться только буквами, цифрами, точкой, дефисом и символом подчеркивания.
Нежелательно начинать имя с дефиса, поскольку в UNIX дефис, как правило,
интерпретируется как символ, за которым следует опция (ключ). В имя можно включать и
пробелы. Однако в этом случае его необходимо заключить в кавычки, чтобы интерпретатор
мог воспринять имя целиком, а не как список нескольких файлов. Я рекомендую
воспользоваться распространенной практикой: заменять пробелы на символы
подчеркивания. Тогда имена легко читаются и не требуют кавычек при работе с ними.
Избегайте применения в именах файлов специальных символов. В противном случае,
пользуйтесь специальным escape-символом – это символ обратной косой черты «\». Он
указывает, что следующий за ним символ следует рассматривать в его первичном (а не в
специальном) значении.
Отличаются они тем, что команда locate использует свою собственную индексную базу
файловой системы, следовательно поиск происходит намного быстрее, однако индексная
база обновляется с некоторой периодичностью, следовательно, нельзя рассчитывать на
то, что команда locate покажет только что созданный (скопированный/перемещённый)
файл. Индексную базу locate можно обновить вручную:
# /etc/periodic/weekly/310.locate
Далее рассмотрим команды для работы с текстовыми файлами. UNIX и FreeBSD включают
множество команд обработки текстовых данных в интерпретаторе. Здесь мы рассмотрим
наиболее полезные из них:
36
less [файл] – просмотр текстовых файлов.
cut [опции][файл] – вывод частей строк из файлов. Опции обычно имеют вид:
-f[номер поля] -d’[символ-разделитель]’
Далее следует разобраться с моделью владения файлами. Все варианты UNIX имеют
одинаковую структуру: каждый файл или каталог принадлежит и пользователю, и группе.
Тем не менее это не означает, что все пользователи или члены группы имеют одинаковые
права доступа. Режим доступа к файлу задаётся строкой вида:
37
-rwxr-xr-x
Теперь рассмотрим строки, задающие права доступа к каталогам. Прежде всего, каталоги
распознаются по первому биту в строке – d. Это просто флажок, не связанный с правами
доступа. Полномочия на работу в каталоге действуют по тому же принципу, что и
полномочия на файлы, но здесь есть отличия:
r – каталог можно читать (выполнить команду ls);
w – каталог и файлы внутри него можно модифицировать, удалять и переименовывать;
х – в каталоге можно производить поиск файлов.
Так, например, запись drwxr-xr-x означает, что данный объект является каталогом (d),
его владелец может выполнять в этом каталоге любые действия, а его группа и остальные
могут только читать и выполнять поиск.
Во-первых, он имеется в любой операционной системе UNIX, с которой вам быть может,
придется работать. Как знать, он может оказаться и единственным редактором в
операционной системе…
Сразу после запуска редактор vi будет находиться в командном режиме. В этом режиме
нажатия клавиш интерпретируются как команды редактору, а не как текст, вводимый в
документ. Чтобы переключиться в режим ввода текста, необходимо нажать одну из клавиш:
a – append (присоединить). В этом режиме вводимый текст вставляется после символа, на
котором находится курсор.
i – insert (вставить). В этом режиме вводимый текст вставляется перед символом, на
котором находится курсор.
о – open (открыть). Это приводит к тому, что после строки, на которой находится курсор, в
текст вставляется новая строка. Затем курсор перемещается на новую строку и редактор vi
переходит в режим insert, разрешая ввод текста на новой строке.
Перемещаться по тексту в режиме ввода текста можно, как правило, с помощью курсорных
клавиш или клавиш Page Up / Page Down. Однако имеются и другие клавиши, позволяющие
перемещаться по документу в командном режиме:
h – перемещает курсор влево на один символ;
j – перемещает курсор вниз на один символ;
k – перемещает курсор вверх на один символ;
l – перемещает курсор вправо на один символ;
w – перемещает курсор вперед на одно слово;
b – перемещает курсор назад на одно слово;
е – перемещает курсор в конец следующего слова;
39
O – перемещает курсор в начало строки;
$ – перемещает курсор в конец строки;
) – перемещает курсор в начало следующего предложения;
( – перемещает курсор в начало предыдущего предложения;
} – перемещает курсор в начало следующего абзаца;
{ – перемещает курсор в начало предыдущего абзаца;
G – перемещает курсор в конец текущего документа;
^ – перемещает курсор к первому символу строки, не являющемуся пробелом;
Н – перемещает курсор на первую строку на экране;
L – перемещает курсор на последнюю строку на экране.
В редакторе vi имеется так же ряд команд для выполнения поиска и замены текста:
/текст – поиск в прямом направлении до первого совпадения с заданным текстом;
/ – повтор поиска текста в прямом направлении до обнаружения очередного совпадения;
?текст – поиск в обратном направлении до первого совпадения с заданным текстом;
? – повтор поиска текста в обратом направлении до обнаружения очередного совпадения;
% – перемещение курсора на соответствующую парную скобку (для программистов);
:s/текст1 /текст2 – замена в текущей строке каждого совпадения текста1 на текст2;
:%s/текст1 /текст2 – замена в файле каждого совпадения текста1 на текст2;
И последнее, что нам осталось, – это операции над файлами и выход из редактора:
:wq – сохраняет изменения в текущем файле и осуществляет выход из редактора;
:w – сохраняет изменения в текущем файле;
:w! – сохраняет изменения в текущем файле в любом случае;
:q – осуществляет выход из редактора;
:q! – осуществляет выход из редактора в любом случае;
:е – файл загружает заданный файл в редактор для редактирования;
:е! – отбрасывает все изменения и перезагружает с диска старый вариант файла.
40
Вот в принципе и всё, что вам необходимо знать для эффективной работы с текстовыми
файлами в редакторе vi.
41
равный 0, указывает, что программа нормально завершила работу, код, отличный от 0,
сообщает об ошибке.
Переменные.
В именах переменных учитывается регистр. Они могут содержать буквы, цифры и символ
подчеркивания. Имя переменной не может начинаться с цифры. Кроме того, не следует
вначале имени переменной использовать подчерк. Желательно применять описательные
имена, чтобы код программы было легко читать. В простейшем случае значение
переменной присваивается следующим образом:
myvar=5
Теперь MYVAR является переменной среды, которая будет доступна другим программам,
запущенным из данного командного интерпретатора.
42
The name of the program is: ./yourname.sh
The total number of arguments received is: 2
The complete argument string is: Ivan Petrov
Your first name is: Ivan
Your last name is: Petrov
#
Подстановка команд.
Подстановка команд позволяет запустить команду и присвоить ее вывод переменной.
Выполняемую команду следует заключить в символы `. Их не следует путать с одинарными
кавычками. Символ ` представляет собой символ обратной кавычки (на клавиатуре он, как
правило, совмещен с символом тильды ~). Например, оператор:
TodayDate=`date`
запускает команду date и присваивает ее вывод переменной TodayDate. После этого к
значению переменной можно обращаться обычным образом.
Циклы.
В некоторых случаях требуется повторять действие до тех пор, пока соблюдаются
определённые условия. В таких случаях стоит воспользоваться циклами. Командный
интерпретатор поддерживает три вида циклических конструкций: while, until и for.
43
Цикл while выполняет операторы, заключенные в нем, до тех пор, пока условие цикла
является истинным:
i=1
while [ $i –le 10 ]
do
echo $i
i=`expr $i + 1`
done
Команда while содержит условие, заключенное в квадратные скобки. На самом деле, они
представляют собой сокращенную запись команды под названием test. Последняя часто
используется в сценариях командного интерпретатора. Команда test использует
достаточно прозрачный синтаксис, близкий к Фортрану:
-eq – истина, если операнды равны;
-nе – истина, если операнды не равны;
-gt – истина, если первый операнд больше второго;
-gе – истина, если первый операнд больше или равен второму;
-lt – истина, если первый операнд меньше второго;
-le – истина, если первый операнд меньше или равен второму.
Циклы while и until позволяют работать с логическими операторами AND и OR. Логическое
выражение AND возвращает значение истина лишь в том случае, когда оба операнда
истинны, а выражение OR – когда лишь один из операндов имеет значение истина:
while [ $var1 -gt 10 ] && [ $var1 -lt 20 ] – истина, если 10 < var1 < 20;
while [ $var1 -lt 10 ] || [ $var1 -gt 20 ] – истина, если var1 < 10 или var1 > 20.
Цикл for отличается от while и until. Вместо проверки истинности условия цикл for
выполняет операторы внутри тела цикла в зависимости от количества аргументов в списке.
Цикл for содержит переменную, которая при каждой итерации получает следующий
аргумент из списка. Цикл for продолжается до тех пор, пока список не будет исчерпан:
for num in `jot 10 10 20`
do
sq_root=`echo “scale=3; sqrt($num)“ | bc –l
echo $sq_root
done
Условные операторы.
44
Очень часто программу нужно построить так, чтобы определённые участки кода
выполнялись только при определённых условиях. Существует две общих формы условных
операторов: if и case. Кроме того, есть ещё логические операторы AND/OR.
#!/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 1 ]
then
:
else
echo "Usage: $0 filel file2..."
fi
45
esac
exit 0
Логические операторы AND/OR (&& и ||) в некоторых случаях заменяют операторы if. Код
завершения первой команды используется как условие запуска второй. Мы часто
пользуемся ими в командной строке. Например:
# tar czvf backup.tar.gz ./scripts && rm -r ./scripts
Если первая операция прошла успешно, то выполняется вторая. Если нет, то вторая
команда не выполняется. Другими словами: "Необходимо выполнить команды А и В. Но
если команда А невыполнима, то не следует исполнять и В". Второй пример:
# tar czvf backup.tar.gz ./scripts || echo "Operation failed."
Если первая операция прошла успешно, то вторую выполнять не нужно. Если нет, то
выполнить вторую. Другими словами: "Если А невыполнимо, исполнить В. Но если А
завершилось успешно, В не выполнять".
Функции.
Теперь стоит отметить то, что иногда приходится повторять один и тот же набор команд в
скрипте. Здесь нам на помощь приходят функции. Они представляют собой группы
операторов, вызываемые одной командой. Их можно рассматривать как "минипрограммы
внутри программ". О важности и полезности функций говорить не будем, т.к. надеемся, что
это и так понятно. Прежде всего, если определенный набор операций требуется выполнить
в нескольких местах программы, достаточно воспользоваться лишь одной командой. Во-
вторых, если вы захотите изменить то, как исполняется операция, достаточно будет внести
изменения лишь в одном фрагменте кода:
on_exit() {
echo "Good bye."
mail korney@mail.ua < ./report.txt
rm ./report.txt
}
...
on_exit
...
Файловые дескрипторы.
Файловые дескрипторы представляют собой числовые идентификаторы, устанавливаемые
ядром при запуске каждого нового процесса. По умолчанию командный интерпретатор
открывает три файловых дескриптора:
F.D. 0 STDIN. Это стандартный входной поток. Обычно ввод поступает с клавиатуры,
однако его можно перенаправить из файла или какого-либо другого источника;
F.D. 1 STDOUT. Это стандартный выходной поток. Обычно вывод поступает на экран,
однако, как вы понимаете, его также можно перенаправить;
F.D. 2 STDERR. Это стандартный поток ошибок. Обычно выводится на экран, но и его
можно перенаправить.
Для открытия файлового дескриптора используется команда exec:
#!/bin/sh
exec > ./testfile.txt
echo "Line 1 of the file"
echo "Line 2 of the file"
echo "Line 3 of the file"
46
exit 0
Оператор exec во второй строке примера перенаправляет поток STDOUT в файл testfile.txt.
В результате, операторы echo выводят информацию в testfile.txt, а не на экран, хотя в
каждом из них поток не перенаправлен явно. Если в файл нужно вывести более одной
строки текста, эффективнее использовать файловый дескриптор, а не перенаправление
вывода в каждом операторе. Этот же подход применяется при работе с файловым
дескриптором STDIN и командой read:
#!/bin/sh
exec < ./testfile.txt
while read string do
echo $string
done
exit 0
Отладка сценариев.
И в завершение коснёмся отладки сценариев командного интерпретатора, которая рано
или поздно вам понадобится. Хотя интерпретатор не имеет полноценного отладчика, он
обеспечивает простейшие возможности для мониторинга всех выполняемых действий.
Трассировка включается посредством редактирования первой строки:
#!/bin/sh –xv
После этого, при запуске программы, вы будете видеть на экране последовательно все
действия, которые она выполняет.
47
5.05. Справочник по командам и конфигурационным файлам
Работа в системе
man Вывести справочную информацию о программе
date Вывести или изменить текущую дату и время
cal Вывести календарь
ps Вывести список процессов, запущенных в системе
48
top Вывести список процессов и статистику использования ими ресурсов
kill Завершить работу процесса по идентификатору
killall Завершить работу процессов по имени программы
shutdown Остановить или перезагрузить систему
halt Остановить систему
reboot Перезагрузить систему
uptime Вывести время работы системы с момента включения или
перезагрузки
pkg_info Вывести список пакетов, установленных в системе
pkg_add Установить пакет в систему
pkg_delete Удалить пакет из системы
make Получить файлы порта и собрать его
make install Инсталлировать собранный порт
make deinstall Деинсталлировать собранный порт
make clean Удалить рабочие файлы, созданные при сборке порта
make distclean Удалить рабочие файлы, созданные при сборке порта, и дистрибутивы
Работа в сети
ifconfig Вывести или настроить параметры сетевых интерфейсов
route Создать маршрут в таблице маршрутизации
ping Отправить тестовые пакеты и проверить соединение с хостом по сети
traseroute Вывести маршрут к удалённому хосту
netstat Вывести текущую таблицу маршрутизации
nslookup Обработать dns-запрос
dig Обработать dns-запрос
ipfw Вывести или задать правила системы ipfw
trafshow Вывести активные соединения через интерфейс
tcpdump Вывести информацию о трафике через ipfw
ssh Подключиться к виртуальной консоли удалённого хоста
scp Копировать файлы и каталоги между хостами по сети по ssh
49
/usr/src/sys/i386/conf/LINT Полное ядро системы со всеми возможными опциями
6. Заключение
Итак, вы установили свой собственный Интернет-сервер на базе ОС FreeBSD 6.3, с
чем вас сердечно поздравляем. Вы так же познакомились вкратце с основными
инструментами, которые могут вам пригодиться во время работы с вашими серверами. Что
теперь? А теперь, что касается FreeBSD, вам открыта дорога в любом направлении:
1. Вот именно теперь самое время купить новую книгу более высокого уровня – какую-
нибудь «Энциклопедию системного администратора FreeBSD». Эффект от её
прочтения теперь будет гораздо выше – вы ведь уже поработали со своим сервером
и знаете, чего можно ожидать и требовать от FreeBSD и, наверняка уже
вынашиваете какие-то идеи – осталось только их реализовать.
2. Именно теперь вы сможете намного более эффективно искать нужную информацию
и нужные программы для FreeBSD в сети Интернет.
3. Именно теперь вы перестали бояться UNIX. Всем пользователям Windows
становится немного не по себе, глядя на то, как работает системный администратор
UNIX в командной строке. И теперь вы – один из нас. :)
50