|
Начальная страница
Гостевая
Технические статьи
Литературная часть сайта
181334
|
Дополнительные фишки qmail и полная документация на ucspi-tcp и
daemontools на русском языке
Я тут немного подумал, и решил, что
несправедливо не уделить определенное внимание тому, без чего qmail
работает, но что в определенных ситуациях может пригодиться и для
других целей. Поэтому, в дополнение к первой части,
привожу
нижеследующее. Отдельные участки копированы из разных источников. Кое
что я не проверял по ненадобности этого для меня. Рассматривайте просто
как попытку собрать всё вместе.
1. ucspi-tcp и daemontools. Привязка к qmail
Это тот самый фетиш, без которого не
обходится ни одно описание установки qmail. Что ж, последуем традициям.
Считаем, что qmail в соответствии с первой частью нормально установлен
и настроен.
Для начала необходимо выкачать пакеты ucspi-tcp-0.88.tar.gz и daemontools-0.76.tar.gz.
(Сами пакеты находятся на страничках под ссылкой "how to install...".
Можно воспользоваться и другими версиями, буде они появятся или есть в
наличии, ибо
никакой прямой связи с qmail у этих пакетов нет. Пакеты представляет
собой набор утилит запуска и контроля исполнения системных сервисов
(uspi) (замена стандартной пары xinetd - tcpwrapper (daemontools -
соответственно, управление сервисами). То есть, если
сервис внезапно рухнул, специальная программа через минимальный
промежуток времени восстановит его функционирование и (возможно) не
даст запуститься сервису при явном недостатке памяти. Далее, с помощью
специальной утилитки можно посмотреть дерево запущенных процессов;
остановить процесс, перезапустить его, изъять из обращения. Вот,
собственно и основная функция. На тяжелых серверах, видимо, это надо
использовать. Не буду заострять внимание на том, как именно отключить
соответствующие сервисы от xinetd и tcpwrappers - см. процедуру
установки и убирай то, что сделано в соответствующих конфигурационных
файлах - больших трудностей не предвижу.
Установка:
# tar zxvf daemontools-0.76.tar.gz
# cd daemontools-0.76
# make
# make setup check
(Правда, автор пакета пишет, что устанавливать надо
следующим образом:
Создать каталог /package
:
mkdir -p /package chmod 1755 /package cd /package
Загрузить daemontools-0.76.tar.gz
в /package. Распаковать:
gunzip daemontools-0.76.tar tar -xpf daemontools-0.76.tar rm daemontools-0.76.tar cd admin/daemontools-0.76
Скомпилировать и установить:
package/install
По структуре каталога верна, скорее, авторская редакция. Как это ставил
я, уже не помню.)
# tar zxvf ucspi-tcp-0.88.tar.gz
# cd ucspi-tcp-0.88
# make
# make setup check
# cp tcpserver /usr/local/bin
# cp tcprules /usr/local/bin
В /etc/smtp - добавить строки вида:
127.0.0.1:allow,RELAYCLIENT=""
198.168.1.:allow,RELAYCLIENT=""
Последняя строчка,
понятно, описывает Вашу локальную сеть или перечень тех хостов, с
которых разрешена беспрепятственная отправка почты во внешний мир.
Создаем базу данных,
с которой tcpserver работает непосредственно:
#
/usr/local/bin/tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp <
/etc/tcp.smtp
# chmod 644 /etc/tcp.smtp.cdb
В дальнейшем, необходимо не забывать выполнять эту команду после каких
либо изменений в /etc/smtp
Редактируем
/var/qmail/rc
#!/bin/sh
env env -
PATH="/var/qmail/bin:/usr/local/bin" \
qmail-start ./Maildir/
Редактируем
/var/qmail/supervise/qmail-pop3d/run
#!/bin/sh
exec /usr/local/bin/tcpserver -H
-R -v
-c100 0 110 /var/qmail/bin/qmail-popup <имя_сервера.имя_домена> \
/home/vpopmail/bin/vchkpw
/var/qmail/bin/qmail-pop3d Maildir 2>&1
Права на него:
# chmod 751 run
Редактируем
/var/qmail/supervise/qmail-pop3d/log/run
#!/bin/sh
exec
/usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t s100000 n20
/var/log/qmail/qmail-pop3d 2>&1
Права на него:
# chmod 751 run
Редактируем /var/qmail/supervise/qmail-smtdp/run
#!/bin/sh
exec
/usr/local/bin/tcpserver -p -R -x /etc/tcp.smtp.cdb -u82 -g81 -v -c100
0 smtp rblsmtpd /var/qmail/bin/qmail-smtpd 2>&1
Права на него:
# chmod 751 run
Редактируем
/var/qmail/supervise/qmail-smtpd/log/run
#!/bin/sh
exec
/usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t s100000 n20
/var/log/qmail/qmail-smtpd 2>&1
Права на него:
# chmod 751 run
Редактируем
/var/qmail/supervise/qmail-send/run
#!/bin/sh
exec /var/qmail/rc
Права на него:
# chmod 751 run
Редактируем
/var/qmail/supervise/qmail-send/log/run
#!/bin/sh
exec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog
t s100000 n20 /var/log/qmail/qmail-send 2>
Права на него:
# chmod 751 run
И самый большой
скрипт /usr/local/etc/rc.d/qmail
#! /bin/sh
#PATH=/var/qmail/bin:/usr/local/bin:/usr/bin:/bin
#export PATH
case "$1" in
start)
echo -n "Starting qmail: svscan"
cd /var/qmail/supervise
env - PATH="/var/qmail/bin:/usr/local/bin:/usr/bin:/bin" svscan
&
echo $! > /var/run/svscan.pid
echo "."
;;
stop)
echo -n "Stopping qmail: svscan"
kill `cat /var/run/svscan.pid`
echo -n " qmail"
svc -dx /var/qmail/supervise/*
echo -n " logging"
svc -dx /var/qmail/supervise/*/log
echo "."
;;
stat)
cd /var/qmail/supervise
svstat * */log
;;
doqueue|alrm)
echo "Sending ALRM signal to qmail-send."
svc -a /var/qmail/supervise/qmail-send
;;
queue)
qmail-qstat
qmail-qread
;;
reload|hup)
echo "Sending HUP signal to qmail-send."
svc -h /var/qmail/supervise/qmail-send
echo "Sending HUP signal to qmail-pop3d."
svc -h /var/qmail/supervise/qmail-pop3d
;;
pause)
echo "Pausing qmail-send"
svc -p /var/qmail/supervise/qmail-send
echo "Pausing qmail-smtpd"
svc -p /var/qmail/supervise/qmail-smtpd
echo "Pausing qmail-pop3d"
svc -p /var/qmail/supervise/qmail-pop3d
;;
cont)
echo "Continuing qmail-send"
svc -c /var/qmail/supervise/qmail-send
echo "Continuing qmail-smtpd"
svc -c /var/qmail/supervise/qmail-smtpd
echo "Continuing qmail-pop3d"
svc -c /var/qmail/supervise/qmail-pop3d
;;
restart)
echo "Restarting qmail:"
echo "* Stopping qmail-smtpd."
svc -d /var/qmail/supervise/qmail-smtpd
echo "* Sending qmail-send SIGTERM and restarting."
svc -t /var/qmail/supervise/qmail-send
echo "* Restarting qmail-smtpd."
svc -u /var/qmail/supervise/qmail-smtpd
echo "* Sending qmail-pop3d SIGTERM and restarting."
svc -t /var/qmail/supervise/qmail-pop3d
;;
cdb)
tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp
chmod 644 /etc/tcp.smtp*
echo "Reloaded /etc/tcp.smtp."
;;
*)
echo "Usage: $0
{start|stop|restart|doqueue|reload|stat|pause|cont|cdb|queue}"
exit 1
esac
exit 0
Права на него
# chmod 751 qmail
Еще команды:
# ln -s /var/qmail/supervise/* /service/
# cd qmail-smtpd
# cd supervise ; rm -rf * ; cd .. ; rmdir supervise ; cd
log/supervise ; rm -rf * ; cd .. ; rmdir supervise ; cd ..
# cd /var/log/qmail ; cd qmail-pop3d ; rm -rf * ; cd .. ; cd
qmail-send ; rm -rf * ; cd .. ; cd qmail-smtpd ; rm -rf * ; cd ..
Удалить из /etc/inittab строку, в которой есть слово svscanboot. (осторожно. Если используются другие
сервисы под управлением этого пакета, делать этого, наверно, не стоит).
На скрипт /usr/local/etc/rc.d/qmail
повесить ссылки на все /etc/rc.d/
следующим образом:
ln –s /etc/rc.d/init.d/qmail /rc0.d/K30qmail
ln –s /etc/rc.d/init.d/qmail /rc1.d/K30qmail
ln –s /etc/rc.d/init.d/qmail /rc2.d/S80qmail
ln –s /etc/rc.d/init.d/qmail /rc3d/S80qmail
ln –s /etc/rc.d/init.d/qmail /rc4d/S80qmail
ln –s /etc/rc.d/init.d/qmail /rc5d/S80qmail
ln –s /etc/rc.d/init.d/qmail /rc6d/K30qmail
Из каталога /command/ удалить ссылку на файл svscanboot.
После этого qmail должен
загрузится сам при следующем старте системы.
Или можно запустить
его вручную немедленно:
# qmail start
Daemontools. Описание на русском языке.
Что же представляют собой утилитки пакетов daemontools и как ими
пользоваться?
Вот что пишет об этом автор пакета.
Некоторые термины принципиально
оставлены на английском, ибо русская терминология не совсем однозначна.
Копирайт на перевод (или, скорее, пересказ - потому что дословно это
сказать по русски невозможно), мой. То есть, при распространении,
указать, откуда. Моего письменного разрешения - не обязательно.
svscanboot
svscanboot
запускает сервис svscan для каталога /service
и сообщения об ошибках записывает через сервис
readproctitle.
svscanboot использует перенаправление через pipeline
svscan /service 2>&1 | readproctitle service errors: .....
содержащей в себе изначально 400 точек. Последние 400 байт
сообщений об ошибках из svscan
можно увидеть с помощью readproctitle.
svscanboot устанавливает переменную $PATH в
следующее значение:
/command:/usr/local/bin:/usr/local/sbin:/bin:/sbin:/usr/bin:/usr/sbin:/usr/X11R6/bin
и очищает все другие переменные окружения.
Разработчики программного обеспечения должны использовать для
создания глобальных переменных окружения каталог /command.
svscan
Запускает коллекцию сервисов и наблюдает над запущенными процессами.
svscan запускает по одному
процессу
supervise
для каждого подкаталога в текущем каталоге, лимит составляет 1000
подкаталогов. svscan игнорирует подкаталоги, имена которых
начинаются с точки.
supervise обязательно должен находиться в path для программы svscan.
svscan
может запускать парные процессы supervise,
один для подкаталога s, один для s/log,
с pipe между ними.
Это происходит в случае, если имя директории s не
превышает в длину 255 байт и существует поддиректория s/log.
svscan требуется по два свободных дескриптора для каждой pipe.
С промежутком в пять секунд,
svscan
проверяет свои подкаталоги.
Если он встречает новый подкаталог, он запускает новый процесс
supervise.
Если он обнаруживает подкаталог, процесс supervise для которого
завершился, он запустит этот процесс заново. В случае для log будет
использован тот же pipe, поэтому данные потеряны не будут.
svscan, будучи запущен однажды, работает постоянно.
Если у него возникают проблемы с созданием перенаправления (pipe) или
запуском supervise, сообщение об этом выводится в stderr; повторная
попытка неудавшегося действия будет повторена позднее.
Если svscan передается в
командной строке аргумент, то
этим аргументом является имя каталога, в котором данный svscan должен
проводить наблюдение.
supervise
supervise запускает сервис и наблюдает за ним.
Строка запуска:
supervise s
supervise
переходит в директорию s и запускает в ней файл ./run.
Он перезапускае ./run если ./run завершает
выполнение. После кажого запуска выдерживаются паузы, чтобы не было
зацикливания в случае, если процесс завершается немедленно после
запуска.
Если имеется в наличии файл
s/down,
supervise не будет немедленно запускать ./run. Можно
использовать svc
как для запуска ./run, так и для передачи других команд supervise.
supervise
записывает информацию о своем состоянии в двоичном формате в каталог s/supervise,
этот каталог должен быть доступен для него по записи. Статустная
информация может быть просмотрена командой
svstat.
supervise
может немедленно завершиться после запуска, если он не может обнаружить
необходимых для работы файлов, каталогов или же если другая копия supervise
находится в стадии исполнения для заданного каталога s.
После того, как supervise успешно запущен,
он остается резидентным до тех пор, пока не будет прекращен командой
kill или специальным запросом на выход.
Вы можете использовать
svok
для проверки, успешно или нет исполняется supervise.
Можно использовать и
svscan
для рабочего запуска коллекции процессов supervise.
svc
svc управляет сервисами, за которыми надзирает supervise.
командная строка:
svc opts services
opts - последовательность опций в стандартном стиле.
services состоит из любого числа аргументов, каждый
аргумент является именем поддиректории, используемой supervise.
svc последовательно применяет все опции к каждому сервису
из списка. Опции следующие:
- -u: Up.
Если сервис не запущен, запустить его. Если сервер остановлен,
перезапустить его.
- -d: Down.
Если сервис запущен, послать ему сигнал TERM, а затем сигнал CONT.
После остановки, не перезапускать сервис.
- -o: Once.
Если сервис не запущен, запустить его. Не перезапускать, если он
остановлен.
- -p: Pause. Послать сервису сигнал STOP.
- -c: Continue.
Послать сервису сигнал CONT.
- -h: Hangup. Послать сервису сигнал HUP.
- -a: Alarm. Послать сервису сигнал ALRM.
- -i: Interrupt.
Send the service an INT signal.
- -t: Terminate.
Send the service a TERM signal.
- -k: Kill.
Send the service a KILL signal.
- -x: Exit. supervise завершится сразу после
остановки сервиса. Если
вы используете эту опцию на стабильной системе, то явно делаете что-то
неправильное. supervise сделан для того, чтобы работать постоянно.
svok
Проверяет, запущен или нет supervise.
строка запуска:
svok service
svok проверяет, в каком состоянии
находится процесс supervise для
управляющего каталога с именем service. Эта программа возвращает 0,
если supervise найден в памяти в нормальном состоянии. Без выдачи каких
либо сообшений, svok возвратит 100, если с supervise для заданного
каталога что-нибудь не так.
svstat
svstat выводит список сервисов, находящихся под управлением supervise.
строка запуска:
svstat services
services представляет собой список
аргументов, каждый из которых
является именем директории. svstat выводит для каждого сервиса строку,
удобную для оценки того, запущен ли supervise для указанной директории
и содержащую сведения о статусе выполнения, предоставляемые supervise.
fghack
Утилита, предотвращающая фоновое исполнение.
строка запуска:
fghack child
Запускает child с необходимым числом
дополнительных дескрипторов записи
в pipe. fghack игнорирует любые данные, читаемые им из pipe. После
того, как child закончит свою работу, и pipe будут закрыты, fghack
также завершит свою работу.
pgrphack
Запускает программу в другой группе процессов.
строка запуска:
pgrphack child
программа child будет запущена в новой группе процессов.
readproctitle
readproctitle управляет автоматически обновляемым логом в памяти для
инспекции сообщений через команду ps.
командная строка:
readproctitle L D
L - произвольное число аргументов;
D - единственный аргумент, содержащий как минимум пять точек.
readproctitle читает данные в конец
строки D, сдвигая предыдущее сообщение в D влево для получения
свободного места. Предполагается, что у большинства данных,
выводимых через ps по такой технологии, в начале строки будут как
минимум три точки. Общая длина выводимой строки будет составлять
изначально заданное количество знаков в аргументе D.
Например, если мы подадим команду:
io errors: ....................
то при чтении данных
fatal error xyz warning abc
аргумент командной строки примет следующий вид:
readproctitle io errors: ... xyz!warning abc!
Каждый символ перевода строки будет
заменен на восклицательный знак. Утилиты, показывающие список
процессов, обычно заменяют знаки перевода строки на "?" или "\n".
readproctitle заканчивает свою работу, когда ей передается признак
конца файла (eof).
В зависимости от реализации ps, могут накладываться некоторые
ограничения на суммарную длину аргументов. Эти ограничения
подразумевают общую длину команды readproctitle L D. Распространенные
системы обычно без проблем позволяют работать со строками длиной не
менее 512 байт.
multilog
multilog читает последовательность строк с stdin и присоединяет
избранные строки к одному из многочисленных журналов, определёных
аргументами этой команды.
Командная строка:
multilog script
script состоит из любого числа аргументов. Один аргумент характеризует
собой одно действие. Действия производятся над каждой вводимой строкой
в одной и той же последовательности. Обратите внимание, что действия,
содержащие метасимволы shell, должны быть заключены в кавычки, если
multilog вызывается из shell.
multilog завершает свою работу с кодом ошибки 0, если по stdin ему
передан eof. Если последняя строка в stdin не имела символа перевода
строки, multilog самостоятельно дополнит ввод пустой строкой с символом
перевода строки.
multilog записывает сообщение в stderr и завершает работу с кодом
ошибки 111, не производя операций ввода, если для его запуска
недостаточно памяти или другой экземпляр процесса multilog уже открыл
для записи один из заданных журналов.
Если multilog сталкивается с ситуацией, при которой он не может
сохранить информацию на диске после того, как обработал входной поток,
он выводит сообщение в stderr, делает паузу, после чего повторно
пытается произвести запись, при этом не теряя данные. Обратите
внимание, что такая ситуация может блокировать передачу входной
информации в multilog.
При получении сигнала TERM, multilog продолжает чтение потока ввода до
следующего знака перевода строки, после чего звершает работу, оставляя
указатель stdin на первом байте необработанных данных.
Выбор (пометка) строк.
Любая строка по умолчанию является выбранной (помеченной для вывода?)
Параметр
-pattern
снимает со строки пометку, если эта строка соответствует шаблону
pattern. Параметр
+pattern
помечает строку, соответствующую шаблону pattern.
Шаблон pattern является строкой, состоящей из звездочек и других
символов. Совпадения ищутся по следующим правилам замены: Звёздочка,
стоящая в конце
шаблона, соответствует любому остатку строки. Звездочка в середине
шаблона означает, что замещаемый ею символ в строке не должен совпадать
со следующим за звездочкой в шаблоне символом.
Например, действие
+hello
пометит только строку "hello". Строка "hello world" не будет помечена.
Действие
-named[*]: Cleaned cache *
снимет пометку со строки named[135]: Cleaned cache of 3121 RRs. Первая
звёздочка соответствует любой строке, не содержащей символа правой
закрывающейся скобки.
Действие
-*
Отменит выбор любой строки.
В целях сохранения памяти, multilog действительно проверяет совпадение
с шаблоном не более чем на первых 1000 символах строки.
Предупреждения:
Действие
e
производит вывод любой выбранной строки (не более первых 200 байт её
начала) в stderr.
Файлы статуса
Действие
=file
заменяет содержимое файла file строками, соответствующими шаблону
пометок (не более 1000 байт, обрезанные строки в 1001-м байте
дополняютс символом перевода строки. Файл не защищен от потери
буферизации при отключении питания.
Например, последовательность действий:
-* +STAT* =log/status
выводит в файл /log/status копию последних строк, начинающихся со STAT.
Временные метки
Действие
t
вставляет @ - точную отметку о текущем времени - в начало каждой
строки. От остального содержимого строки отметка времени отделяется
пробелом. Для отметок о времени используется формат, совпадающий с
tai64n.
Данное действие обязательно должно быть первым в последовательности.
Все шаблоны будут применены только после того, как отметка о времени
будет вставлена в строку. Например, если multilog со следующими
параметрами запуска:
multilog t '-*' '+* fatal: *'
./main
передаётся строка:
fatal: out of memory
то в журнал эта строка будет записана в следующем виде:
@400000003b4a39c23294b13c fatal: out of memory
в данном случае первая звездочка соответствует отметке о времени.
Для перевода отметок о времени в нормальное представление можно
использовать программу tai64nlocal.
Автоматическая ротация журналов.
Если имя каталога dir начинается с точки или слэша, то действие
dir
присоединит каждую строку, соответствующую шаблону, к журналу с именем
dir. Если такого каталога не существует, multilog создаст его.
Не делайте попыток записи в один и тот же журнал из разных процессов
multilog или двух действий одного и того же процесса.
Формат имени журнала следующий: dir является именем директории,
содержащей некоторое количетство старых файлов журналов, журнал с
именем current и другие файлы, с которыми multilog совершает свои
действия. Файл каждого журнала имеет имя, начинающееся с символа @,
далее следует отметка о времени, свидетельствующая о том, когда журнал
был завершен. В конце имени будет один из следующих кодов:
- .s: Файл полностью обработан и успешно записан на диск.
- .u: Файл не был нормально закрыт. Его содержимое может
быть либо усечено, либо вообще может отсутствовать.
Сетевые файловые системы, файловые
системы с асинхронным доступом и файловые системы с программным
управлением могут самостоятельно уничтожать файлы, которые не были
закрыты в процессе записи содержимого.
Во время активности процесса multilog, файл с именем current имеет
права на доступ 644. После того, как multilog обнаруживает eof во
входном потоке stdin, он устанавливает права доступа на файл current в
744. После перезупуска, права доступа этого файла вновь будут
установлены в 644, и multilog продолжит запись информации в него.
Когда multilog обнаруживает, что файл current достиг слишком большого
размера, он закрывает этот файл, устанавливает для него режим доступа
744, и переименовывает в один из старых файлов журналов в соответствии
с указанными выше принципами наименования.
Действие
ssize
устанавливает максимальную величину файла current. Завершение файла
всегда происходит по границам строк. Новый файл будет создан в случае,
когда разница в размере от получившейся величины при записи последней
строки до указанной границы будет составлять не более 2000 байт.
Величина size может быть от 4096 до 16777215. Величина по умолчанию
99999 байт.
Действие
nnum
устанавливает число файлов для последовательной ротации. После того,
как current переименовывается, если multilog обнаруживает num или более
старых файлов журнала, он начинает удалять самые старые журналы до тех
пор, пока общее количество файлов не составит num. num должно быть не
менее 2. Значение по умолчанию 10.
Действие
!processor
устанавливает программу для
последующей обработки каталога dir. multilog перенаправляет current на
processor и сохраняет свой поток вывода в качестве старого лога
журнала, вместо журнала current. multilog также будет сохранять любой
свой вывод через processor по дескриптору 5, и может читать этот вывод
через дескриптор 4, когда он запускает processor на следующем журнале.
По соображениям контроля, processor должен возвратить ненулевое
значение при выходе, если у него возникают проблемы с операциями
ввода/вывода. multilog после этого запустит его снова. Процедура
запуска процесса processor временно блокирует прием информации
multilog'ом со входа.
br>
tai64n
выводит точную отметку времени в каждую строку
tai64n читает строки через stdin. В каждую строку, передаваемую в
stdout, эта программа записывает:
- символ "@"
- отметку точного времени (timestamp)
- символ "пробела"
- копию полученной строки
tai64n завершает свою работу с кодом 0 при обнаружении признака
завершения входного потока. Работа завершается с кодом ошибки 111 без
сообщений об ошибке, если обнаруживаются проблемы со чтением stdin или
записью в stdout. tai64n не задействует после своего запуска
дополнительной памяти.
Отметки о времени, используемые tai64n, представляют собой 12-байтную
метку во внешнем формате TAI64N, печатаемую в виде 24 шестнадцатиричных
знаков в нижнем регистре. Для преобразования такой записи в
воспринимаемый для чтения формат можно пользоваться программой
tai64nlocal.
Например, отметка 4000000037c219bf2ef02e94 ссылается на наносекунду
после момента, составляющего 935467455.787492500 секунд после начала
1970 года по Гринвичу; 37c219bf это шестнадцатиричное представление
числа 935467455, а 2ef02e94 - числа 787492500.
Текущая реализация tai64n зависит от стандартной библиотечной функции
UNIX gettimeofday(), которая возвращает текущее время в секундах
от1970-01-01 00:00:10 по Гринвичу. Несмотря на то, что большинство
реализаций этой функции полностью соответствуют стандартам, довольно
часто встречаются ситуации, когда системный таймер просто не показывает
точного времени.
tai64nlocal
Преобразует точные отметки времени формата TAI64N в воспринимаемый
человеком формат.
tai64nlocal читает строки из stdin. Если строка начинается с любого
символа, кроме "@", tai64nlocal записывает её в stdout без изменений.
Если эе строка начинается с символа "@", tai64nlocal переводит
следующую за ним последовательность в локальное время в ISO формате:
YYYY-MM-DD HH:MM:SS.SSSSSSSSS.
Например, для временной зоны US/Pacific, строка ввода
@4000000037c219bf2ef02e94 mark
будет преобразована в
1999-08-23 21:03:43.787492500 mark
Обратите, однако, внимание, что текущая реализация tai64nlocal
базируется на стандартной процедуре из системной библиотеки UNIX,
служащей для определения точного времени. Некоторые реализации этой
функции используют неверную временную шкалу, что может влиять на
преобразование.
tai64nlocal завершает свою работу с кодом 0 при обнаружении признака
завершения входного потока. Работа завершается с кодом ошибки 111 без
сообщений об ошибке, если обнаруживаются проблемы со чтением stdin или
записью в stdout. tai64nlocal не задействует после своего запуска
дополнительной памяти, кроме, возможно, той что требуется для работы
функции localtime().
setuidgid
запускает другую программу под uid и gid заданного системного
пользователя.
Строка запуска:
setuidgid account child
account является единичным аргументом. child может содержать в
себе несколько аргументов.
setuidgid устанавливает uid и gid в величины, соответствующие учетной
записи account, затем запускается child.
setuidgid возвращает код ошибки 111 в случае, если он не может найти
системного пользователя с именем account, если не может установить uid
или gid. В любом другом случае код завершения этой программы равен коду
завершения процесса child.
setuidgid может быть запущен только с правами root.
envudgid
envuidgid запускает другую программу при переменных окружения,
установленных для uid и gid пользователя системы account.
Строка запуска:
envuidgid account child
account является единичным аргументом. child может содержать в
себе несколько аргументов.
envuidgid устанавливает переменную окружения $UID в значение,
соответствующее uid пользователя account, и переменную $GID - в
значение, равное gid пользователя account. Затем запускается процесс
child.
envuidgid завершает свою работу с кодом ошибки 111, если ему не удалось
найти системного пользователя account, если при выделении памяти для
переменных окружения возникла ошибка, или же невозможно запустить
child. Во всех остальных случаях его код возврата будет таким же, как у
child.
envdir
Запускает другую программу с окружением, приведенным в соответствие
владельцу файлов в указанном каталоге.
Строка запуска:
envdir d child
d - единичный аргумент, child может состоять из нескольких аргументов.
envdir устанавливает различные переменные окружения, как этого требуют
файлы, содержащиеся в директории d, затем производится запуск процесса
child.
Если директория d содержит файл с именем s, первой строкой которого
является t, envdir удалит переменную окружения с именем s, если таковая
существовала, и затем вновь введет переменную окружения с именем s,
значением которой будет значение t. Имя s не должно содержать знак
равенства "=". Пробелы и табуляторы в конце строки t будут
удалены. Нулевые символы в строке t в переменной окружения будут
заменены на знаки перевода строки. Если файл s полностью пуст (длина 0
байт), envdir удаляет переменную s, если такая существует, не создавая
взамен новой переменной.
envdir возвращает 111 при проблемах со чтением d, если при выделении
памяти для системных переменных обнаруживается ее недостаток, или если
невозможно запустить child. В остальных случаях код завершения будет
таким же, как у child.
softlimit
softlimit запускает другую программу с новыми лимитами
ресурсов.
Строка запуска:
softlimit opts child
opts серия опций в стандартной форме.
child состоит из одного или большего количества
аргументов.
softlimit
устанавливает программные лимиты на ресурсы системы, в соответствии с opts.
Затем производится запуск child.
Опции:
В каждой из следующих опций, n может принимать
значение "=",
указывающее, что данный программный лимит должен быть равным лимиту,
устанавливаемому системой по умолчанию.
Опции управления памятью:
- -m n: То же самое, что и -d n -s n
-l n -a n.
- -d n: Ограничивает сегмент данных для процесса n
байтами.
- -s n: Ограничивает сегмент стека для процесса n
байтами.
- -l n:
Ограничивает количество фиксированных (locked) физических страниц на
процесс в n байт.
Эта опция не имеет смысла для некоторых операционных систем.
- -a n:
Ограничивает суммарное значение всех сегментов на процесс в n
байт. Эта опция на некоторых операционных системах не работает.
- -o n:
Ограничивает число открытых файловых дескрипторов на процесс в n.
На некоторых операционных системах не работает.
- -p n:
Ограничивает число процессов на uid вn.
Опции управления размером файлов:
- -f n: Ограничивает величину выводимых файлов n
байтами.
- -c n: Ограничивает размер core files n
байтами (нда... я не понял, что тут хотели сказать).
Опции эффективности:
- -r n:
Ограничение величины резидентного набора в n байт.
Это ограничение не может быть изменено, если вся физическая память уже
занята.
- -t n:
Ограничивает время CPU n секундами.
Это ограничение не может быть перекрыто, кроме случая, когда процесс
получает сигнал SIGXCPU через n секунд.
setlock
Запускает другую программу с блокировкой файла.
Строка запуска:
setlock opts fn child
opts серия опций в обычном стиле.
fn единичный аргумент.
child состоит из одного или большего количества
аргументов.
setlock открывает fn для записи (создаёт
его, если он не существует), устанавливает для этого файла эксклюзивную
блокировку (lock), затем запускает child.
В нормальной ситуации блокировка снимается после того, как child
завершит свою работу.
Дальнейшее развитие ситуации: процессу child
передаетсяis дескриптор запертого файла, указывающий на дисковый файл с
именем fn.
Эта блокировка исчезает, если над этим файлом произвести следующие
действия:
- файл закрыт всеми процессами, имеющими для него дескрипторы или
- принудительно снята блокировка.
Опции:
- -n: Не выдерживать паузу. Если fn
заперт другим процессом, setlock также блокирует его.
- -N:
(По умолчанию.) Пауза. Если fn заперт другим
процессом, setlock выжидает до тех пор, пока не сможет
установить
самостоятельную блокировку.
- -x: Если fn не может быть открыт (или
создан) или заперт, setlock выходит с нулевым кодом возврата.
- -X:
(По умолчанию.) Если fn не может быть открыт (или
создан) или заперт, setlock выдаёт сообщение об ошибке и
прекращает
исполнение, возвратив ненулевое значение.
Пакет ucspi-tcp
Во-первых, что это такое.
Назначение пакета - построение клиент-серверных приложений на базе TCP.
tcpserver ожидает входящие соединения и для каждого
соединения запускает программу по вашему выбору. Ваша программа
получает переменные окружения, показывающие имена локального и
удаленного хостов, IP-адреса и имена портов.
tcpserver следит за всеми исполняемыми под его управлением
программами и отслеживает ситуации переполнения памяти. Когда он уже
управляет 40 (по умолчанию) одновременными соединениями, tcpserver
приостанавливает отслеживание новых соединений.
tcpserver также обеспечивает функции контроля доступа через TCP,
подобно пакетам tcp-wrappers/tcpd и файлу hosts.allow, но делает это
быстрее. Его правила доступа заранее скомпилированы в хэш-формат с
помощью cdb, так что вы можете легко регулировать деятельность тысяч
различных хостов.
Данный пакет включает в себя утилиту recordio, которая наблюдает над
процессами ввода и вывода сервера.
tcpclient устанваливает TCP-соединение и запускает программу
по вашему выбору. Он устанавливает для нее переменные окружения точно
так же, как tcpserver.
Пакет всключает в себя простые примеры программ-клиентов,
демонстрирующих возможности tcpclient: who@, date@, finger@, http@,
tcpcat, и mconnect.
tcpserver и tcpclient полностью соответствуют требованиям
UCSPI,
(UNIX Client-Server Program Interface),
и используют протокол
TCP
.
Другие утилиты командной строки, имеющие отношение к TCP
ucspi-tcp может служить заменой следующим программам:
- inetd;
- xinetd;
- Клиент mconnect, часть SunOS;
- программе socket;
- программам faucet и hose, части пакета netpipes;
- программе netcat,
которая также поддерживает и UDP.
Администраторы многих серверов заменили inetd на tcpserver, причины
для этого следующие:
- inetd плохо справляется с большими нагрузками.
Он может отключать сервисы на 10 минут, если получает "слишком много"
соединений в минуту.
- inetd не обеспечивает эффективное управление ресурсами.
Он может легко занять всю доступную память системы при запуске
какого-либо популярного сервиса.
- inetd имеет проблемы с резкими всплесками активности. Он может
одномоментно отслеживать запуск не более чем 5, либо 10 объектов и не
может
вызываться в нескольких экземплярах.
tcpserver
tcpserver наблюдает за входящими TCP-соединениями
Строка запуска:
tcpserver opts host port prog
opts - cерия опций
host - единственный аргумент
port - единственный аргумент
prog может состоять из одного или более
tcpserver ожидает соединений от клиентов tcp. Для каждого такого
соединения будет запущен процесс prog, при этом дескриптор 0
используется для чтения из сети, а дескриптор 1 - для выдачи данных в
сеть. Также используюся переменные окружения.
Адрес сервера передаётся через параметры host и port. Параметр port
может быть задан в форме имени из /etc/services или числом; если этот
параметр равен 0, tcpserver выбирает свободный порт TCP. Парметр host
может также быть равным 0, что позволяет соединения с любого локального
IP адреса, либо может быть ip-адресом в десятичной нотации, что
допускает соединение только с указанного адреса, либо символическим
именем хоста, что позволяет соединения с первого ip-адреса данного хоста.
Имена хостов проходят через квалифицирование с использованием
утилиты dns_4_qualify.
tcpserver прекращает исполнение при получении сигнала SIGTERM.
Опции общего назначения:
- -q: Quiet. Не печатать сообщения об ошибках.
- -Q: (по умолчанию) Печатать сообщения об ошибках.
- -v: Verbose. Печатать сообщения об ошибках и статусные
сообщения.
Опции, влияющие на соединения:
- -c n: Не поддерживать более чем n
одновременных соединений.
Если одновременно запущено n копий процесса prog,
ожидание нового соединения приостанавливается до тех пор, пока одна из
копий завершится. n должно быть целым положительным
числом.
Значение по умолчанию: 40.
- -x cdb:
Следовать правилам, скомпилированным в cdb из tcprules.
Эти правила могут устанавливать переменные окружения или сбрасывать
соединения из плохих источников. Вы можете перезапускать tcprules
(перекомпилировать базу данных) во
время исполнения tcpserver.
- -X: С помощью -x cdb
можно допустить соединения, если база данных cdb
отсутствует.
Обычно tcpserver сбрасывает соединения, если cdb
не существует.
- -B banner: Записывает banner в
сеть непосредственно после того, как соединение установлено.
tcpserver записывает banner
перед тем, как проанализирует $TCPREMOTEHOST, перед тем, как
обработает $TCPREMOTEINFO, и перед проверкой cdb. Эта опция
может использоваться для уменьшения латентности протокола, когда клиент
ожидает приглашения с сервера.
- -g gid: Переключает идентификатор группы в gid
после подготовки к приему соединения. gid должно быть
положительным целым.
- -u uid:
Переключает ID пользователя в значение uid после
подготовки к приёму соединений. uid должно быть
положительным целым.
- -U: То же самое, что и -g $GID -u $UID.
Обычно $GID и $UID устанавливаются программой envuidgid.
- -1:
После подготовки к приёму соединений, печатает номер локального порта в
стандартный поток вывода.
- -b n: Обеспечивает обратную трассировку n
TCP SYNков.
На накоторых системах, n ограничено 5.
На системах, поддерживающих SYN cookies, the backlog is irrelevant.
- -o: Оставляет все IP опции.
Если клиент посылает пакет, содержащий IP source route,
ответные пакеты будут посланы по тому же маршруту.
- -O: (По умолчанию.) Уничтожает опции IP.
Клиент все равно может использовать source routing
для соединения и для посылки данных, но пакеты пойдут к нему по
маршруту, предусмотренному по умолчанию.
- -d: Задерживает посылку данных на долю секунды в случае,
когда удаленный хост медленно отвечает.
Эта опция включена по умолчанию в настоящее время, но может быть
выключена в будущем; если хотите, установите эту опцию уже сейчас.
- -D: Никогда не задерживать посылаемые данные;
управляется TCP_NODELAY.
Опции, влияющие на сбор данных
- -h: (По умолчанию) Обращаться для разрешения имени хоста
к DNS
чтобы установить переменную окружения $TCPREMOTEHOST.
- -H: Не обращаться к DNS для опеределения имени хоста;
убрать переменную окружения $TCPREMOTEHOST. Чтобы избежать
зацикливание, вы обязаны
использовать эту опцию для серверов с TCP по порту 53.
- -p: Paranoid.
После разрешения имени хоста через DNS, произвести обратную сверку IP
адресов в DNS для этого имени хоста, и удалить переменную окружения $TCPREMOTEHOST
если ни один из адресов не совпадает с IP клиента.
- -P: (По умолчанию) Not paranoid.
- -l localname: Не далать резольвинг локальных
имен через DNS; localname используется для установки
переменной окружения $TCPLOCALHOST. Обычный выбор для localname
величина 0.
Чтобы предотвратить зацикливание, вы обязаны
использовать эту опцию для сереров, работающих по TCP порту 53.
- -r: (По умолчанию) Пытаться получить $TCPREMOTEINFO
от удаленного хоста.
- -R: Не пытаться получить $TCPREMOTEINFO с
удаленного хоста.
Чтобы избежать зацикливания, вы обязаны
использовать эту опцию для серверов, работающих по TCP
портам 53 и 113.
- -t n: Отказаться от попыток получения $TCPREMOTEINFO
через n секунд. Значение по умолчанию: 26.
tcprules
Программа предназначена для перевода в формат базы данных правил,
используемых tcpserver.
Командная строка:
tcprules cdb tmp
tcpserver по умолчанию следует правилам для определения, допустимо или
нет данное TCP соединение. Например, правило:
18.23.0.32:deny
запрещает любые соединения с IP адреса 18.23.0.32
tcprules читает правила со своего стандартного потока ввода и
записывает их в cdb, в двоичном формате, используемом для быстрого их
чтения tcpserverом.
tcprules может использоваться во время работы tcpserver. Эта программа
позаботится о безопасном обновлении cdb. Такой подход обеспечивается
первоначальной записью правил в tmp, а затем перемещением tmp поверх
cdb. Если tmp уже существует на момент записи, он будет уничтожен.
Директории, в которых находятся tmp и cdb, должны быть доступны по
записи для tcprules. Кроме того, эти директории должны находиться в
пределах одной и той же файловой системы.
Если при чтении исходных правил или при создании tmp наблюдаются
какие-либо затруднения, tcprules не модифицирует cdb.
Двоичный формат базы данных cdb переносим между машинами разных
архитектур.
Формат правил.
Правило занимает одну строку. Файл, содержащий в себе правила, может
содержать также комментарии: строки, начинающиеся с символа "#"
игнорируются.
Каждое правило состоит из адреса, двоеточия, и перечня инструкций, без
дополнительных пробелов. Когда tcpserver получает запрос соединения с
указанного адреса, он следует инструкциям.
Адреса.
Адреса для tcpserver могут быть заданы в следующих видах:
- $TCPREMOTEINFO@$TCPREMOTEIP, если переменная окружения
$TCPREMOTEINFO определена.
- $TCPREMOTEINFO@=$TCPREMOTEIP, если определены обе переменные
окружения: $TCPREMOTEINF и $TCPREMOTEIP.
- $TCPREMOTEIP;
- =$TCPREMOTEHOST, если переменная окружения $TCPREMOTEHOST
определена.
- Сокращенные префиксы $TCPREMOTEIP, заканчивающиеся точкой.
- Сокращенные суффиксы $TCPREMOTEHOST, начинающиеся с точки,
предваряемой знаком равенства, если переменная $TCPREMOTEHOST
определена.
- =, если переменная $TCPREMOTEHOST определена.
- Пустая строка.
tcpserver использует только одно первое попавшееся по порядку,
подходящее к IP адресу правило. Необходимо использовать опцию p, если
вы уверены в переменной окружения $TCPREMOTEHOST.
Например, допустим, имеются следующие правила:
joe@127.0.0.1:first 18.23.0.32:second :third 127.:fourth
Если переменная $TCPREMOTEIP имеет значение 10.119.75.38, tcpserver
будет следовать инструкции third.
Если переменная $TCPREMOTEIP имеет значение 18.23.0.32, tcpserver будет
следовать инструкции second.
Если переменная $TCPREMOTEIP имеет значение 127.0.0.1, а $TCPREMOTEINFO
имеет значение bill, tcpserver будет следовать инструкции fourth.
Если переменная $TCPREMOTEIP имеет значение 127.0.0.1, а $TCPREMOTEINFO
имеет значение joe, tcpserver будет следовать инструкции first.
Для проверки того, как tcpserver интерпретирует правила в cdb, можно
использовать программу tcprulescheck.
Диапазоны адресов
tcprules интерпретирует правило 1.2.3.37-53:ins как краткую форму
инструкций 1.2.3.37:ins, 1.2.3.38:ins и так далее, вплоть до
1.2.3.53:ins. Точно так же, 10.2-3.:ins является сокращением для
10.2.:ins и 10.3.:ins
Инструкции
Инструкции в правиле могут начинаться либо с allow, либо с deny.
Инструкция deny приказывает tcpserverу сбросить соединения, не вызывая
соответствующий ему процесс. Например, инструкция
:deny
заставит tcpserver сбрасывать все соединения, которые не управляются
предшествующими этой строке правилами.
Инструкции могут быть продолжены списком любых переменных окружения в
форме var="xxx". tcpserver в этом случае добавит для запускаемого
процесса переменную окружения $var со значением "xxx". Например
10.0.:allow,RELAYCLIENT="@fix.me"
добавит переменную окружения $RELAYCLIENT со значением @fix.me. Кавычки
могут быть заменены любым повторяющимся символом:
10.0.:allow,RELAYCLIENT=\@fix.me\
Может быть перечислено любое количество переменных:
127.0.0.1:allow,RELAYCLIENT="",TCPLOCALHOST="movie.edu"
tcprulescheck
команда
tcprulescheck cdb
покажет, что tcpserver будет делать при соединении с IP адреса
$TCPREMOTEIP и именем хоста $TCPREMOTEHOST и информации о удаленном
компьютере из $TCPREMOTEINFO, следуя правилам, скомпилированным в cdb
программой tcprules.
argv0
argv0 предназначена для запуска программы с указываемым нулевым
аргументом (то есть именем программы, указатель на которое передается в
результате исполнения функции argv(0)).
Командная строка:
argv0 realname zero args
realname - единственный аргумент; zero - единственный аргумент; args -
любое количество аргументов.
argv0 запустит программу с именем realname, при этом zero будет её
нулевым аргументом (а не realname), и args - остальными аргументами,
передаваемыми через командную строку.
назначение этого всего:
Некоторые программы обращают особое внимание на нулевой аргумент
командной строки. argv0 делает для таких программ возможным запуск
через скрипты shell.
Например, строка
argv0 /bin/csh -csh
запустит csh с нулевым аргументом -csh. /bin/csh будет думать, что это
shell входа в систему и действовать соответственно.
В другом примере, команда:
tcpserver 0 ftp argv0 tcpd ftpd
-l -A
даст такой же эффект, что и строка
ftp stream tcp nowait root tcpd ftpd -l -A
в /etc/inetd.conf. Программа ftpd будет запущена с нулевым аргументом
ftpd и остальными аргументами -l -A. Обратите внимание, что tcpd может
(и должен) быть заменен tcpserver с опцией -x:
tcpserver -x ftp.tcp 0 ftp ftpd -l -A
fixcrio
fixcrio вставляет отсутствующие знаки возврата каретки (CR) в концы
строк.
Командная строка:
fixcrio prog
fixcrio запускает prog. Эта программа вставляет CR в конец каждой
строки входного и выводного потока запущенной программы, если такая
строка не имеет CR.
fixcrio функционирует в качестве дочернего процесса prog. Она
заканчивает свою работу, если обнаруживает EOF в потоке вывода prog.
recordio
recordio записывает входной и выходной потоки программы.
Командная строка:
recordio prog
recordio запускает prog. Она выводит на дескриптор 2 все строки,
проходящие через ввод и вывод prog .
В начале каждой строки, выводимой на дескриптор 2, recordio вставляет
id процесса prog, сопровождая значком "<" строку ввода, а значком
">" строку вывода. В конце каждой строки добавляется "+", пробел или
[EOF]; пробел указывает на наличие дополнительных строк в буфере ввода,
[eof] индицирует запрос на закрытие потока.
recordio производит немедленный вывод любого пакета. Эта программа не
пытается синхронизировать пакеты в соответствующие строки. Например,
recordio sh -c 'cat /dev/fd/8 2>&1'
> /dev/null
выведет следующее:
5135 > cat: /dev/fd/8: Bad file descriptor 5135 > [EOF]
или
5135 > cat: + 5135 > /dev/fd/8+ 5135 > : + 5135 > Bad file descriptor 5135 > [EOF]
если команда cat производит посылки информации разными пакетами.
recordio может самостоятельно разбивать длинные пакеты на несколько
строк по граница "атомов" (текстовой информации).
recordio запускается в качестве дочернего процесса prog. Эта программа
заканчивает свою работу при обнаружении [EOF] в выходном потоке prog.
rblsmtpd
rblsmtpd блокирует почту с сайтов, входящих в черные списки rbl.
Работает с любым smtp сервером, который может быть запущен под
управлением tcpserver.
Командная строка:
rblsmtpd opts prog
opts - серия стандартных (getopt) ключей. prog - состоит из одного или
большего числа аргументов.
Обычно rblsmtpd запускает prog. Подразумевается, что процесс prog
способен поддерживать обмен информацией по протоколу smtp для получения
почты.
Однако, rblsmtpd не запустит prog, если почтовые сервера этого клиента
внесены в черные списки rbl. Вместо этого rblsmtpd инициирует
собственный упрощенный интерфейс протокола smtp, временно отбрасывая
все попытки послать почтовое сообщение. Одновременно на дескриптор 2
выводится сообщение об отказе соединения.
rblsmtpd принудительно прекращает обмен данными по протоколу smtpd с
серверами черного списка через 60 секунд, даже если клиент к этому
времени не отключился.
Опции:
- n: изменить 60-секундный тайм-аут в n
секунд.
блокированные клиенты
Если переменная окружения $RBLSMTPD определена и её значение не
является пустой строкой, rblsmtpd блокирует почту. Он использует
$RBLSMTPD в качестве сообщения клиенту. Обычно rblsmtpd запускается из
под tcpserver; можно использовать tcprules для установки $RBLSMTPD
избранным клиентам.
Если $RBLSMTPD установлена и её значение - пустая строка, почта не
блокируется.
Если $RBLSMTPD не установлена, rblsmtpd сверяет значение $TCPREMOTEIP
со списками rbl и блокирует почту, если данный сервер значится в
списках. tcpserver устанавливает $TCPREMOTEIP в IP адрес удаленного
компьютера.
Опции:
- -r base: Использовать base в
качестве источника RBL. Любой IP адрес a.b.c.d
считается входящим в список, если имеется запись типа "TXT" в d.c.b.a.base.
rblsmtpd используется содержимое текстовой записи для
сообщения клиенту.
- -a base:
Использовать base в качестве источника, исключающего
адреса из списка RBL. Любой IP адрес a.b.c.d
считается исключенным из списка, если он имеет запист типа "А" в d.c.b.a.base.
В этом случае rblsmtpd не блокирует почту.
Поддерживается произвольное количество опций -r и -a. rblsmtpd
последовательно проверяет каждый источник, до тех пор пока не обнаружит
совпадения или список опций не закончится.
Если вы не задали ни одной опции -r, rblsmtpd попытается в качестве
источника использовать rbl.maps.vix.com. Этот адрес может меняться в
зависимости от версии пакета.
Списки RBL
Если вы хотите использовать собственные списки блокировки, или же
источник анти-блокировки, вы можете для этого использовать rbldns из
пакета djbdns.
Автор пакета рекомендует следующие источники списков RBL:
- bl.spamcop.net
- dev.null.dk
- list.dsbl.org, используется rbldns с 2002-03
- multihop.dsbl.org, используется rbldns с
2002-03
- orbs.dorkslayers.com
- orbz.gst-group.co.uk
- relays.ordb.org
- relays.osirusoft.com
- unconfirmed.dsbl.org, используется rbldns с
2002-03
Следующие сервера списков RBL использовать не стоит:
- blackholes.mail-abuse.org, c 2001-07 требуется оплата за
услуги
- dialups.mail-abuse.org, с 2001-07 требуется оплата за
услуги
- dul.maps.vix.com, переименован в dialups.mail-abuse.org
- inputs.orbz.org, не работает 2002-03
- outputs.orbs.org, не работает 2001-06
- outputs.orbz.org, не работает 2002-03
- rbl.maps.vix.com, переименован в blackholes.mail-abuse.org
- relays.mail-abuse.org,
записи формата TXT истекают в 2000-08, плата за доступ с 2001-07
- relays.msci.memphis.edu, копия relays.mail-abuse.org
с записями TXT, остановлен в 2001-01 потому что mail-abuse.org
стал платным ресурсом
- rss.maps.vix.com, переименованный relays.mail-abuse.org
relays.mail-abuse.org остановил свою работу с rblsmtpd в августе 2000
года, потому что все записи TXT были уничтожены. "Они были убраны,
потому что файл зоны превысил все допустимые пределы" - заявила служба
поддержки. Такой проблемы никогда не случилось бы, если бы
использовался rbldns, потому что базы данных rbldns намного меньше
обычных зонных файлов. Однако, люди проекта MAPS имеют финансовые
интересы в проекте BIND, и поэтому отказываются от использования
rbldns.
Примечание от Sir Serge:
Сервисы "черных списков" - один из самых одиозных сегментов "обороны" против спама.
Прежде чем использовать подобное, внимательно задумайтесь над тем, что это может за
собой повлечь. Например, вы пропишете в качестве источника такой известный сервер
черных листов, как spamhaus.org. И потом будете удивляться, почему кроме явного
спама к вам больше не приходят нормальные письма с адресных сетей вполне известных
и приличных российских провайдеров, в том числе с серверов, с которых спам никогда не
рассылался. Ан все потому, что spamhaus имеет привычку после получения десятка
жалоб на какой-нибудь сервер, находящейся на подсети провайдера, банить все адресные подсети, принадлежащие
этому провайдеру, в отместку выставляя условия исключения из списков, которые по России
любой здравомыслящий человек сочтет неприемлемым. Полностью со всеми своими сетями
в эти списки попадали, например, Ростелеком и Di-net, с объяснением причины, де
данные провайдеры обеспечивают хостирование спамеров и обманных интернет-магазинов и
в том, что было 10-15 жалоб от маниакальных владельцев сетей каких-нибудь американских колледжей,
где незащищенные виндовые машины выставлены напрямую в интернет, зато стоит аппаратный снифер,
регистрирующий "атаки". Черные списки от Spamhaus, к
сожалению, очень популярны среди администраторов почтовых серверов зоны .de;
Хорошо, немцы имеют другой менталитет, но я изумляюсь количеству серверов зоны .ru,
использующих черные листы. Конечно, это так просто - влепил черный список и радуйся
тому, что на сервер ничего не приходит. А в то же время абонент сервера, который
случайно попал в эти списки, не может отослать на определенные адреса жизненно важные
например, для его бизнеса, почтовые сообщения. Провайдер этого абонента не может
высказать свое "фи" администратору сервера, отбивающего почту, потому что его письма тоже не
доходят - ибо блокируются все входящие, на все адреса, в том числе и на
административные. Причем, самое подлое в этом всем то,
что программы-менеджеры черных списков выставляют при отбое smtp код ошибки 450 -
т.е. некритическую ошибку. А это значит, что автор письма получит bounce message
не ранее чем через неделю безуспешных попыток соединения почтового сервера его провайдера.
То же самое будет, если сервер просто не отвечает на запросы smtp. И видны эти ситуации только
через логи сервера.
Коды временных ошибок доставки
Обычно, если переменная окружения $RBLSMTPD определена, rblsmtpd
использует код сообщения об ошибке 451 для извещения клиента. Это
подразумевает для правильного почтового клиента повторить попытку
обращения в другое время. Такое сообщение дает возможность оператору
узла проанализировать источники проблемы и убрать при необходимости
запрет на доступ, при этом во время повторного обращения почта будет
доставлена.
Однако, если значение $RBLSMTPD начинается с дефиса, rblsmtpd удаляет
дефис из сообщения и использует в извещении клиента код ошибки 553. Это
позволяет клиенту немедленно заняться подготовкой сообщения о
невозможности доставки (bounce message).
Вот несколько опций управления сообщениями об ошибках, связанными со
списками RBL:
- -B: (По умолчанию)
Использовать код ошибки 451 для IP адресов, перечисленных в RBL.
- -b: Использовать код ошибки 553 для IP адресов,
перечисленных в RBL.
- -C:
(По умолчанию)
Использовать вычитку списков RBL в режиме "игнорирования сбоев".
То есть, если сервер RBL дает временный сбой, адрес считается не
входящим в списки;
так же, если список разрешенных адресов временно недоступен, считается
что адрес присутствует в этом списке.
К сожалению, нехорошие люди при желании могут заставить сбоить сервера
черных и белых списков, чтобы их почта не была блокирована.
- -c: Управлять разрешением адресов RBL в режиме "запрета
сбоев". Если сервер RBL временно недоступен, подразумевается, что адрес
есть в черном списке (используется код ошибки 451 совместно с опцией -b).
Если недоступен сервер anti-RBL подразумевается, что адрес не обнаружен
в белом списке (используется код ошибки 451 даже если последующие
вызовы сервера RBL успешны -b). К сожалению, это может
приводить к задержкам доставки нормальной почты.
tcpclient
tcpclient создаёт исходящее соединение TCP.
Командная строка:
tcpclient opts host port prog
opts - последовательность опций в стиле getopt. host - единственный
аргумент. prog состоит из одного или большего числа аргументов.
tcpclient пытается присоединиться к TCP серверу. Если эта попытка
увенчалась успехом, он запускает prog с дескриптором 6 для чтения из
сети и дескриптором 7 для записи в сеть. Также устанавливаются
различные переменные окружения.
Адрес сервера передается через параметры host и port. port может быть в
форме имени, представленного в /etc/services или же числом. host может
быть 0 - ссылка на локальную машину, или IP адресом в десятичной
нотации с разделением точками, либо же символьным именем хоста. Данный
параметр проходит через квалификацию, используя вызов функции
dns_ip4_qualify.
Если сервер имеет несколько IP адресов, tcpclient будет пробовать
каждый адрес по списку до удачного результата соединения.
опции
Общего назначения:
- -q: Quiet. Не печатать сообщения об ошибках.
- -Q: (по умолчанию) Печатать сообщения об ошибках.
- -v: Verbose. Печатать сообщения об ошибках и статусные
сообщения.
Опции установки соединения:
- x+y: Завершить попытки соединения через x+y
секунд. По умолчанию: 2+58.
Когда хост имеет несколько IP адресов, tcpclient пытается
соединиться с первым IP адресом, ожидает x секунд,
пытается соединиться со вторым IP адресом, ожидает x
секунд и так далее;
затем он повторяет попытки для каждого адреса, время ожидания для
которого истекло, выжидая y секунд на каждый адрес.
Вы можете пропустить часть +y чтобы отказаться
от повторной попытки.
- -i localip: Использовать localip
в качестве IP адреса локальной стороны соединения; выйти, если localip
недоступен. Обычно tcpclient позволяет операционной системе
самостоятельно определить этот адрес.
- -p localport: Использовать localport
в качестве TCP порта для локальной стороны соединения;
выйти, если localport не доступен. Обычно tcpclient
позволяет операционной системе выбрать порт самостоятельно.
- -d: Задерживать посылаемые данные на долю секунды всякий
раз, когда удаленный хост медленно отвечает. Эта опция по умолчанию
активирована, но в будущем, возможно, умолчание будет противополоным.
Если вы хотите, можете указать её явно.
- -D: Никогда не задерживать посылаемые данные; Определяет
переменную TCP_NODELAY.
Опции сбора данных:
- -h: (По умолчанию)
Распознавать имя удаленного хоста в DNS
для определения переменной окружения $TCPREMOTEHOST.
- -H:
Не обращаться к DNS для установки соответствия доменного имени;
удалить переменную окружения $TCPREMOTEHOST.
- -l localname:
Не проверять имя локального хоста через DNS; Использовать localname
для установки значения переменной окружения $TCPLOCALHOST.
Обычный выбор для localname величина 0.
- -r: (По умолчанию) Пытаться получить $TCPREMOTEINFO
с удаленного хоста.
- -R: Не пытаться получить $TCPREMOTEINFO с
удаленного хоста.
- -t n: Сбросить $TCPREMOTEINFO попытки
соединения через n секунд. По умолчанию: 26.
who@
who@ печатает список активных пользователей на удаленном хосте.
Командная строка:
who@ host
who@ присоединяется на порт TCP 11 (sysstat) машины host и
печатает все данные, которые может прочитать с этого порта. Она удаляет
символы перевода каретки CR (\015) и преобразует неотображаемые символы
в символы, которые могут быть выведены на печать.
Если параметр host не указан, who@ делает попытку соединения с
локальным хостом.
Некоторые компьютеры выдают по порту 11 список локальных пользователей.
Например, для этого порта может быть запущено:
tcpserver -RHl0 0 11 who
date@
date@ печатает дату, полученную с удаленного хоста.
Командная строка:
date@ host
date@ подключается к 13 порту TCP (Daytime) машины host и печатает все
данные, которые может прочитать с этого порта. Она удаляет символы
перевода каретки CR (\015) и преобразует
неотображаемые символы в символы, которые могут быть выведены на
печать.
Если параметр host не указан, date@ делает попытку соединения с
локальным хостом.
Некоторые компьютеры выдают на порт 13 текущую дату в читабельном
формате. Например, для этого порта может быть запущено:
tcpserver -RHl0 0 13 date
finger@
finger@ предоставляет информацию о пользователях удаленного хоста.
Командная строка:
finger@ host user
finger@ соединяется по порту 79 (finger) машины host, отсылает имя
пользователя user и выводит на печать все данные, которые может
прочитать с порта. Удаляет знаки возврата каретки и преобразует
непечатаемые символы в печатаемые.
Некоторые компьютеры выдают по порту 79 информацию о пользователе.
Если параметр user не задан, finger@ посылает на удаленный компьютер
пустую строку. Некоторые компьютеры на такой запрос отвечают списком
всех пользователей, в текущий момент находящихся в системе.
Если параметр host не указан, finger@ делает попытку соединения с
машиной, с которой он был запущен.
http@
http@ получает WEB-страничку с удаленного хоста.
Командная строка:
http@ host page port
http@ подключается к порту port на машине host, посылает запрос:
GET /page HTTP/1.0 Host: host
на host и печатает содержимие ответа, удаляя символы CR в концах строк.
Если параметр port не указан, подразумевается TCP порт 80 (HTTP).
Если пропущен аргумент page, http@ запросит с хоста страницу с адресом /
Если параметр host не указан, http@ делает попытку соединения с
машиной, с которой он был запущен.
tcpcat
tcpcat печатает данные с удаленного хоста.
Командная строка:
tcpcat host port
tcpcat соединяется с удаленным компьютером host по порту port TCP и
выводит на печать все данные, полученные им. tcpcat может быть
использован для получения двоичных данных. Преобразования не
производятся.
mconnect
mconnect подключается к smtp серверу.
Командная строка:
mconnect host port
Программа посылает свой поток ввода на host, добавляя к каждой строке
CR. В то же время, она выводит на печать все, что получает в ответ.
Если порт не указан, подразумевается стандартный порт SMTP 25. Если
параметр host не указан, попытки соединения делаются с той машиной, с
которой запущена программа.
addcr и delcr
addcr вставляет символ возврата каретки (CR) (\015) перед каждым
символом перевода строки (LF) (\012), например так же, как это вводится
в стандартном потоке ввода. CR не вставляется в конец незаконченной
строки завершения.
delcr удаляет символы возврата каретки из переданных на вход строк,
если такой символ найден. Не удаляется CR из частично завершенной
строки, т.е. строки, не имеющей LF.
Некоторые программы unix2dos и dos2unix имеют затруднения с длинными
строками и нулевыми символами. addcr и delcr таких затруднений не
испытывают.
Переменные окружения, имеющие отношение к TCP
$PROTO является строкой TCP.
$TCPLOCALIP
это IP адрес локальной машины, в десятично-точечной нотации.
$TCPLOCALPORT
номер TCP порта локальной машины, в десятичном виде.
$TCPLOCALHOST
имя из DNS для локального хоста.
Если имя не определено, переменная $TCPLOCALHOST не
установлена.
$TCPREMOTEIP
IP адрес удаленной машины.
$TCPREMOTEPORT
номер TCP порта удаленной машины, в десятичном виде.
$TCPREMOTEHOST
имя из DNS для удаленной машины. Если имя не определено, переменная
окружения $TCPREMOTEHOST не установлена.
$TCPREMOTEINFO
строка, характеризующая соединение с удаленным компьютером через
протоколы 931/1413/IDENT/TAP.
Если такая информация отсутствует, $TCPREMOTEINFO не
установлена.
Конфигурационные файлы qmail
Конфигурирование qmail можно признать вполне приятным занятием, по
сравнению с файлами типа
/etc/sendmail.cf (хоть даже для этого сипользовался широко
разрекламированный
препроцессор m4).
Каталог, в котором располагаются конфигурационные файлы qmail -
/var/qmail/control.
Для функционирования qmail в общем случае абсолютно необходим лишь
один конфигурационный файл - me, состоящий к тому же из единственной
строки, содержащей полное доменное имя Вашей машины (автоматически
создается при установке скриптом config-fast).
Обратите особое внимание, что программа qmail-send перечитывает
конфигурационные файлы
только при старте, поэтому при их изменении необходимо перезапустить
qmail-send. Если qmail-send получает сигнал HUP, она перечитывает лишь
файлы locals и vurtualdomains.
Далее приведен список конфигурационных файлов qmail, которые могут
располагаться в каталоге /var/qmail/control, использующие их программы,
значение по умолчанию и краткое описание. Более полное описание с
синтаксисом можно найти в соответствующих программам страницах
руководства. Все времена указываются в секундах.
файл программа default краткое описание
badmailfrom qmail-smtpd нет неприемлемые адреса отправителей badmailpatterns qmail-smtpd нет badrcptto qmail-smtpd нет bouncefrom qmail-send MAILER-DAEMON пользователь для отвергнутых сообщений bouncehost qmail-send me хост для отвергнутых сообщений concurrencylocal qmail-send 10 max число одновр. доставляемых сообщ.(лок) concurrencyremote qmail-send 20 max число одновр. доставляемых сообщ.(внеш) defaultdomain qmail-inject me домен по умолчанию defaulthost qmail-inject me хост по умолчанию databytes qmail-smtpd 0 максимальный размер сообщения в байтах doublebouncehost qmail-send me хост для повторно отвергнутых сообщений doublebounceto qmail-send postmaster пользователь для повторно отвергнутых сообщ. envnoathost qmail-send me домен для адресов без знака @ helohost qmail-remote me имя хоста для приветствия удал. SMTP сервера idhost qmail-inject me localiphost qmail-smtpd me замена локальных IP-адресов на имя хоста locals qmail-send me список доменов для локальной доставки morercpthosts qmail-smtpd нет дополнительные разрешенные RCPT-домены percenthack qmail-send нет домены для которых возможен в адресах знак % plusdomain qmail-inject me имя домена для имен хостов, оканчивающихся + qmqpservers qmail-qmqpc нет queuelifetime qmail-send 604800 max время нахождения сообщения в очереди rcpthosts qmail-smtpd нет разрешенные RCPT-домены smtpgreeting qmail-smtpd me приглашение SMTP smtproutes qmail-remote нет искусственная SMTP маршрутизация timeoutconnect qmail-remote 60 таймаут ожидания связи с удал. SMTP сервером timeoutremote qmail-remote 1200 таймаут ожидания ответа от удал. SMTP сервера timeoutsmtpd qmail-smtpd 1200 таймаут в данных от удал. SMTP клиента virtualdomains qmail-send нет список виртуальных пользователей или доменов
O Господи!
Как же мне надоел этот текст... (С)
C.Лебедев (Sir Serge)
Barnaul, RF
28/11/2004
Всего комментариев к статье: 4 Сообщения с 1 по 4
Максим Иванов ОС:Linux 24.04.2007 19:08:01
День добрый! Спасибо, что процетировали мою инструкцию. Случайно наткнулся на собственные строки :) Фразу "Удалить из /etc/inittab строку, в которой есть слово svscanboot. " я писал в своей инструкции по установке QMail на сайте atmsk.ru по поводу того, что это была инструкция для AltLinux Master. Собственно, приведенный скрипт запуска QMail был мною взят из документа [ ccылка ] Причем в скрипте ошибка: вместо queue) qmail-qstat qmail-qread Необходимо писать: queue) /var/qmail/bin/qmail-qstat /var/qmail/bin/qmail-qread Инче, к сожалению, не работает. Но это я уже на atmsk.ru выложить не успел, равно как и другие исправления, сайт закрылся. Спасибо Вам за популизацию почтового сервера QMail! С уважением, Максим Иванов Sir Serge ОС:Linux 24.04.2007 20:06:29
Ну, собственно скрипт в-основном то работает, по той причине что редко кто в реалиях пользуется пунктом queue) Cпасибо за коррекцию ошибки в скрипте. Возможно, это кому-нибудь сэкономит драгоценное время. :) GLADtr ОС:Windows XP 10.09.2007 21:11:40
Здравствуйте, Сергей. У меня есть к вам просьба помочь мне советом Я хочу установить и настроить qmail только в качестве рэлэя. Читаю доки хау-то и голова кругом. Для разъяснения ситуации что мне нужно в общем есть mx.domen.ru в DMZ на него приходит почта для четырех доменов(domen.ru, domen1.ru, domen2.ru, domen3.ru) с него будет уходить на следующий smtp server с которого собственно почта будет попадать на почтовики exchange qmail будет стоять на втором smtp-server который должен принимать почту и отправлять ее только по определенным хостам - остальное отвергать Вот такая вот просьба Заранее огромное спасибо GLADtr ОС:Windows XP 11.09.2007 13:49:28
маленькое замечание по поводу пакета ucspi-tcp-0.88.tar.gz для его компиляции нужен ucspi-tcp-0.88-man.tar.gz который по крайней мере порт не находит для скачивания пришлось найти в инете вот по этому адресу [ ccылка ] теперь можно компилить
Вы можете добавить к статье свои комментарии.
Прошу соблюдать относительную корректность в высказываниях. Заявления типа "Пошел на...",
посты, написанные в лексике udaff.com и психоанализ личности автора и участников обсуждения
будут стираться. Также будут стёрты сообщения, не имеющие никакого отношения к заявленной
тематике. Если вы не согласны со статьей - выскажите своё мнение, но
обосновывайте его. Помните, что свою позицию доказываете Вы не мне, а другим читателям. Всячески приветствуются
возможные технические поправки и исправления неточностей. Для возможности внесения комментариев
в браузере должна быть включена поддержка JavaScript. Надоели спамерские роботы.
Рекламу и ссылки на сайты, не относящиеся к делу, не постить! Поля "E-mail" и "WWW" обязательными
для заполнения не являются.
Число показов этой страницы: 625
|