FreeBSD 6.X bulldozer HOWTO FreeBSD

Сколько уже статей написано, переписано. «Зачем еще одна похожая?» - возникает законный вопрос. Наверняка для профи в мире unix все более понятно и привычно, особенно когда с различными настройками сталкиваешься постоянно. Другой вопрос, а когда редко? А сделать нужно. Нужно сделать быстро. Приходится искать, записывать, вспоминать, что же правильного нужно сделать, что уже когда-то было сделано. Формально проблемы нет - все находится, но только жалко времени на поиск уже когда-то пройденного. Данная статья будет включать в себя отработанные на практике приемы настройки самой FreeBSD и различных ее компонентов. Для кого эта статья? Вообще пишу для себя и своего времени. Цель статьи - помочь быстро поднять свежую систему с нуля, затратив минимум времени. Очень большая вероятность, что данная статья и тебе, читатель, пригодится. Тем не менее, все последствия использования данной статьи на твоей совести. В статье речь идет об установке системы на момент марта 2006 года.

В качестве материалов использованы различные источники из интернета, но особую благодарность хочу выразить порталу http://bsdportal.ru, его администрации и участникам. Очень много информации было взято именно оттуда. Если же я не упоминаю автора материалов, ради Бога, извините! Хочется сделать информативную полезную статью, а не благодарственное письмо. И вообще - информейшен маст би фри ...

Обсуждаем статью тут.

Цели

Сконструировать почтовый сервер, который сможет обслуживать небольшое предприятие в 200-500 компьютеров, получать почту от провайдера, проверяя ее на вирусы, отсекая спам. Передавать почту во вне через релей провайдера. В качестве транспорта предоставлять возможность использования шифрованных каналов на основе SSL/TLS. После установки почтового сервера нужно будет обеспечить возможность форвардинга писем, статического и по времени, организации списков рассылок, веб интерфейса для пользователя и администратора. Вторая часть работы заключается в организации шлюза в интернет и прокси сервера HTTP/FTP/SOСKS5, разделения трафика.

Используемое ПО

WEB-сервер:

Apache 1.3 + Mod_ssl

SQL сервер:

PostgreSQL

Почтовый сервер:

Postfix + Cyrus-SASL2 + TLS + PostgreSQL-бэкэнд + SpamAssassin + NOD32 + Courier_IMAP + pop3client + smtpclient

Первоначальная установка и настройка

В данном разделе описываю различные улучшения (субъективно конечно), которые считаю оправданными с точки зрения удобства: установка локали, смена шела, программы закачки, установка файлового менеджера, обновление портов, смены текстового редактора.

установка mc

копирование /usr/ports/distfiles

установка различных параметров rc.conf

установка локали и редактора по умолчанию "mcedit"

установка различных полезных системных настроек

обновление портов

установка bash

установка sudo

замена стандартного fetch на wget

Cборка ядра для нормальной работы с PostgreSQL

Установка mc

Удобная для работы штука. И каталоги частого использования можно по Ctrl+ быстро вызывать, и редактор совсем не плох. Любители командной строки и vi могут сие пропускать, а я уж потружусь ...

# cd /usr/ports/misc/mc

# make install clean

Копирование /usr/ports/distfiles

Пункт необязателен, но полезен, если уже один разок такая установка уже делалась совсем недавно. Заливаем сохраненное содержимое в этот каталог по FTP по локальной сети. Цель - избавиться от повторного выкачивания из Интернета, один раз уже ж это качали.

Установка различных параметров rc.conf

Добавляем следующие строки в /etc/rc.conf

sendmail_enable="NO"

sendmail_submit_enable="NO"

sendmail_outbound_enable="NO"

sendmail_msp_queue_enable="NO"

dumpdev="NO"

Этими строками мы убираем sendmail из запуска и отключаем сброс дампа. Далее будут дополнения при установке различных систем.

Установка локали и редактора по умолчанию "mcedit"

В файл /etc/profile добавляем строки:

EDITOR=mcedit; export EDITOR

LANG=ru_RU.KOI8-R; export LANG

MM_CHARSET=KOI8-R; export MM_CHARSET

В файл ~/.cshrc меняем в строке EDITOR значение vi на mcedit, после перезагрузки получаем русскую локаль по умолчанию для всех.

Для себя я применяю еще одну радикальную меру:

# cp `which vi` `which vi`.backup

# ln -sf `which mcedit` `which vi`

Это позволит, читая мануалы и не задумываясь, выполнять vi <файл>.

Установка различных полезных системных настроек

Для улучшения производительности системы добавляем в файл /etc/sysctl.conf следующие настройки:

# Увеличение скорости копирования мелких файлов

net.inet.tcp.delayed_ack=0

net.inet.ip.portrange.last=30000

# Увеличение буферов TCP

net.inet.tcp.sendspace=65535

net.inet.tcp.recvspace=65535

net.local.stream.recvspace=65535

net.local.stream.sendspace=65535

# Увеличение размера очереди

kern.ipc.somaxconn=1024

# Число одновременно открытых дискрипторов файлов

kern.maxfiles=32768

# Прочее

net.inet.ip.forwarding=1

net.inet.tcp.always_keepalive=1

# Кладём core-файлы в "нужное место"

kern.corefile="/var/tmp/%U.%N.core"

Обновление портов

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

1) Устанавливаем нужный для обновления портов софт:

# cd /usr/ports/net/cvsup-without-gui

# make install clean

# cd /usr/ports/sysutils/portupgrade

# make install clean

# cd /usr/ports/sysutils/fastest_cvsup

# make install clean

2) Прежде всего, на всякий случай (непроиндекcированные пакаджи, неисправленные зависимости), фиксируем /var/db/pkg/pkgdb.db (BDB - индекс установленных пакаджей)

# pkgdb -F

3) Обновляемся с быстрейшего cvsup-сервера (Russia,Finland,Norway,Sweden - откуда угодно (что ближе )) - копируем из /usr/share/examples/cvsup в /etc/ports-supfile и дописываем свои настройки, в строке

* default host host=CHANGE_THIS.FreeBSD.org

имя хоста полезно изменить, выбрав тут: http://freebsd.org/doc/handbook/mirrors.html , а выбрал имя хоста - cvsup2.ru., и получилось, соответственно:

* default host host=cvsup2.ru.FreeBSD.org

... далее

# cvsup -h `fastest_cvsup -Qc ru,no,fi,sw` -gL 2 /etc/ports-supfile

4) Качаем индекс и индексируем базу портов

# cd /usr/ports

# make fetchindex

# portsdb -u

5) Смотрим/думаем что нам надо обновить в портах. (если чего надумаем не обновлять - прописываем это в pkgtools.conf в хэш HOLD_PKGS). Мое мнение - лучше обновить все.

# portversion -vl < | tee /tmp/update-me

6) Обновляем, но сперва все выкачиваем:

# portupgrade -arRF

# portupgrade -avrR

7) Cмотрим, что осталось (если при такой «пакетной» переборке какая-то сборка какого-либо порта «вылетает» - сборка не останавливается). Если что-то осталось - доделываем ручками из портов ...

# portversion -vl < >/tmp/update-me

8) Обновляем зависимости программ:

# pkgdb -F

Советы:

все доп. опции портов пишем либо в /etc/make.conf, либо в хэш MAKE_ARGS в /usr/local/etc/pkgtools.conf

если не нужна диалоговая конфигурация - прописывайте необх. опции для портов и устанавливайте в /etc/make.conf опцию BATCH = YES

обязательно обновляйте базу портов (необновлённые /usr/ports/Mk - причина многих «у меня не собирается ИМЯРЕК из портов»);

Установка bash

Считаю этот шелл более дружественным, посему его устанавливаю:

# cd /usr/ports/shells/bash2

# make install clean

Далее заменяем шелл:

# chsh

В открываемом редакторе заменяем старый шел /bin/csh на новый /usr/local/bin/bash.

Создаем нужные файлы... В домашнем каталоге находим (или создаем) файл .profile и добавляем:

export http_proxy=http://ТУТ_IP_ПРОКСИ_СЕРВЕРА:ПОРТ/

export ftp_poxy=http://ТУТ_IP_ПРОКСИ_СЕРВЕРА:ПОРТ/

# квадратик - это символ ESC с кодом 27

E=""

PS1="Host: $E[32mH$E37m $E[37mUser:$E[0m $E[1;33;41mu $E[1;37;40m$E[0mDate:$E[0m $E[36mD{%A}$E[37m $E[36mD{%d/%m/%Y}$E[37m $E[1m$E[33m $E[37m$E[0m $E[32mw$E[37m $ "

... и получаем красивое и информативное приглашение bash.

Далее, для очистки экрана после выхода из сессии bash создадим файл .bash_logout в домашнем каталоге:

# echo clear >> ~/.bash_logout

Установка sudo

Собираем из портов:

# cd /usr/ports/security/sudo

# make install clean

Замена стандартного fetch на wget

Программа wget мне немного больше нравится как качалка, чем стандартный fetch. Установим ее:

# cd /usr/ports/ftp/wget

# make install clean

Пропишем ее использование вместо стандартного fetch. Для этого в файле /etc/make.conf добавим строки:

# Делаем wget заменой fetch

FETCH_CMD=/usr/local/bin/wget -c

DISABLE_SIZE=yes

Cборка ядра для нормальной работы с PostgreSQL

Пересобираем ядро согласно Хэндбуку. Команды сборки приведены ниже. На этапе редактирования конфигурации ядра надо проверить наличие следующих параметров (согласно /usr/local/share/doc/postgresql/README-server), при необходимости добавить/изменить:

# PostgreSQL

options SYSVSHM

options SYSVSEM

options SYSVMSG

options SHMMAXPGS=65536

options SEMMNI=40

options SEMMNS=240

options SEMUME=40

options SEMMNU=120

Собственно процесс пересборки (исходное работоспособное ядро положим в /boot/kernel.good):

# cp -R /boot/kernel /boot/kernel.good

# cd /usr/src/sys/i386/conf

# cp GENERIC MYKERNEL

# mcedit MYKERNEL

# cd /usr/src

# make buildkernel KERNCONF=MYKERNEL

# make installkernel KERNCONF=MYKERNEL

# reboot

Устанавливаем WEB сервер

Сперва подготовим конфигурацию ssl. Для этого правим файл /etc/ssl/openssl.cnf, а именно одну его секцию [ CA_default ]:

[ CA_default ]

dir = /etc/ssl # Это каталог для работы с ssl

certs = $dir/ssl.crt # Это где будут лежать сертификаты

crl_dir = $dir/ssl.crl # Это где будут листы "отзывов подписей"

database = $dir/index.txt # Здесь index file для индексирования запросов на подпись

new_certs_dir = $dir/ssl.crt # Сюда будут писать новые сертификаты

certificate = $dir/server-ca.pem # Корневой сертификат

serial = $dir/serial # Серийный номер запроса

crl = $dir/ssl.crl/server.pem # Текущий лист отзывов подписей

private_key = $dir/server-ca.key # Секретный ключ для основного сертификата

RANDFILE = $dir/ssl.key/.rand # private random number file

Устанавливаем из портов:

# cd /usr/ports/www/apache13-modssl

# make APACHE_DATADIR=/var/www

# make install clean

Генерируем сертификаты (не пользуем make certificate TYPE=custom)...

# cd /etc/ssl

# mkdir ssl.crt

# mkdir ssl.crl

# mkdir ssl.csr

# mkdir ssl.key

# mkdir ssl.prm

# touch index.txt

# echo '01' > serial

Создаем корневой сертификат:

# openssl req -config /etc/ssl/openssl.cnf -new -x509 -keyout ssl.key/server-ca.pem -out server-ca.pem -days 3650

Снимаем пароль с ключа:

# openssl rsa -in ssl.key/server-ca.pem -out server-ca.key

# openssl x509 -in server-ca.pem -out server-ca.crt

Создаем сертификат сервера:

# openssl req -config /etc/ssl/openssl.cnf -new -keyout ssl.key/server.pem -out ssl.csr/server.pem

# openssl rsa -in ssl.key/server.pem -out ssl.key/server.key

# openssl ca -config /etc/ssl/openssl.cnf -policy policy_anything -out ssl.crt/server.pem -infiles ssl.csr/server.pem

Подготовим использование:

# openssl x509 -in ssl.crt/server.pem -out ssl.crt/server.crt

# openssl ca -gencrl -out ssl.crl/server.pem

Найдем в конфиге Апача /usr/local/etc/apache/httpd.conf строчки:

/usr/local/etc/apache/ssl._и_далее

заменяем на

/etc/ssl/ssl._и_ далее

В файл /etc/rc.conf добавляем строчку:

apache_enable="YES"

Стартуем Апач:

/usr/local/etc/rc.d/apache.sh start

Как я понял, сертификат server-ca.crt нужно отдать своим пользователям, чтобы те установили его в качестве сертификата в папку «Доверенных корневых центров сертификации». Этим самым мы уберем все запросы на использование сертификатов, подписанных корневым сертификатом.

Установка почтового сервера

Для создания почтового сервера будем использовать следующее:

Установка PostgreSQL

Установка Postfix

Создание таблиц в БД

Установка Cyrus-SASL2

Установка NOD32

Установка SpamAssassin

Установка Courier-IMAP

Установка PostgreSQL

Собираем из портов. В окне конфигурации выбираем «NLS», «OPTIMIZED_CGLAGS», «THREADSAFE»:

# cd /usr/ports/databases/postgresql81-server/

# make install clean

Добавляем в /etc/rc.conf:

# = PostgreSQL

postgresql_enable="YES"

postgresql_data="/usr/local/pgsql/data"

postgresql_flags="-w -s -m fast"

Инициализируем служебную директорию:

# /usr/local/etc/rc.d/010.pgsql.sh initdb

Запускаем PostgreSQL:

# /usr/local/etc/rc.d/010.pgsql.sh start

Проверяем, что PgSQL работает нормально, выполнив простой SQL запрос:

# sudo -u pgsql psql template1

Welcome to psql 8.0.1, the PostgreSQL interactive terminal.

Type: copyright for distribution terms

h for help with SQL commands

? for help with psql commands

g or terminate with semicolon to execute query

q to quit

template1=# select * from pg_language;

lanname | lanispl | lanpltrusted | lanplcallfoid | lanvalidator | lanacl

----------+---------+--------------+---------------+--------------+------------

internal | f | f | 0 | 2246 |

c | f | f | 0 | 2247 |

sql | f | t | 0 | 2248 | {=U/pgsql}

(3 rows)

template1=#q

Настройку закончим, установив Postfix.

Установка Postfix

Устанавливаем как обычно из портов:

# cd /usr/ports/mail/postfix

# make install clean

в меню выбираем следующие опции:

[X] SASL2

[X] TLS

[X] PgSQL

далее правим пароль пользователя postfix:

# passwd postfix

далее добавим в /etc/periodic.conf (скорее всего этого файла на данный момент нет, тогда создаем):

daily_clean_hoststat_enable="NO"

daily_status_mail_rejects_enable="NO"

daily_status_include_submit_mailq="NO"

daily_submit_queuerun="NO"

После установки необходимо настроить postfix'овский sendmail-заменитель. Для этого проверяем и, при необходимости, правим /etc/mail/mailer.conf, приводя к подобному виду:

# "Настоящий" sendmail находится здесь - /usr/libexec/sendmail/sendmail

sendmail /usr/local/sbin/sendmail

send-mail /usr/local/sbin/sendmail

mailq /usr/local/sbin/sendmail

newaliases /usr/local/sbin/sendmail

hoststat /usr/local/sbin/sendmail

purgestat /usr/local/sbin/sendmail

Все конфигурационные файлы по умолчанию находятся в /usr/local/etc/postfix. Чтобы объяснить Postfix, как ему общаться с БД создадим папку sql, а в ней файлы следующего содержания:

/usr/local/etc/postfix/sql/aliases.pgsql

user = postfix

password = password

dbname = mail

table = aliases

select_field = rcpt

where_field = alias

hosts = localhost

/usr/local/etc/postfix/sql/gids.pgsql

user = postfix

password = password

dbname = mail

table = users

select_field = 6

where_field = login

additional_conditions = and expired = '0'

hosts = localhost

/usr/local/etc/postfix/sql/transport.pgsql

user = postfix

password = password

dbname = mail

table = transport

select_field = transport

where_field = domain

hosts = localhost

/usr/local/etc/postfix/sql/uids.pgsql

user = postfix

password = password

dbname = mail

table = users

select_field = <postfix UID>

where_field = login

additional_conditions = and expired = '0'

hosts = localhost

/usr/local/etc/postfix/sql/users.pgsql

user = postfix

password = password

dbname = mail

table = users

select_field = maildir

where_field = login

additional_conditions = and expired = '0'

hosts = localhost

Отредактируем данные файлы на предмет пароля пользователя postfix и в файле /usr/local/etc/postfix/sql/uids.pgsql проставим реальный UID пользователя postfix (смотрим cat /etc/passwd|grep postfix). Создаем каталог, где Postfix будет хранить maildir-ы виртуальных пользователей:

# mkdir /var/mail/virtual

# chown postfix:mail /var/mail/virtual

# chmod 775 /var/mail/virtual

Создаем минимальную настройку Postfix, для этого в файле /usr/local/etc/postfix/main.cf установим значения следующих переменных (свой домен не забываем!):

mail_owner = postfix

default_privs = nobody

myhostname = domain.ru

mydomain = domain.ru

myorigin = $mydomain

mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain

mynetworks_style = host

mynetworks = 127.0.0.0/8

relay_domains = $mydestination

В конец файла добавляем:smtpd_recipient_restrictions =

permit_sasl_authenticated,

permit_mynetworks,

reject_unauth_destination,

reject_non_fqdn_recipient,

reject_rbl_client list.dsbl.org,

reject_rbl_client relays.ordb.org,

reject_rbl_client dynablock.wirehub.net,

reject_rbl_client blackholes.wirehub.net,

reject_rbl_client dnsbl.njabl.org,

reject_rbl_client dialups.mail-abuse.org,

reject_rbl_client dul.ru

transport_maps = pgsql:/usr/local/etc/postfix/sql/transport.pgsql

virtual_mailbox_base = /var/mail/virtual

virtual_mailbox_maps = proxy:pgsql:/usr/local/etc/postfix/sql/users.pgsql

virtual_alias_maps = proxy:pgsql:/usr/local/etc/postfix/sql/aliases.pgsql

virtual_uid_maps = proxy:pgsql:/usr/local/etc/postfix/sql/uids.pgsql

virtual_gid_maps = proxy:pgsql:/usr/local/etc/postfix/sql/gids.pgsql

relay_domains = $transport_maps

local_recipient_maps = $virtual_mailbox_maps $virtual_maps $transport_maps

smtpd_sasl_auth_enable = yes

smtp_sasl_security_options = noanonymous

broken_sasl_auth_clients = yes

smtp_use_tls = yes

smtp_tls_key_file = /etc/ssl/ssl.key/server.key

smtp_tls_cert_file = /etc/ssl/ssl.crt/server.crt

smtp_tls_CAfile = /etc/ssl/server-ca.pem

smtp_tls_note_starttls_offer = yes

smtp_tls_loglevel = 0

smtpd_tls_auth_only = yes

smtpd_use_tls = yes

smtpd_tls_loglevel = 0

smtpd_tls_received_header = yes

smtpd_tls_session_cache_timeout = 3600s

tls_random_source = dev:/dev/urandom

smtpd_tls_key_file = /etc/ssl/ssl.key/server.key

smtpd_tls_cert_file = /etc/ssl/ssl.crt/server.crt

smtpd_tls_CAfile = /etc/ssl/server-ca.pem

content_filter=smtp:127.0.0.1:10025

spamfilter_destination_recipient_limit = 1

smtp_connection_cache_on_demand = no

В данном конфиге использованы ключи и сертификаты, полученные на шаге инсталляции Apache.

Создание таблиц в БД

Делаем разрешения для пользователя postfix для PostgreSQL. Используем пароль postfix, который ранее устанавливали:

# sudo -u pgsql createuser --no-adduser --no-createdb postfix

# echo "alter user postfix with password 'password';" | sudo -u pgsql psql template1

Создаем саму почтовую базу данных

# sudo -u pgsql createdb mail

Создаем таблицы для почты и даем пользователю postfix права на выборку данных из базы. Делаем файл ~/mail.sql следующего содержания (копируем прямо отсюда, не забываем подставить реальный домен и свой пароль админу):

CREATE TABLE users (

login text not null primary key,

password text not null,

maildir text not null,

expired int not null default '0',

forward char not null default '-',

comment text

);

CREATE INDEX idx_users_login ON users (login);

CREATE INDEX idx_users_login_forward ON users (login, forward);

CREATE TABLE aliases (

alias text not null primary key,

rcpt text not null,

comment text

);

CREATE TABLE transport (

domain text not null primary key,

transport text not null,

comment text

);

grant select on users to postfix;

grant select on aliases to postfix;

grant select on transport to postfix;

INSERT INTO transport VALUES('domain.ru', 'virtual:', 'VIRTUAL TRANSPORT');

INSERT INTO users VALUES('admin@domain.ru', 'Passw0Rd', 'domain.ru/admin/', '0', '-', 'General mail');

INSERT INTO aliases VALUES('root@domain.ru', 'admin@domain.ru');

INSERT INTO aliases VALUES('MAILER-DAEMON@domain.ru', 'postmaster@domain.ru');

INSERT INTO aliases VALUES('postmaster@domain.ru', 'root@domain.ru');

INSERT INTO aliases VALUES('daemon@domain.ru', 'root@domain.ru');

INSERT INTO aliases VALUES('system@domain.ru', 'root@domain.ru');

INSERT INTO aliases VALUES('uucp@domain.ru', 'root@domain.ru');

INSERT INTO aliases VALUES('abuse@domain.ru', 'root@domain.ru');

INSERT INTO aliases VALUES('security@domain.ru', 'root@domain.ru');

INSERT INTO aliases VALUES('ftp@domain.ru', 'root@domain.ru');

INSERT INTO aliases VALUES('ftp-bugs@domain.ru', 'ftp@domain.ru');

«Выполняем» его:

# sudo -u pgsql psql -f ~/mail.sql mail

Этим мы объявляем domain.ru виртуальным, создаем пользователя admin@domain.ru и описываем служебные алиасы (см /etc/mail/aliases) с перенаправлением всей почты на admin@domain.ru. Важно не забывать финальный слеш при вставке значения в поле maildir таблицы users, в противном случае postfix будет производить доставку почты не в maildir, а mailbox. Проверяем, должно быть нечто похожее:

# sudo -u pgsql psql mail

Welcome to psql 8.1.3, the PostgreSQL interactive terminal.

Type: copyright for distribution terms

h for help with SQL commands

? for help with psql commands

g or terminate with semicolon to execute query

q to quit

mail=# d

List of relations

Schema | Name | Type | Owner

--------+----------------+----------+-------

public | aliases | table | pgsql

public | transport | table | pgsql

public | users | table | pgsql

(3 rows)

mail=#

mail=> SELECT * FROM aliases;

...

mail=> SELECT * FROM transport;

...

mail=> SELECT * FROM users;

...

mail=> q

Если есть желание усилить безопасность, то правим файл /usr/local/pgsql/data/pg_hba.conf и меняем значения trust на md5

local all all md5

host all all 127.0.0.1/32 md5

Этим мы меняем тип авторизации с доверенной (вход без пароля) на md5 (вход с паролем используя md5 шифрование). Перезапускаем PostgreSQL:

# /usr/local/etc/rc.d/010.pgsql.sh restart

Установка Cyrus-SASL2

SASL (Simple Authentication and Security Layer) определяет общий метод добавления поддержки аутентификации к протоколам, ориентированным на соединение (POP3, IMAP4, SMTP, FTP, telnet, ACAP, LDAPv3). Для этого протокол включает в себя команды для идентификации и подтверждения подлинности пользователя и для опционального договора выбора метода защиты последующих взаимодействий.

Собираем SASL2 из портов:

# cd /usr/ports/security/cyrus-sasl2

# make WITH_PGSQL=yes WITHOUT_OTP=yes WITHOUT_NTLM=yes

# make install clean

Редактируем /usr/local/lib/sasl2/smtpd.conf:

pwcheck_method: auxprop

auxprop_plugin: sql

sql_engine: pgsql

sql_user: postfix

sql_passwd: password

sql_hostnames: 127.0.0.1

sql_database: mail

sql_select: select password from users where login='%u@%r'

sql_verbose: yes

Установка NOD32

Данный антивирус очень хорошо зарекомендовал себя с точки зрения чистоты проверки - находил много после наиболее известных антивирусов - KAV, DrWEB, ClamAV. Один недостаток - платный. Покупка или не покупка данного антивируса - личное дело каждого. В данной статье рассматривается лишь установка. Более другую информацию находим тут:

http://www.esetnod32.ru/

http://forum.ru-board.com (используем поиск)

Итак, имеем NOD32 for Linux Mail Servers (for use with FreeBSD) архив - nod32lms-2.15.rar или nod32lms-2.15.tar.bz2. Содержимое архива разархивируем в соответствующие каталоги:

/etc/nod32

nod32d_script

nod32.auth

nod32.cfg

sig_footer_clean.html.example

sig_footer_infected.html.example

sig_header_clean.html.example

sig_header_infected.html.example

/usr/bin

nod32cli

nod32mda

nod32smfi <---- не копируем "а скрипач ... скрипач не нужен, родной" (с) Кин-дза-дза

nod32smtp

/usr/local/etc/rc.d

nod32d.sh

nod32smfi.sh <---- не копируем

nod32smtp.sh

/usr/local/sbin

nod32_update

nod32d

nod32umc

nod32upd

/usr/share/doc/nod32lms

copyright

guide.us.txt.gz

/usr/share/man/man1

nod32cli.1.gz

nod32mda.1.gz

nod32smfi.1.gz

nod32smtp.1.gz

/usr/share/man/man5

nod32.5.gz

nod32.cfg.5.gz

/usr/share/man/man8

nod32d.8.gz

nod32umc.8.gz

nod32upd.8.gz

/var/lib/nod32

nod32.000

nod32.002

nod32.003

nod32.004

Далее выполним некоторые подготовительные действия:

# cp /etc/nod32/sig_footer_clean.html.example /etc/nod32/sig_footer_clean.html

# cp /etc/nod32/sig_footer_infected.html.example sig_footer_infected.html

# cp /etc/nod32/sig_header_clean.html.example sig_header_clean.html

# cp /etc/nod32/sig_header_infected.html.example sig_header_infected.html

Правим под себя сообщения антивируcа в письмах:

# mcedit /etc/nod32/sig_footer_clean.html

# mcedit /etc/nod32/sig_footer_infected.html

# mcedit /etc/nod32/sig_header_clean.html

# mcedit /etc/nod32/sig_header_infected.html

Проставим права на выполнение:

# chmod 0555 /usr/bin/nod32cli

# chmod 0555 /usr/bin/nod32mda

# chmod 0555 /usr/bin/nod32smtp

# chmod 0555 /usr/local/etc/rc.d/nod32d.sh

# chmod 0555 /usr/local/etc/rc.d/nod32smtp.sh

Сделаем резервную копию конфигурационного файла до его правки:

# cp /etc/nod32/nod32.cfg /etc/nod32/nod32.cfg.default

В конфигурационном файле /etc/nod32/nod32.cfg делаем правки - находим в соответствующих секциях строки и заменяем (остальные настройки - по вашему усмотрению):

[global]

log_all = yes

log_level = 5

syslog_enabled = yes

[smtp]

listenport = 10025

serverport = 10026

write_to_header = 1

Позже уровень отладки можно будет снизить поправив соответствующие настрой ки в секции Global. Попробуем запустить:

# /usr/local/etc/rc.d/nod32d.sh start

возможно появится сообщение:

/usr/libexec/ld-elf.so.1: Shared Object "libc.so.4" not found, required by "nod32d"

Тогда делаем симлинк:

# ln -s /lib/libc.so.6 /usr/lib/libc.so.4

На этом пока все, подключим после установки антиспам-системы SpamAsssassin.

Установка SpamAssassin

SpamAssassin - почтовый фильтр, который использует различные эвристические анализаторы заголовков почты и в основном тексте для идентификации спама. Написан на PERL (исключение составляет модуль spamd). Использует комплексный подход к проверке писем на спам, начиная от заголовков SMTP сессии (к сожалению на данный момент не умеет получать эту информацию из самой сессии, использует для этого заголовки письма) и заканчивая фильтрацией тела письма. Из плюсов: большое количество проверок увеличивает шанс отлова спама, возможность самообучения, возможность вручную переопределять веса правил, эвристический анализатор текста письма. Из минусов: из-за большого количества проверок возможны ложные срабатывание, эвристические методы в режиме самообучения могут ошибочно посчитать SPAM нормальным письмом, после чего количество правильно распознаваемого спама сильно упадет, достаточно сильно нагружает систему.

Устанавливаем из портов, в окошке конфигурации сборки отмечаем следующее: AS_ROOT, SSL, RAZOR, SPF_QUERY, TOOLS

# cd /usr/ports/mail/p5-Mail-SpamAssassin

# make install clean

Создадим файл /usr/local/etc/mail/spamassassin/local.cf:

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

#

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

lock_method flock

trusted_networks 127/8

trusted_networks 127.

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

rewrite_header subject [Possible SPAM]:

required_hits 6.0

required_score 6.0

report_safe 0

use_bayes 1

bayes_auto_learn 0

skip_rbl_checks 0

use_razor2 0

use_dcc 0

use_pyzor 0

use_auto_whitelist 0

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

auto_whitelist_path /var/spool/filter/spamassassin/auto_whitelist

bayes_path /var/spool/filter/spamassassin/bayes

auto_whitelist_file_mode 0770

bayes_file_mode 0770

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

ok_languages all

ok_locales all

report_charset windows-1251

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

score FROM_ILLEGAL_CHARS 0.0

score HEAD_ILLEGAL_CHARS 0.0

score SUBJ_ILLEGAL_CHARS 0.0

score DOMAIN_RATIO 1.5

score X_LIBRARY 0.5

score DRUGS_ERECTILE 2.0

score DRUGS_ERECTILE_OBFU 2.0

score FROM_ENDS_IN_NUMS 0.0

score RCVD_IN_NJABL_DUL 0.0

score PRIORITY_NO_NAME 0.0

#

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

Выполним следующее:

# mkdir -p /var/spool/filter/spamassassin/

# chmod -R 777 /var/spool/filter

Добавим пользователя filter, под ним будем запускать SpamAssassin:

# pw user add -n filter -c "Mail Filter" -d /var/spool/filter -s /usr/sbin/nologin

Пропишем запуск в /etc/rc.conf:

spamd_enable="YES"

spamd_flags="-c -x -m 5 -u filter"

Запускаем:

# /usr/local/etc/rc.d/sa-spamd.sh start

Проверяем работоспособность:

# echo TEST | spamc

Должно получиться нечто похожее:

X-Spam-Checker-Version: SpamAssassin 3.1.1 (2006-03-10) on

host.domain.ru

X-Spam-Level: *****

X-Spam-Status: No, score=5.7 required=6.0 tests=EMPTY_MESSAGE,MISSING_HB_SEP,

MISSING_HEADERS,MISSING_SUBJECT,NO_RECEIVED,NO_RELAYS,TO_CC_NONE

autolearn=disabled version=3.1.1

TEST

Далее подключаем NOD32 и SpamAssassin к Postfix'у. Создадим скрипт для передачи SpamAssasin'y почтовых сообщений и их возврат. Для этого создается каталог /usr/local/etc/postfix/scripts и в нем файл /usr/local/etc/postfix/scripts/filter-spam.pl:

#!/usr/bin/perl

use strict;

use Net::SMTP;

my $host = sall_ch($ARGV[0], '"');

my $ehlo = sall_ch($ARGV[1], '"');

my $mail_from = sall_ch($ARGV[2], '"');

my $rcpt_to = sall_ch($ARGV[3], '"');

my $spamc = sall_ch($ARGV[4], '"');

system("echo $host-$ehlo-$mail_from-$rcpt_to-$spamc >> /var/log/filter-spam.log");

if (!defined($host)||!defined($ehlo)||!defined($mail_from)||!defined($rcpt_to)) {

die("use $0 <host> <ehlo> <mail_from> <rcpt_to> [cmd] ");

}

if (defined($spamc)) {

open(CF, "$spamc |") or undef($spamc);

}

my $smtp = Net::SMTP->new($host);

$smtp->hello($ehlo);

$smtp->mail($mail_from);

$smtp->to($rcpt_to);

$smtp->data();

if (defined($spamc)) {

while(<CF>) {

next if (/^delivered-to:/i);

$smtp->datasend($_);

}

}

else {

while(<>) {

next if (/^delivered-to:/i);

$smtp->datasend($_);

}

}

$smtp->dataend();

close(CF) if defined($spamc);

$smtp->quit;

exit 0;

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

sub sall_ch() {

my($string, $chars) = @_;

return(undef) unless defined($string);

$string =~ s/^[Q$charsE]+//;

$string =~ s/[Q$charsE]+$//;

return($string);

}

Права на исполнение:

# chmod 0600 /usr/local/etc/postfix/scripts/filter-spam.pl

Добавляем в файл /usr/local/etc/postfix/master.cf строки:

localhost:10026 inet n - n - - smtpd

-o content_filter=spamfilter

-o myhostname=mailer.urspectr.info

spamfilter unix - n n - 10 pipe

flags=R

user=filter argv=/usr/local/etc/postfix/scripts/filter-spam.pl "localhost:10027" "spamfilter" "${sender}" "${recipient}" "/usr/local/bin/spamc"

localhost:10027 inet n - n - 10 smtpd

-o content_filter=

-o local_recipient_maps=

-o relay_recipient_maps=

-o smtpd_helo_restrictions=

-o smtpd_client_restrictions=

-o smtpd_sender_restrictions=

-o mynetworks=127.0.0.0/8

-o smtpd_recipient_restrictions=permit_mynetworks,reject

-o myhostname=localhost

Поскольку передача данных между фильтрами осуществляется по протоколу SMTP, то исключим хост 127.0.0.1 (localhost) из TLS. Для этого в файл конфигурации Postfix'а /usr/local/etc/postfix/main.cf добавим еще строчку:

smtp_tls_per_site = hash:/usr/local/etc/postfix/smtp_tls_per_site

И выполним:

# cd /usr/local/etc/postfix

# echo "localhost NONE" > /usr/local/etc/postfix/smtp_tls_per_site

# echo "localhost.domain.ru NONE" >> /usr/local/etc/postfix/smtp_tls_per_site

# postmap hash:smtp_tls_per_site

при создании хэшей разделители пар могут быть и табуляции и пробелы, или только табуляции?

Должен появится файл /usr/local/etc/postfix/smtp_tls_per_site.db

Добавим загрузку Postfix'а в /etc/rc.conf:

postfix_enable="YES"

Осталось проверить настройку Postfix+NOD32+SpamAssassin. Для этого сперва проверим корректность файлов конфигурации Postfix'а (в случае, когда все нормально - сообщений быть не должно):

postfix check

Потом перестартуем необходимые нам службы. Желательно перед этим почистить логи (первые четыре строчки), а после старта их просмотреть:

# echo === > /var/log/auth.log

# echo === > /var/log/debug.log

# echo === > /var/log/messages

# echo === > /var/log/maillog

# /usr/local/etc/rc.d/010.pgsql.sh restart

# /usr/local/etc/rc.d/nod32d.sh start

# /usr/local/etc/rc.d/nod32smtp.sh start

# /usr/local/etc/rc.d/postfix.sh start

И в телнете создадим тестовое письмо:

# telnet localhost 25

TODO: Описать тестирование

Установка Courier-IMAP

http://www.courier-mta.org/imap

Courier-IMAP - сервер, предоставляющий IMAP доступ к почтовым ящикам формата Maildir. IMAP сервер не позволяет работать с традиционными почтовыми ящиками формата mailbox. Courier-IMAP включает в себя некоторые расширения к стандартному формату хранения Maildir почты, для поддержания дополнительных возможностей, таких как IMAP папки и <мягкие> квоты. Так же он способен работать со стандартными папками Maildir, правда в этом случае дополнительные возможности не доступны. И главное, он позволяет работать с виртуальными пользователями, что будет весьма полезно при построении нашей системы. Помимо IMAP сервера, он включает в себя POP3 сервер, с возможностью работы через SSL.

Установим демон идентификации Courier-IMAP - courier-authlib, в появляющемся окошке опций выбираем только AUTH_PGSQL:

# cd /usr/ports/security/courier-authlib

# make install clean

В каталоге /usr/local/etc/authlib создаем следующие файлы:

/usr/local/etc/authlib/authdaemonrc

authmodulelist="authpgsql"

authmodulelistorig="authpgsql"

daemons=5

authdaemonvar=/var/run/authdaemond

DEBUG_LOGIN=0

DEFAULTOPTIONS="wbnodsn=1"

/usr/local/etc/authlib/authpgsqlrc

PGSQL_HOST localhost

PGSQL_PORT 5432

PGSQL_USERNAME postfix

PGSQL_PASSWORD password

PGSQL_DATABASE mail

PGSQL_USER_TABLE users

PGSQL_CLEAR_PWFIELD password

PGSQL_UID_FIELD <POSTFIX UID>

PGSQL_GID_FIELD 6

PGSQL_LOGIN_FIELD login

PGSQL_HOME_FIELD '/var/mail/virtual'

PGSQL_MAILDIR_FIELD maildir

PGSQL_WHERE_CLAUSE expired = '0'

Добавляем строку в /etc/rc.conf

courier_authdaemond_enable="YES"

Запускаем

# /usr/local/etc/rc.d/courier-authdaemond.sh start

С демоном аутентификации закончили, устанавливаем сам Courier-IMAP. Выбираем пункт OPENSSL, со всех остальных снимаем выделение:

# cd /usr/ports/mail/courier-imap

# make install clean

Правим файлы конфигурации.

/usr/local/etc/courier-imap/pop3d

PIDFILE=/var/run/pop3d.pid

MAXDAEMONS=10

MAXPERIP=2

POP3AUTH="LOGIN PLAIN CRAM-MD5"

POP3AUTH_ORIG="PLAIN LOGIN CRAM-MD5"

POP3AUTH_TLS="LOGIN PLAIN"

POP3AUTH_TLS_ORIG="LOGIN PLAIN"

POP3_PROXY=0

PORT=110

ADDRESS=0

TCPDOPTS="-nodnslookup -noidentlookup"

LOGGEROPTS="-name=pop3d"

DEFDOMAIN="@domain.ru"

POP3DSTART=YES

MAILDIRPATH=Maildir

/usr/local/etc/courier-imap/pop3d-ssl

SSLPORT=995

SSLADDRESS=0

SSLPIDFILE=/var/run/pop3d-ssl.pid

SSLLOGGEROPTS="-name=pop3d-ssl"

POP3DSSLSTART=YES

POP3_STARTTLS=YES

POP3_TLS_REQUIRED=0

COURIERTLS=/usr/local/bin/couriertls

TLS_PROTOCOL=SSL3

TLS_STARTTLS_PROTOCOL=TLS1

TLS_CERTFILE=/etc/ssl/server-courier.pem

TLS_VERIFYPEER=NONE

TLS_CACHEFILE=/usr/local/var/couriersslcache

TLS_CACHESIZE=524288

MAILDIRPATH=Maildir

/usr/local/etc/courier-imap/imapd

ADDRESS=0

PORT=143

MAXDAEMONS=16

MAXPERIP=2

PIDFILE=/var/run/imapd.pid

TCPDOPTS="-nodnslookup -noidentlookup"

LOGGEROPTS="-name=imapd"

DEFDOMAIN="@domain.ru"

IMAP_CAPABILITY="IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA IDLE"

IMAP_KEYWORDS=1

IMAP_ACL=1

IMAP_CAPABILITY_ORIG="IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA AUTH=CRAM-MD5 AUTH=CRAM-SHA1 AUTH=CRAM-SHA256 IDLE"

IMAP_PROXY=0

IMAP_PROXY_FOREIGN=0

IMAP_IDLE_TIMEOUT=60

IMAP_CAPABILITY_TLS="$IMAP_CAPABILITY AUTH=PLAIN"

IMAP_CAPABILITY_TLS_ORIG="$IMAP_CAPABILITY_ORIG AUTH=PLAIN"

IMAP_DISABLETHREADSORT=0

IMAP_CHECK_ALL_FOLDERS=0

IMAP_OBSOLETE_CLIENT=0

IMAP_UMASK=022

IMAP_ULIMITD=65536

IMAP_USELOCKS=1

IMAP_SHAREDINDEXFILE=/usr/local/etc/courier-imap/shared/index

IMAP_ENHANCEDIDLE=0

IMAP_TRASHFOLDERNAME=Trash

IMAP_EMPTYTRASH=Trash:7

IMAP_MOVE_EXPUNGE_TO_TRASH=0

SENDMAIL=/usr/sbin/sendmail

HEADERFROM=X-IMAP-Sender

IMAPDSTART=NO

MAILDIRPATH=Maildir

/usr/local/etc/courier-imap/imapd-ssl

SSLPORT=993

SSLADDRESS=0

SSLPIDFILE=/var/run/imapd-ssl.pid

SSLLOGGEROPTS="-name=imapd-ssl"

IMAPDSSLSTART=NO

IMAPDSTARTTLS=YES

IMAP_TLS_REQUIRED=0

COURIERTLS=/usr/local/bin/couriertls

TLS_PROTOCOL=SSL3

TLS_STARTTLS_PROTOCOL=TLS1

TLS_CERTFILE=/etc/ssl/server-courier.pem

TLS_VERIFYPEER=NONE

TLS_CACHEFILE=/usr/local/var/couriersslcache

TLS_CACHESIZE=524288

MAILDIRPATH=Maildir

Добавляем запуск в /etc/rc.conf:

courier_imap_pop3d_enable="YES"

courier_imap_pop3d_ssl_enable="YES"

courier_imap_imapd_enable="YES"

courier_imap_imapd_ssl_enable="YES"

Создадим для Courier-IMAP модифицированный TLS-файл:

# cat /etc/ssl/ssl.key/server.key > /etc/ssl/server-courier.pem

# cat /etc/ssl/ssl.crt/server.crt >> /etc/ssl/server-courier.pem

И стартуем:

# /usr/local/etc/rc.d/courier-imap-pop3d.sh start

# /usr/local/etc/rc.d/courier-imap-pop3d-ssl.sh start

# /usr/local/etc/rc.d/courier-imap-imapd.sh start

# /usr/local/etc/rc.d/courier-imap-imapd-ssl.sh start

Установка pop3client

Создаваемый почтовый сервер изначально предназначался для работы в Интранете. Таким образом, нам необходимо обеспечить возможность загрузки почтовых сообщений с почтового сервера провайдера. Для этой цели буду использовать давным давно написанный мною скрипт на Perl под скромным названием pop3client. Скрипт писался давно, в то время, когда fetchmail еще не мог нормально работать с UIDL и давал массу сбоев на линиях с частыми обрывами (ранее пользовался исключительно дайл-ап). Скрипт позволяет обеспечить два важных момента - отсутствие дублей и максимальная скорость выгрузки почты.

Отсутствие дублей обеспечивается временным списком UIDL, скорость выгрузки - использованием частичного приема писем. Пример: в ящике 1000 писем, за сессию принято 800, произошел обрыв. Следующая сессия пропустит 800 писем и примет оставшиеся. Если же мы введем частичный прием (параметр «part = 200» в описываемом ниже файле конфигурации, отличный от нуля), то сессия по приему примет 200 писем с сервера, потом их удалит, закончится, и позже повторит частичную загрузку заново. Если обрывов много и ящик заполнен - этот подход значительно повысит скорость выгрузки почты с почтового сервера провайдера.

Начнем установку. Сперва создадим конфигурационный файл /usr/local/etc/pop3client.conf для работы с учетной записью на сервере провайдера:

# ===================================================

# Пример конфигурационного файла для pop3client.pl

# ===================================================

user = username

pass = password

host = mail.domain.ru

port = 110

mail = /var/spool/pop3client/inbox

bad = /var/spool/pop3client/bad

work = /var/spool/pop3client/work.tmp

uidl = /var/spool/pop3client/uidl.tmp

domain = domain.ru

proc = sendmail -i

part = 50

time = 120

copy = 1

logs = 1

Кратко о параметрах. «mail» - каталог, куда будут складываться принятые письма, если параметр «proc» не указан. В этом случае письма просто принимаются и складируются, но в почтовую систему не попадают. Параметр «copy» вне зависимости от наличия параметра «proc» позволяет копировать всю почту в каталог, указанный параметром «mail». По умолчанию же каждое письмо принимается в файл, определяемый параметром «work» и отсылается в наш почтовый сервер командой, определяемой параметром «proc». Параметр «uidl» - в каком файле хранить список уникальных идентификаторов текущей незавершенной сессии. Параметр «part» указывает, по каким частям принимать (по сколько максимально) сообщения за сеанс. Если параметр не указан или = 0, то принимаются все письма. Параметр «time» - время выхода по таймауту. Параметр «logs» - определяет уровань отладочных сообщений. Если указан параметр «domain», то каждое письмо после приема проверяется на соответствие адреса домена получателя домену, указанному в данном параметре. Если соответствие есть, идет обработка, если соответствия нет - письмо копируется в каталог, определяемый параметром «bad». Если параметр «bad» не определен, некорректные письма просто удаляются из сервера провайдера и в обработку не поступают.

Отладочные сообщения ложаться в файл /var/log/pop3client.log

Создатим рабочие каталоги:

# mkdir -p /var/spool/pop3client/mail

Права доступа выставляйте на свое усмотрение.

Создадим сам скрипт /usr/local/bin/pop3client.pl:

#!/usr/bin/perl

## pop3client version 2.2 ##########################################

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

## Этот скрипт работает подобно программе FetchMail. Основное ##

## назначение его - принятие почты по протоколу POP3. Особенность ##

## скрипта - работа в условиях частых обрывов, обеспечение ##

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

## -------------------------------------------------------------- ##

## Автор О.Мельников, 2006 | e-mail : melnikov@softhome.net ##

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

use FileHandle;

use Mail::POP3Client;

$CfgPath = "/usr/local/etc";

$PidPath = "/var/run";

$LogFile = "/var/log/pop3client.log";

$CfgFile = ($ARGV[0]) ? $ARGV[0] : "$CfgPath/pop3client.conf";

$PidFile = $CfgFile;

$PidFile =~ s///-/gs;

$PidFile = "$PidPath/pop3client$PidFile.pid";

@LMon = ("Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек");

$LUsr = getlogin();

$LPid = $$;

# ----------------------------------------------------------------------

# определение обработчиков die и warn

# ----------------------------------------------------------------------

# open(STDERR,'>/dev/null');

$SIG{__DIE__} = sub {

my $Msg = shift;

open(F,">>$Logfile");

my @T = localtime();

$Msg = sprintf("%s %02d %02d:%02d:%02d %s %s[%d]: %s ",($LMon[$T[4]],$T[3],$T[2],$T[1],$T[0],$LUsr,"pop3client",$$," error: $Msg"));

print F $Msg;

close F;

exit;

};

$SIG{__WARN__} = sub {

my $Msg = shift;

open(F,">>$Logfile");

my @T = localtime();

$Msg = sprintf("%s %02d %02d:%02d:%02d %s %s[%d]: %s ",($LMon[$T[4]],$T[3],$T[2],$T[1],$T[0],$LUsr,"pop3client",$$," warning: $Msg"));

print F $Msg;

close F;

};

# ----------------------------------------------------------------------

# Начало программы

# ----------------------------------------------------------------------

$lh = new FileHandle;

$lh->open(">>$LogFile") || die "открытие log-файла ($LogFile)";

die "cессия с данным файлом конфигурации ($CfgFile) уже запущена!" if (-e $PidFile);

open(PID,">>$PidFile") || die "создание PID ($PidFile) файла сессии!";

print PID $$;

close(PID);

$PID = 1;

open(CONF, $CfgFile) || die "открытие файла конфигурации";

foreach $i (<CONF>) {

next if ($i =~ /s*#.*/);

$Conf{$1}=$2 if ($i =~ /(S+)s*=s*(.+)s*/);

}

close(CONF);

# Разбор конфига

$User = $Conf{"user"};

$Pass = $Conf{"pass"};

$Host = $Conf{"host"};

$Port = ($Conf{"port"}) ? $Conf{"port"} : 110;

$Mail = ($Conf{"mail"}) ? $Conf{"mail"} : "/var/spool/pop3client/inbox";

$Bad = ($Conf{"bad"}) ? $Conf{"bad"} : "/var/spool/pop3client/bad";

$Work = ($Conf{"work"}) ? $Conf{"work"} : "/var/spool/pop3client/work.tmp";

$Uidl = ($Conf{"uidl"}) ? $Conf{"uidl"} : "/var/spool/pop3client/uidl.tmp";

$Dom = ($Conf{"domain"});

$Proc = $Conf{"proc"};

$Part = ($Conf{"part"}) ? $Conf{"part"} : 0;

$Time = ($Conf{"time"}) ? $Conf{"time"} : 120;

$Logs = ($Conf{"logs"}) ? $Conf{"logs"} : 2;

$Copy = ($Conf{"copy"}) ? $Conf{"copy"} : 0;

# $Logs :

# 0 - молчание

# 1 - по каждому письму отчет по заголовкам

# 2 - все подробности

Message(2,"+ начало сеанса приема");

Message(2," user : $User");

Message(2," pass : $Pass");

Message(2," host : $Host");

Message(2," port : $Port");

Message(2," mail : $Mail");

Message(2," bad : $Bad");

Message(2," work : $Work");

Message(2," uidl : $Uidl");

Message(2," domain : $Dom");

Message(2," proc : $Proc");

Message(2," part : $Part");

Message(2," time : $Time");

Message(2," logs : $Logs");

Message(2," copy : $Copy");

# Проверка каталогов

die "каталог для записи принятых сообщений отсутствует" if ((!$Proc || $Copy) && !-d $Mail);

die "каталог для записи принятых сообщений c ошибками отсутствует" if ($Bag && !-d $Bad);

die "почтовый сервер не указан" unless($Host);

die "логин не указан" unless($User);

die "пароль не указан" unless($Pass);

$Debug = 1 if ($Logs > 1);

# Подготовка

$loc{"HOST"} = $Host;

$loc{"PORT"} = $Port;

$loc{"USER"} = $User;

$loc{"PASSWORD"} = $Pass;

$loc{"TIMEOUT"} = $Time;

$loc{"DEBUG"} = $Debug;

$loc{"AUTH_MODE"} = "PASS";

$pop = new Mail::POP3Client(%loc);

die "связь не установлена" if ($pop->{"STATE"} eq "DEAD");

# Подсчет файлов к получению

$Count = $pop->Count();

Message(2," всего к получению сообщений: $Count");

unless($Count) {

$pop->Close();

exit(0);

}

# Читаем список принятых сообщений

if (-f $Uidl) {

open(UIDL,$Uidl) || die "чтение списка принятых файлов";

@Uidl = <UIDL>;

close(UIDL);

chomp @Uidl;

map { $Uidl{$_}=1 } @Uidl;

}

# Принимаем сообщения

for($i=1; $i<=$Count; $i++ ) {

last if ($Part && ($i>$Part));

$U = $pop->Uidl($i); chomp $U;

$U =~ s/(S*)s(S+)s*/$2/;

$U =~ s/[<>]//gs;

$U =~ s/[@,.]/-/gs;

if ($Uidl{$U}) {

Message(2," сообщение #$i: UIDL $U - найдено и удалено");

$pop->Delete($i);

} else {

Message(2," сообщение #$i: UIDL $U - принимается");

$fh = new FileHandle;

$fh->open(">$Work") || die "открытие сообщения #$i для записи";

if ($pop->RetrieveToFile($fh,$i)) {

$fh->close;

open(WORK,$Work) || die "чтение принятого сообщения";

@M = <WORK>;

close(WORK);

unlink($Work);

$Req = GetSenderRecipient(@M);

($Sender,$Recipient) = (${$Req}[0],${$Req}[1]);

if ($Recipient) {

if ($Dom) {

if (($Recipient =~ /[^@]@(.+)/) && ($1 eq $Dom)) {

WriteMsg(@M,"|$Proc -f $Sender $Recipient") if ($Proc);

WriteMsg(@M,">$Mail/$U.msg") if ($Copy || !$Proc);

Message(1,sprintf(" * %s : %s : %s",($Sender,$Recipient,$U)));

} elsif ($Bad) {

WriteMsg(@M,">$Bad/$U.msg");

Message(1,sprintf(" ! %s : %s : %s",($Sender,$Recipient,$U)));

}

} else {

}

} elsif($Bad) {

WriteMsg(@M,">$Bad/$U.msg");

Message(1,sprintf(" ! %s : %s : %s",($Sender,$Recipient,$U)));

}

open(UIDL,">>$Uidl") || die "открытие списка UIDL";

print UIDL "$U ";

close(UIDL);

$pop->Delete($i);

} else {

die "ошибка получения сообщения #$i";

}

}

}

# Завершение

$pop->Close();

unlink($Uidl) || MyExit("удаление списка UIDL");

exit(0);

# ----------------------------------------------------------------------

# Получение адресов "отправителя" и "получателя"

# ----------------------------------------------------------------------

sub GetSenderRecipient() {

my @M = @_;

my ($I,$J,$LH,$LB,@H,$R,$S);

my @Title = ("Apparenly-To","EnvelopeTo","Envelope-To","X-EnvelopeTo",

"X-Envelope-To","X-Recipient","Deliver-To","Delivered-To");

@M = split('x0d',$M[0]) unless ($M[1]);

# построение массива заголовков

foreach $I (@M) {

if ($I =~ /^s*$/) {

push(@H,[$LH,$LB]) if ($LH);

last;

}

if ($I =~ /^([a-zA-Z-]+):s*(.+)s*$/) {

push (@H,[$LH,$LB]) if ($LH);

$LH = $1;

$LB = $2;

}

elsif ($I =~ /^s+(.+)s*$/) {

$LB .= " $1";

}

}

# поиск "Кому"

foreach $I (@H) {

last if ($R);

if (${$I}[0] eq "Received") {

$R = $1 if (${$I}[1] =~ /.*fors+.*?([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+).*/);

}

}

foreach $I (@Title) {

last if ($R);

foreach $J (@H) {

last if ($R);

$R = $1 if ((${$J}[0] eq $I) && (${$J}[1] =~ /.*?([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+).*/));

}

}

# поиск "Oт кого"

foreach $I (@H) {

if (${$I}[0] eq "From") {

if (${$I}[1] =~ /^.*?([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+).*$/) {

$S = $1;

last;

}

}

}

return [$S,$R];

}

# ----------------------------------------------------------------------

# Запись сообщения в файл

# ----------------------------------------------------------------------

sub WriteMsg {

my ($M,$N) =@_;

my $FH = new FileHandle;

$FH->open("$N") || die "открытие файла ($N) для записи";

$FH->write(join("",@{$M}));

$FH->close;

}

# ----------------------------------------------------------------------

# Действия после работы скрипта

# ----------------------------------------------------------------------

sub END {

unlink($Work) if (-e $Work);

unlink($PidFile) if ($PID);

Message(2,"- завершение сеанса приема");

$lh->close;

}

# ----------------------------------------------------------------------

# Печать сообщения в log-файл

# ----------------------------------------------------------------------

sub Message() {

my ($Lev,$Msg) = @_;

if ($Lev <= $Logs) {

my @T = localtime();

$Msg = sprintf("%s %02d %02d:%02d:%02d %s %s[%d]: %s",($LMon[$T[4]],$T[3],$T[2],$T[1],$T[0],$LUsr,"pop3client",$$,$Msg));

print $lh "$Msg ";

}

}

Проставляем для скрипта нужные права на исполнение. Далее. Для работы скрипта на http://cpan.org ищем модуль Mail::POP3Client и устанавливаем его. В каталоге, где развернут принятый архив выполняем:

# perl Makefile.PL

# make

# make test

# make install

После первого запуска отладочную информацию можно выключить. Если не проходит авторизация, смотрите уж сами Mail::POP3Client.pm - там все есть и не сложно. После отладки запуск скрипта нужно прописать в cron.

TODO:

сделать протоколирование получения писем по заголовкам (поле Subject)

сделать и задокументировать прием писем по условию

сделать и задокументировать прием писем без задержки, если принята часть писем по параметру «part», но на почтовом сервере провайдера письма еще остались

Установка smtpclient

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

Раньше я использовал релей провайдера с авторизацией, когда был на дайл-апе, сейчас - провайдер просто прописал мой IP в качестве доверенных. Вот именно для отправки с авторизацией я и использовал скрипт на Perl под названием smtpclient.pl. Далее разделю данный раздел на два: отправка почты через релей провайдера без авторизацией и с оной.

Отправка почты через релей провайдера без авторизации

Для реализации сего просто добавим в таблицу наших «транспортов» еще одну запись:

* smtp [адрес] коментарий

Сразу замечания. Если вы проставили большую секретность при коннекте с PostgreSQL в файле /usr/local/pgsql/data/pg_hba.conf изменив trust на md5, огорчу вас - измените все как было (md5 na trust), перегрузите настройки:

# /usr/local/etc/postfix.sh reload

выполните (заменив mail.domain.ru на ваш):

# echo "INSERT INTO transport VALUES('*', 'smtp:[mail.domain.ru]', 'Current relay');" | sudo -u pgsql psql mail

Замените в файле /usr/local/pgsql/data/pg_hba.conf опять trust на md5 и пререгрузите настройки Postfix'a как было написано раньше.

Может всеже имеет смысл дать права пользователю Postfix и нa INSERT и на DELETE?

Отправка почты через релей провайдера c авторизацией

TODO: в свое время написал скрипт для QMail для отправки писем c авторизацией по CRAM-MD5, надо только разобоаться как прикрутить ... надо? - обсуждаем

Установка SquirrelMail

Не столько для себя, сколько по просьбам решил поставить web-почту. Получилось примерно вот так:

# cd /usr/ports/mail/squirrelmail

# make install clean

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

# cp /usr/local/etc/php.ini-dist /usr/local/etc/php.ini

Произвел некоторые правки:

file_uploads = On

session.auto_start = 1

session.bug_compat_42 = 0

session.bug_compat_warn = 0

По умолчанию SquirrelMail сел в /usr/local/www/squirrelmail, нам надо прописать его в конфиг Apache /usr/local/etc/apache/httpd.conf. Сперва для удобства я сделал:

# ln -s /usr/local/www/squirrelmail /var/www/data/squirrelmail

В конфиге Апача /usr/local/etc/apache/httpd.conf описал корневой каталог (пока он с документацией), добавил некоторые настройки (очень важно, чтобы имя хоста соответствовало тому имени, на которое был сгенерен сертификат при установе Апача):

DirectoryIndex index.php index.html index.htm

# ...

<Directory />

SSLOptions +StdEnvVars

# ...

<Directory />

SetEnvIf User-Agent ".*MSIE.*"

nokeepalive ssl-unclean-shutdown

downgrade-1.0 force-response-1.0

<VirtualHost _default_:*>

ServerAdmin admin@domain.ru

DocumentRoot /var/www/data

ServerName host.domain.ru

ErrorLog /var/log/http_host.domain.ru_log

CustomLog /var/log/http_host.domain.ru_acceess.log common

</VirtualHost>

# ...

<VirtualHost host.domain.ru:443>

DocumentRoot "/var/www/data"

ServerName host.domain.ru

ServerAdmin admin@domain.ru

ErrorLog /var/log/ssl-httpd-error.log

TransferLog /var/log/ssl-httpd-access.log

# ...

</VirtualHost>

# ...

<IfModule mod_alias.c>

# ...

# Почта

Alias /mail/ "/var/www/data/squirrelmail/"

<Directory "/var/www/data/squirrelmail">

Options Indexes MultiViews

Order allow,deny

Allow from all

</Directory>

# ...

<IfModule mod_mime.c>

# ...

# PHP

AddType application/x-httpd-php .php

AddType application/x-httpd-php-source .phps

После данной настройки перестартовал Апач:

# /urs/local/etc/rc.d/apache.sh restart

Далее нужно пройти процедуру конфигурации SquirrelMail. Для этого выполняем:

# cd /var/www/data/squirrelmail

# ./configure

В интерактивном режиме заполняем специфические настройки (как-то доменное имя, язык интерфейса и пр.), рекомендую самостоятельно пробежаться по всем настройкам. И в конце не забыть их сохранить! Логотип вашей организации можно загрузить сюда (вместо существующего) - /var/www/data/squirrelmail/images/sm_logo.png

Вот собственно и все. загружать в обозревателе https://host.domain.ru/mail/ и вводить реквизиты, например, для админа мы определяли логин - admin@domain.ru, пароль - Passw0Rd

doc/freebsd6_bulldozer_howto.txt · Последние изменения: 2008/05/24 23:39 От dukeartem

http://wiki.bsdportal.ru/doc:freebsd6_bulldozer_howto
Обновлено: 12.03.2015