Полезные утилиты OpenBSD

GIRISH VENKATACHALAM
BSD Magazine, March 2011

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

Обычно мы не увидим различия в работе утилит в зависимости от используемой оболочки. Утилиты используют функции уровня ОС (например сигналы или фоновое выполнение) напрямую. Таким образом, мы можем достигнуть требуемых результатов различными путями.

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

В этой статье я демонстрирую эффективность некоторого набора утилит в практике работы на BSD-системах, из которых я наиболее часто сталкиваюсь с OpenBSD.

Итак:
1) dump(8) и restore(8)
2) qemu
3) sha1
4) ifconfig
5) relayd
6) spamd

Некоторые из них не являются утилитами, а представляют собой сервисы (демоны), входящие в базовый комплект ОС. Таким образом, мы можем быть уверенны, что в любой вновь установленной системе этот набор заведомо имеется. Фактически это касается всех представленных пакетов кроме qemu. Рассмотрим их один за другим.

dump(8) and restore(8)
Утилиты dump и restore используются для создания резервных копий дисковых разделов. Циферки "8" в скобках указывают на административное назначение этих инструментов. Будучи человеческими словами английского языка, имена утилит указывают на то, что они делают, так что гадать об их предназначении не требуется.

dump(8) делает бинарный снимок данных файловой системы. Снимок специфичен в зависимости от конкретной ФС. Это значит, что мы можем использовать инструмент на разных машинах разных архитектур. И, в отличие от утилиты dd, dump не делает сырой копии дисковых блоков. Вследствие более умной работы dump действует более медленно. restore(8) используется для восстановления копии, сделанной с помощью dump. Пример создания копии раздела:


# newfs /dev/sd0a
# mount /dev/sd0a /target
# cd /target
# dump af – /dev/wd0a | restore rf -

Будьте внимательны и осторожны. Все команды выполняются с правами root. Здесь я клонировал данные файловой системы дискового раздела wd0 в дисковый раздел sd0. В штатной ситуации dump(8) пишет данные в бинарный файл.
Команда


# dump af foo.bin /dev/wd0d

создаст единственный файл foo.bin со всем содержимым раздела /dev/wd0d. Будут записаны только те блоки, которые содержат информацию, а не все дисковое пространство. restore работает также с одним файлом. Это удобно - можно скопировать файл на удаленную машину с помощью ssh или ftp и там восстановить раздел с данными:


# restore rf foo.bin

Перед использованием restore необходимо создать раздел с помощью disklabel(8), отформатировать раздел посредством newfs(8) и смонтировать его.

Следующая утилита - qemu.

Qemu
Qemu - 100% открытая реализация эмулятора, весьма пригодного для виртуализации и всяких облачных вычислений, если кто любит это дело.

Мне же практически важно, что я могу тестировать продукты и отдельные куски кода без занятия физических машин, непрестанной их перезагрузки и также постоянного прожига ISO-образов на диски. Вместо этого я использую qemu для запуска моих многочисленных ОС, в которых можно запустить любое приложение. И, внимание, я могу снять образ с USB-флешки с помощью dd и загрузиться в qemu с этого образа!

С момента, когда qemu позволил работать с сетью в пространстве пользователя, стало возможным использовать любые TCP-сервисы (mail, ftp, http), запущенные снаружи, из среды qemu guest. Достигается это с помощью режима bridge. Выглядит полностью так же, как если бы к вашему свитчу была подключена еще одна физическая машина.

У меня имеются продукты для построения VPN и qemu позволяет с лёгкостью тестировать их. Просто запускаете qemu как показано ниже:


$ qemu -cdrom foo.iso

если foo.iso - liveCD. Можно тестировать диски без записи образа на оптический носитель. Также у qemu имеется возможность использовать аудио-порты хост-машины. Всё это быстро, удобно и весело. Однако, кривая обучения весьма крута, и это недостаток. В моем случае освоение более или менее полной картины возможностей заняло два года, и всё ещё имеются вещи, о которых я не имею ясного представления.

sha1
sha1 - реально очень простая утилита. Просто запустите её подобно нижеследующему примеру:


$ sha1 /etc/passwd
SHA1 (/etc/passwd) = bfe2be6875743ea537ca24604662b9684bbdcf5f

Она производит вывод фиксированного размера, который представляет собой значение хэш-функции, принимая в качестве аргумента любой входной байтовый поток или файл. Если вы скачали ISO-образ или какой-нибудь бинарный файл, можно запустить sha1 с именем файла в качестве аргумента для оценки его целостности. Просто сравните хэш-значение с контрольным значением, которое предоставляет производитель.

ifconfig(8)
ifconfig это команда, которая как все знают используется для конфигурирования сетевых интерфейсов машины. Для меня эта утилита полезна тем, что на OpenBSD её можно использовать для создания бриджей и некоторых других вещей, касающихся работы в сети, например транков.


# ifconfig bridge0 create
# ifconfig bridge0 add em0 add em1 up

Эти команды создадут мост с двумя интерфейсами em0 и em1 в качестве его компонентов. Очень просто по сравнению с Linux. Транк - это тип интерфейсов, реализованный Reyk Floeter для решения некоторых специфических проблем. Используются для управления уровнем отказоустойчивости интерфейса и балансировки нагрузки. Например вы можете создать транк-порт для задания отказоустойчивой сети, которая будет переключаться в зависимости от ситуации между проводным и беспроводным интерфейсами:


# ifconfig trunk0 create
# ifconfig trunk0 trunkproto failover trunkport bge0 trunkport em0 192.168.1.10 netmask 0xfffffff0

ifconfig(8) может многое и в отношении беспроводных сетей. Правда я не слишком увлекаюсь этой стороной вопроса, потому что у меня нет ноутбука.

Кроме всего вышеперечисленного можно создавать псевдонимы с дополнительными адресами на том же физическом интерфейсе:


# ifconfig rl0 alias 172.16.1.1

Можно создавать любое количество алиасов на интерфейсе, это мощное средство для продвинутых экспериментов с сетью. Кроме ifconfig полезен еще сценарий netstart(8). Используйте


# sh /etc/netstart

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

relayd(8)
relayd(8) - служба для создания отказоустойчивых конструкций и балансировки нагрузки на уровне приложений. Он базируется на идее перенаправления запросов на рабочий сервис в соответствии с результатами периодической проверки приложений. Он также разработан Reyk Floeter, но работает на более высоком уровне (типа седьмого уровня OSI).

Взаимодействовать с демоном можно посредством утилиты управления relayctl, которая использует локальный UNIX-сокет. Простейший пример для создания отказоустойчивости сервиса между двумя хостами показан ниже:


host1=”192.168.1.2”
host2=”192.168.1.3”
table  {
$www1
$www2
}
table  { 192.168.1.1, 192.168.1.2, 192.168.2.3 }
redirect „www” {
listen on www.foo.com port 80
forward to  check http „/” code
200
}

Для уточнения значений отдельных полей конфигурации смотрим ман. С этой конфигурацией можно использовать такие особенности, как SSL ускорение и устойчивые HTTP-сессии. Впрочем, мои знания в этих сферах весьма ограничены.

spamd(8)
spamd(8) вместе с spamlogd(8) и spamd-setup(8) полезен для настройки спам-контроля. Он используется на узлах, где запущены почтовые средства, для блокирования спама в стиле ботнетов. Работает замечательно с почти любым типом спама, но имеются и свои ограничения. spamd(8) не предоставляет возможности сканирования содержимого писем или фильтрации вирусов. Фактически, spamd - это фальшивый SMTP-демон, который работает как сторож, принуждающий почтовые клиенты к стандартному поведению (поведение ботнетов не похоже на поведение обычного пользователя почтовых сервисов). Поддерживает мультипользовательскую и однопользовательскую синхронизацию между различными хостами, на которых запущен антиспам контроль.

Ниже показаны простые правила для защиты от спамерского поведения клиентов:


pass in on rl0 proto tcp from any to any port smtp \
rdr-to 127.0.0.1 port spamd
pass in on rl0 proto tcp from any to any port smtp \
rdr-to 192.168.1.20

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

Для меня ценность spamd прежде всего состоит в том, что он позволяет сберечь драгоценную полосу пропускания. Кроме того, это спам-фильтр сетевого уровня.

Удачи вам с OpenBSD!

Назад