пятница, 4 мая 2012 г.

Настройка почтового сервера на FreeBSD 8.2


uname -a
FreeBSD guyu.local 8.2-RELEASE FreeBSD 8.2-RELEASE #4: Wed Mar  7 12:30:22 MAGT 2012     root@guyu.local:/usr/obj/usr/src/sys/MYGATE  amd64
это система на которой все происходит.
Задача: Поднять маил сервер. Пользователи не должны быть системными.
Все скопипизженно с http://www.lissyara.su/ 
Короче пытаемся воткнуть EXIM c DOVECOT ну и чтобы юзверями рулить postfixadmin.
Уважаемый lissyara советует воткнуть postfixadmin для начала

Пытаемся 
whereis postfixadmin
postfixadmin: /usr/ports/mail/postfixadmin
cd /usr/ports/mail/postfixadmin
 make && make install && make clean
Галочка на MySQL стоит жмём ок(у меня клиент 5.5.21) 
Для PHP5 надо галочку поставить на Build Apache module остальное по умолчанию.
У апача тоже надо выбрать MySQL (хотя можно вроде и без него)
Если будет бухтеть на libtool надо будет поставить свежий порт.
Возможно, бухтеть будет еще на что-нить.
После этого ставим MYSQL  надо той же версии что и клиент.
cd /usr/ports/databases/mysql55-server
make && make install && make clean
Теперь надо запустить то что установили.
чтобы сервисы стартовали  при загрузки фряхи.
echo 'apache22_enable="YES"' >> /etc/rc.conf  && echo 'mysql_enable="YES"' >> /etc/rc.conf
ну и руками стартануть
/usr/local/etc/rc.d/mysql-server start
Starting mysql.
/usr/local/etc/rc.d/apache22 onestart
Performing sanity check on apache22 configuration:
Syntax OK
Starting apache22.
Теперь надо поставить PHPMyAdmin  он поможет управлять базой SQL(руками гемерно это делать)
cd  /usr/ports/databases/phpmyadmin
make && make install && make clean
тут вроде проблем не возникает.
Далее надо воткнуть в httpd.conf 
вот это :

 Alias /phpmyadmin/ "/usr/local/www/phpMyAdmin/"

    <Directory "/usr/local/www/phpMyAdmin/">
        Options none
        AllowOverride Limit

        Order Deny,Allow
        Deny from all
        Allow from 127.0.0.1 .example.com
    </Directory>
чтобы апач знал где наш ПМА лежит
exemple.com меняем на необходимый адресс
Теперь подрехтуем конфиг апача, чтобы он PHP понимал.
открываем httpd.conf
ee /usr/local/etc/apache22/httpd.conf
Находим 

    #AddType text/html .shtml
    #AddOutputFilter INCLUDES .shtml
</IfModule>
приводим к виду
    #AddType text/html .shtml
    #AddOutputFilter INCLUDES .shtml
    AddType application/x-httpd-php .php
    AddType application/x-httpd-sourse .phps
</IfModule>
Находим 
<IfModule dir_module>
    DirectoryIndex  index.html
</IfModule>
делаем
<IfModule dir_module>
    DirectoryIndex index.php index.html
</IfModule>
рестартим апач
apachectl restart 
Теперь идем по адресу 
Должен запуститься ПМА, но там нехера не работает, потому что нехера не настроено.
Вообще-то сейчас можно подключиться к скул серверу, но ПМА не дает доступ без пароля.
Да и вообще не дело root с пустым паролям даже на SQL-сервере.
Идем и меняем пароль.(вообще-то устанавливаем потому-что пароль, не пустой, а его вообще нет.Существенная разница, не ясная на первый взгляд.)
Заходим в MYSQL

mysql -u root -p

Enter password:(просто жмем энтер)

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.5.21 Source distribution

Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>(если все это видим мы удачно вошли)
mysql> SET PASSWORD FOR ‘root’@'localhost’ = PASSWORD(‘newpassword’);
Вместо newpassword пишем свой новый пароль.

Query OK, 0 rows affected (0.02 sec)(типо все нормально прошло пишем exit и заходим снова с новым паролем, проверяем)
теперь идем в ПМА с новым паролем должны зайти.
если внизу страницы есть такое сообщение
Дополнительные возможности phpMyAdmin не настроены в полной мере, некоторые функции были отключены. Для определения причины нажмите ТУТ 

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

Далее, придерживаясь курса заданным Великим Лениным, тьфу то есть, как нам советует lissyara:
Создадим новую базу- базы данных / в поле новая база пишем её имя (exim)/ жмём кнопочку создать.
 Кликаем на неё / В верху у нас отобразиться её имя / теперь жмём SQL.Открылось окно запросов к нашей базе данных.
Теперь надо запихать следующие запросы в БД.


USE mysql;
INSERT INTO `user` (`Host`, `User`, `Password`)
VALUES ('localhost','exim',password('youpass'));
INSERT INTO `db` (`Host`, `Db`, `User`, `Select_priv`)
VALUES ('localhost','exim','exim','Y');
FLUSH PRIVILEGES;
GRANT USAGE ON exim.* TO exim@localhost;
GRANT SELECT, INSERT, DELETE, UPDATE ON exim.* TO exim@localhost;
USE `exim`;



youpass заменить на свой пароль


CREATE TABLE `admin` (
  `username` varchar(255) NOT NULL default '',
  `password` varchar(255) NOT NULL default '',
  `created` datetime NOT NULL default '0000-00-00 00:00:00',
  `modified` datetime NOT NULL default '0000-00-00 00:00:00',
  `active` tinyint(1) NOT NULL default '1',
  PRIMARY KEY  (`username`),
  KEY `username` (`username`)
) TYPE=MyISAM COMMENT='Exim and dovecot Admin - Virtual Admins';

(тут да и в других запросах TYPE надо заменить на ENGINE иначе ошибку выдает)


CREATE TABLE `domain` (
  `domain` varchar(255) NOT NULL default '',
  `description` varchar(255) NOT NULL default '',
  `aliases` int(10) NOT NULL default '0',
  `mailboxes` int(10) NOT NULL default '0',
  `maxquota` int(10) NOT NULL default '0',
  `transport` varchar(255) default NULL,
  `backupmx` tinyint(1) NOT NULL default '0',
  `created` datetime NOT NULL default '0000-00-00 00:00:00',
  `modified` datetime NOT NULL default '0000-00-00 00:00:00',
  `active` tinyint(1) NOT NULL default '1',
  PRIMARY KEY  (`domain`),
  KEY `domain` (`domain`)
) TYPE=MyISAM COMMENT='Exim and dovecot Admin - Virtual Domains';



CREATE TABLE `domain_admins` (
  `username` varchar(255) NOT NULL default '',
  `domain` varchar(255) NOT NULL default '',
  `created` datetime NOT NULL default '0000-00-00 00:00:00',
  `active` tinyint(1) NOT NULL default '1',
  KEY `username` (`username`)
) TYPE=MyISAM COMMENT='Exim and dovecot Admin - Domain Admins';



CREATE TABLE `log` (
  `timestamp` datetime NOT NULL default '0000-00-00 00:00:00',
  `username` varchar(255) NOT NULL default '',
  `domain` varchar(255) NOT NULL default '',
  `action` varchar(255) NOT NULL default '',
  `data` varchar(255) NOT NULL default '',
  KEY `timestamp` (`timestamp`)
) TYPE=MyISAM COMMENT='Exim and dovecot Admin - Log';



CREATE TABLE `mailbox` (
  `username` varchar(255) NOT NULL default '',
  `password` varchar(255) NOT NULL default '',
  `name` varchar(255) NOT NULL default '',
  `maildir` varchar(255) NOT NULL default '',
  `quota` int(10) NOT NULL default '0',
  `domain` varchar(255) NOT NULL default '',
  `created` datetime NOT NULL default '0000-00-00 00:00:00',
  `modified` datetime NOT NULL default '0000-00-00 00:00:00',
  `active` tinyint(1) NOT NULL default '1',
  PRIMARY KEY  (`username`),
  KEY `username` (`username`)
) TYPE=MyISAM COMMENT='Exim and dovecot Admin - Virtual Mailboxes';








CREATE TABLE `vacation` (
  `email` varchar(255) NOT NULL default '',
  `subject` varchar(255) NOT NULL default '',
  `body` text NOT NULL,
  `cache` text NOT NULL,
  `domain` varchar(255) NOT NULL default '',
  `created` datetime NOT NULL default '0000-00-00 00:00:00',
  `active` tinyint(1) NOT NULL default '1',
  PRIMARY KEY  (`email`),
  KEY `email` (`email`)
) TYPE=MyISAM COMMENT='Exim and dovecot Admin - Virtual Vacation';



вроде пока все. Втыкаем dovecot

cd /usr/ports/mail/dovecot
make && make install && make clean

MySQL support не забыть воткнуть в настройках довеКота

Конфижим довекот перевод конфига в статье Лисяры.Тут только то, что менял

cd /usr/local/etc
ee  dovecot.conf 

base_dir = /var/run/dovecot/
protocols = imap pop3
listen = *
shutdown_clients = yes
syslog_facility = mail
login_dir = /var/run/dovecot/login
login_user = dovecot
login_process_size = 64
login_process_per_connection = yes
login_processes_count = 3
login_max_processes_count = 64
login_max_connections = 128
login_trusted_networks = 127.0.0.1
login_log_format_elements = user=<%u> method=%m rip=%r lip=%l %c
login_log_format = %$: %s
mail_location = maildir:/var/mail/%d/%u@%d(проверить как работает подогнано под postfixadmin)
не все но в основном достаточно.
надо теперь задать конфиг для sql подключения.
cp /usr/local/share/examples/dovecot/dovecot-sql.conf /usr/local/etc/dovecot-sql.conf
ee /usr/local/etc/dovecot-sql.conf
в нём примерно так.
driver = mysql
connect = host=localhost dbname=exim user=exim password=exim

default_pass_scheme = MD5
password_query = SELECT `username` as `user`, `password` FROM  \
`mailbox` WHERE `username` = '%n@%d' AND `active`='1'
тут вообще жопа какаято может быть причиной ошибки при авторизации
user_query = SELECT `maildir` AS `home`, 26 AS `uid`, 26 AS `gid` \
FROM `mailbox` WHERE `username` = '%n@%d' AND `active`='1'
таже жопа :)
 теперь добавляем в РЦ
echo 'dovecot_enable="YES"' >> /etc/rc.conf
ну и пробуем запустить

/usr/local/etc/rc.d/dovecot start
 нихуя халявы не будет ругается на SSL я пока неготов к таким серьёзным отношениям вырубим его нафиг /usr/local/etc/dovecot.conf ssl=no
теперь должен колбаситься.
Starting dovecot.
If you have trouble with authentication failures,
enable auth_debug setting. See http://wiki.dovecot.org/WhyDoesItNotWork
This message goes away after the first successful login.
прикольное сообщние не дай бог пригодиться.
забыл добавить в постфиксадмин в апач
ee /usr/local/etc/apache22/Includes/postfixadmin.conf
туда пихаем 
Alias /postfixadmin/ "/usr/local/www/postfixadmin/"
<Directory "/usr/local/www/postfixadmin/">
   Options Indexes
   AllowOverride AuthConfig
   Order allow,deny
   Allow from all
</Directory>
apachectl configtest
apachectl graceful
 жмем на страничке setup 
правим конфиг как он просит.заодно пропишете базу скула и пользователей.
обновляем
заполняем поля 4 штуки.второе поле е-маил адрес.
будет ругаться в конфиге измените переменную $CONF['setup_password'] на тот хеш который он напишет это ваш пароль но в MD5 помойму.
правим /etc/make.conf
.if ${.CURDIR} == ${PORTSDIR}/mail/exim
WITH_MYSQL=             yes
LOG_FILE_PATH?=         syslog
WITH_CONTENT_SCAN=      yes
WITH_DEFAULT_CHARSET?=  koi8-r
WITHOUT_IPV6=           yes
.endif
зачем надо не понял.
cd /usr/ports/mail/exim/
make && make install && make clean
echo 'exim_enable="YES" ' >> /etc/rc.conf 
echo '
sendmail_enable="NONE"
 ' >> /etc/rc.conf 
ee /etc/mail/mailer.conf
делаем так
sendmail        /usr/local/sbin/exim
send-mail       /usr/local/sbin/exim
mailq           /usr/local/sbin/exim -bp
newaliases      /usr/local/sbin/exim -bi
hoststat        /usr/local/sbin/exim
purgestat       /usr/local/sbin/exim
 теперь настраиваем exim
просто спизженный конфиг с выше упомянутой статьи.
ee /usr/local/etc/exim/configure
#!/bin/sh
# моя конфига экзма. Будь проклят тот день,
# когда мне пришла в голову мысль подписать
# русские поясния ко всем пунктам! :) Хоть и
# делал я это в первую очередь для себя -
# чтоб лучше понять его, но работа эта оказалась
# слишком масштабная и неблагодарная...


# Имя хоста. Используется в EHLO.
# Фигурирует в других пунктах, если они не заданы -
# типа qualify_domain и прочих..
# Если тут ничё не установлено (строка закомметрована)
# то используется то, что вернёт функция uname()
primary_hostname = mx.lissyara.su

# Вводим данные для подключения к MySQL серверу.
# словечко `hide`, вначале, означает, что при
# вызове проверки конфига командой
# exim -bV config_file эти данные не будут отображаться.
# Если без него - то будут показаны... Формат записи:
# хост/имя_бд/пользователь/пароль
hide mysql_servers = localhost/exim/exim/exim

# Делаем список локальных доменов. Далее этот
# список будет фигурировать в виде +local_domains
# В данном случае домены выбираются из БД MySQL. Также
# можно их просто перечислить через двоеточие. Есть интересная
# возможность, можно указать юзер@[хост] - lissyara@[222.222.4.5]
domainlist local_domains = ${lookup mysql{SELECT `domain` \
                            FROM `domain` WHERE \
                            `domain`='${domain}' AND \
                            `active`='1'}}

# делаем список доменов с которых разрешены релеи.
# Далее этот список будет в виде +relay_to_domains
# Можно использовать символы подстановки, типа:
# .... = *.my.domen.su : !spam.my.domen.su : first.su
# тогда пропускается всё, что похоже на *.my.domen.su, но
# от spam.my.domen.su релеится почта не будет.
domainlist relay_to_domains = ${lookup mysql{SELECT `domain` \
                            FROM `domain` WHERE \
                            `domain`='${domain}' AND \
                            `active`='1'}}

# Составляем список хостов с которых разрешён неавторизованый
# релей. Обычно в нём находятся локальные сети, и локалхост...
# ЛокалХост в двух видах был внесён сознательно - пару раз
# сталкивался с кривым файлом /etc/hosts - результатом было
# непонимание `localhost` но пониманием 127.0.0.1/8
hostlist   relay_from_hosts = localhost:127.0.0.0/8:192.168.0.0/16

# Вводим названия acl`ов для проверки почты. (В общем-то, это
# необязательно, если вы делаете открытый релей, или хотите
# принимать вообще всю почту с любого хоста для любых
# получателей... Тока потом не жалуйтесь что у Вас спам
# и провайдер выкатывает немеряный счёт :))
acl_smtp_rcpt = acl_check_rcpt
acl_smtp_data = acl_check_data

# Прикручиваем антивирус - при условии, что exim собран
# с его поддержкой. В качестве антивиря юзаем ClamAV,
# ибо - ПО должно быть свободным! :)
# Итак, указываем местоположение сокета clamd.
av_scanner = clamd:/var/run/clamav/clamd

# Адрес куда слать на проверку спама (SpamAssasin), но я
# это не юзаю. Не так много у меня спама...
# spamd_address = 127.0.0.1 783

# Имя домена добавляемое для локальных отправителей (реальных
# юзеров системы) т.е. почта отправляемая от root, будет от
# root@домен_указанный_здесь. Если пункт незадан, то используется
# имя хоста из `primary_hostname`. Логичней было бы написать здесь
# lissyara.su, но мне удобней иначе:
qualify_domain = mx.lissyara.su

# Имя хоста для ситуации, обратной предыдущей, - это имя домена
# добавляемое к почте для системных юзеров, ну и вообще для почты
# пришедшей на адрес типа `root`, `lissyara`, & etc... Если этот
# пункт незадан то используется значение полученное из
# предыдущего пункта - `qualify_domain`
qualify_recipient = mx.lissyara.su

# А это как раз кусок вышеописанного анахронизма - про почту в
# виде user@[222.222.222.222] - принимать её или нет. По дефолту
# (когда строка закомментирована) значение - false. Если захотите
# поставить true то надо будет добавить в список доменов
# комбинацию @[] - она означает `все локальные адреса`
allow_domain_literals = false

# Пользователь от которого работает exim
exim_user = mailnull

# группа в кторой работает exim
exim_group = mail

# запрещаем работу доставки под юзером root - в целях безопасности
never_users = root

# Проверяем соответствие прямой и обратной зон для всех хостов.
# Тока зачем это нужно - даже и незнаю... Спам на этом не режется...
# Зато возможны проблемы - если сервер зоны скажет `сервер файлед`
# то почту от этого хоста Вы не получите :)
#host_lookup = *

# Тоже анахронизм (на самом деле, не такой уж анахронизм, но все давно
# забили на ident и закрыли файрволлом tcp:113...) Это проверка - Ваш
# хост спрашивает у удалённого, с которого было подключение, а кто
# собстно ко мне подключился на такой-то порт? Если на удалённом хосте
# работает identd - он может ответить (а может и не ответить - как
# настроить), скажет UID пользователя от которого установлено
# соединение, тип ОС, и имя пользователя. Теперь, понимаете, почему
# у всех оно зарублено и файрволлами позакрыто? :) Это же палево :)
# Тока на мой взгляд, если на сервере всё настроено правильно -
# то вовсе это и не страшно.
# Короче - если хостс поставить * то будет проверять все. Таймаут -
# если поставить 0 то не будет ждать ответа ни от кого. По
# вышеописанным причинам - отключаем
#rfc1413_hosts = *
rfc1413_query_timeout = 0s

# По дефолту, экзим отфутболивает все `неквалифицированные` адреса,
# состоящие тока из локальной части. Для того чтобы разрешить такие письма
# определённых хостов используются эти директивы:
# для `неквалифицированных` отправителей
sender_unqualified_hosts = +relay_from_hosts
# для `неквалифицированных` получателей
recipient_unqualified_hosts = +relay_from_hosts

# Интересный пункт, тока я не вполне понимаю его логику.
# Позволяет выполнять что-то типа - пришло сообщение на
# локальный ящик user%test.su@lissyara.su и
# переправляет его на user@test.su. Делается это для
# перечисленного списка доменов (* - все):
# percent_hack_domains = *

# Если сообщение было недоставлено, то генерится соощение
# об ошибке. Если сообщение об ошибке не удалось доставить
# то оно замораживается на указанный в этом пункте срок,
# после чего снова попытка доставить его. При очередной
# неудаче - сообщение удаляется.
ignore_bounce_errors_after = 45m

# Замороженные сообщения, находящиеся в очереди, дольше
# указанного времени удаляются и генерится сообщение
# об ошибке (при условии, что это не было недоставленное
# сообщение об ошибке :))
timeout_frozen_after = 15d

# собсно на этом штатный конфиг кончился, но
# меня-то это не устраивает... Поэтому пошли пункты,
# почёрпнутые из других источников.

# список адресов, через запятую, на которые засылаются
# сообщения о замороженных сообщениях (о замороженых
# уведомлениях о заморозке, сообщения не генерятся. - я
# надеюсь эта строка понятна :))
#freeze_tell = admin@lissyara.su

# Список хостов, почта от которых принимается, несмотря
# на ошибки в HELO/EHLO (тут указана моя подсеть)
helo_accept_junk_hosts = 192.168.0.0/16

# Через какое время повторять попытку доставки
# замороженного сообщения
auto_thaw = 1h

# Приветствие сервера
smtp_banner = "$primary_hostname, ESMTP EXIM $version_number"

# Максимальное число одновременных подключений по
# SMTP. Рассчитывать надо исходя из нагрузки на сервер
smtp_accept_max = 50

# максимальное число сообщений принимаемое за одно соединение
# от удалённого сервера (или пользователя). C числом 25
# я имел проблемы тока один раз - когда у меня три дня лежал
# инет и после его подъёма попёрли мессаги. Но у меня не так
# много почты - всего 30 пользователей.
smtp_accept_max_per_connection = 25

# чё-то про логи и борьбу с флудом - я так понимаю -
# максимальное число сообщений записываемых в логи
smtp_connect_backlog = 30

# максимальное число коннектов с одного хоста
smtp_accept_max_per_host = 20

# Ход ладьёй - для увеличения производительности,
# директория `spool` внутри, разбивается на
# директории - это ускоряет обработку
split_spool_directory = true

# Если у сообщения много адресатов на удалённых хостах,
# то запускатеся до указанного числа максимально число
# параллельных процессов доставки
remote_max_parallel = 15

# при генерации сообщения об ошибке прикладывать
# не всё сообщение, а кусок (от начала) указанного
# размера (иногда полезно и целиком - в таком случае
# просто закомментируйте эту строку)
return_size_limit = 70k

# размер сообщения. У меня стоит относительно большой
# размер (`относительно` - потому, что на большинстве
# хостов оно ограничено 2-5-10мб, либо стоит анлим.)
message_size_limit = 64M

# разрешаем неположенные символы в HELO (столкнулся
# с этим случайно - имя фирмы состояло из двух слов
# и какой-то раздолбай домен обозвал my_firme_name
# прям с подчёркиваниями... Виндовые клиенты при
# соединении радостно рапортовали о себе
# `vasya.my_firme_name` ну а экзим их футболил :))
helo_allow_chars = _

# Принудительная синхронизация. Если отправитель
# торопится подавать команды, не дождавшись ответа,
# то он посылается далеко и надолго :) Немного,
# спам режется.
smtp_enforce_sync = true

# Выбираем, что мы будем логировать
# + - писать в логи,
# - - Не писать в логи.
# +all_parents - все входящие?
# +connection_reject - разорваные соединения
# +incoming_interface - интерфейс (реально - IP)
# +lost_incoming_connections - потеряные входящие
# соединения
# +received_sender - отправитель
# +received_recipients - получатель
# +smtp_confirmation - подтверждения SMTP?
# +smtp_syntax_error - ошибки синтаксиса SMTP
# +smtp_protocol_error - ошибки протокола SMTP
# -queue_run - работа очереди (замороженные мессаги)
log_selector = \
    +all_parents \
    +connection_reject \
    +incoming_interface \
    +lost_incoming_connection \
    +received_sender \
    +received_recipients \
    +smtp_confirmation \
    +smtp_syntax_error \
    +smtp_protocol_error \
    -queue_run

# Убираем собственную временную метку exim`a из логов, её ставит
# сам syslogd - нефига дублировать
syslog_timestamp = no



### конфигурация ACL для входящей почты
begin acl

# Эти правила срабатывают для каждого получателя
acl_check_rcpt:


  # принимать сообщения которые пришли с локалхоста,
  # не по TCP/IP
  accept  hosts = :

  # Запрещаем письма содержащие в локальной части
  # символы @; %; !; /; |. Учтите, если у вас было
  # `percent_hack_domains` то % надо убрать.
  # Проверяются локальные домены
  deny    message       = "incorrect symbol in address"
          domains       = +local_domains
          local_parts   = ^[.] : ^.*[@%!/|]

  # Проверяем недопустимые символы для
  # нелокальных получателей:
  deny    message       = "incorrect symbol in address"
          domains       = !+local_domains
          local_parts   = ^[./|] : ^.*[@%!] : ^.*/\\.\\./

  # Принимаем почту для постмастеров локальных доменов без
  # проверки отправителя (я закомментировал, т.к. это -
  # основной источник спама с мой ящик).

  accept  local_parts   = postmaster
          domains       = +local_domains

  # Запрещщаем, если невозможно проверить отправителя
  # (отсутствует в списке локальных пользователей)
  # У себя я это закоментил, по причине, что некоторые
  # железяки (принтеры, & etc) и программы (Касперский, DrWEB)
  # умеют слать почту, в случае проблем но не умеют ставить
  # нужного отправителя. Такие письма эта проверка не пускает.
#  require verify        = sender

  # Запрещщаем тех, кто не обменивается приветственными
  # сообщениями (HELO/EHLO)
  deny    message       = "HELO/EHLO require by SMTP RFC"
          condition     = ${if eq{$sender_helo_name}{}{yes}{no}}

  # Принимаем сообщения от тех, кто аутентифицировался:
  # Вообще, большинство конфигов в рунете - это один и тот же
  # конфиг написанный Ginger, в котором этот пункт расположен
  # внизу. Но при таком расположении рубятся клиенты с adsl,
  # ppp, и прочие зарезанные на последующих проверках. Но это
  # жа неправильно! Этом мои пользователи из дома! Потому
  # я это правило расположил до проверок.
  accept  authenticated = *

# Рубаем нах, тех, кто подставляет свой IP в HELO
  deny    message       = "Your IP in HELO - access denied!"
          hosts         =  * : !+relay_from_hosts : !81-196.lissyara.su
          condition     = ${if eq{$sender_helo_name}\
    {$sender_host_address}{true}{false}}


# Рубаем тех, кто в HELO пихает мой IP (2500 мудаков за месяц!)
  deny    condition     = ${if eq{$sender_helo_name}\
    {$interface_address}{yes}{no}}
          hosts         = !127.0.0.1 : !localhost : *
          message       = "main IP in your HELO! Access denied!"

# Рубаем тех, кто в HELO пихает только цифры
# (не бывает хостов ТОЛЬКО из цифр)
  deny    condition     = ${if match{$sender_helo_name}\
    {\N^\d+$\N}{yes}{no}}
          hosts         = !127.0.0.1 : !localhost : *
          message       = "can not be only number in HELO!"

  # Рубаем хосты типа *adsl*; *dialup*; *pool*;....
  # Нормальные люди с таких не пишут. Если будут
  # проблемы - уберёте проблемный пункт (у меня клиенты
  # имеют запись типа asdl-1233.zone.su - я ADSL убрал...)
  deny    message       = "your hostname is bad (adsl, poll, ppp & etc)."
          condition     = ${if match{$sender_host_name} \
                               {adsl|dialup|pool|peer|dhcp} \
                               {yes}{no}}

  # Задержка. (это такой метод борьбы со спамом,
  # основанный на принципе его рассылки) На этом рубается
  # почти весь спам. Единственно - метод неприменим на 
  # реально загруженных MTA - т.к. в результате ему
  # приходится держать много открытых соединений.
  # но на офисе в сотню-две человек - шикарный метод.
  #
  # более сложный вариант, смотрите в статье по exim и 
  # курьер имап. Т.к. там метод боле умный (просто правил
  # больше :), то можно и на более загруженные сервера ставить)
  warn
        # ставим дефолтовую задержку в 20 секунд
        set acl_m0 = 30s
  warn
        # ставим задержку в 0 секунд своим хостам и 
        # дружественным сетям (соседняя контора :))
        hosts = +relay_from_hosts:213.234.195.224/28:80.253.9.18/32
        set acl_m0 = 0s
  warn
        # пишем в логи задержку (если оно вам надо)
        logwrite = Delay $acl_m0 for $sender_host_name \
[$sender_host_address] with HELO=$sender_helo_name. Mail \
from $sender_address to $local_part@$domain.
        delay = $acl_m0

                          
  # Проверка получателя в локальных доменах.
  # Если не проходит, то проверяется следующий ACL,
  # и если непрошёл и там - deny
  accept  domains       = +local_domains
          endpass
          message       = "In my mailserver not stored this user"
          verify        = recipient

  # Проверяем получателя в релейных доменах
  # Опять-таки если не проходит -> следующий ACL,
  # и если непрошёл и там - deny
  accept  domains       = +relay_to_domains
          endpass
          message       = "main server not know how relay to this address"
          verify        = recipient

  # Рубаем тех, кто в блэк-листах. Серваки перебираются
  # сверху вниз, если не хост не найден на первом, то
  # запрашивается второй, и т.д. Если не найден ни в одном
  # из списка - то почта пропускается.
  deny    message       = you in blacklist: $dnslist_domain \n $dnslist_text
          dnslists      = opm.blitzed.org : \
                          cbl.abuseat.org : \
                          bl.csma.biz : \
                          dynablock.njabl.org

  # Разрешаем почту от доменов в списке relay_from_hosts
  accept  hosts         = +relay_from_hosts

  # Если неподошло ни одно правило - чувак явно ищет
  # открытый релей. Пшёл прочь. :)
  deny    message       = "Homo hominus lupus est"




# Тут идут ACL проверяющие содержимое (тело) письма.
# Без них будут пропускаться все сообщения.

acl_check_data:

  # Проверяем письмо на вирусы
  deny malware = *
  message = "In e-mail found VIRUS - $malware_name"

  # Если есть необходимость - тут проверки на спам

  # Пропускаем остальное
  accept



# чё делаем с почтой
begin routers

# Поиск маршрута к хосту в DNS. Если маршрут не найден в DNS -
# то это `унроутабле аддресс`. Не проверяются локальные
# домены, 0.0.0.0 и 127.0.0.0/8
dnslookup:
  driver = dnslookup
  domains = ! +local_domains
  transport = remote_smtp
  ignore_target_hosts = 0.0.0.0 : 127.0.0.0/8
  no_more

# смотрим альясы
system_aliases:
    driver      = redirect
    allow_fail
    allow_defer
    data = ${lookup mysql{SELECT `goto` FROM `alias` WHERE \
            `address`='${quote_mysql:$local_part@$domain}' OR \
                `address`='${quote_mysql:@$domain}'}}

# Всё что осталось - это локальные адресаты.
# Доставляем почту в dovecot
dovecot_user:
  driver = accept
  condition = ${lookup mysql{SELECT `goto` FROM \
  `alias` WHERE \
  `address`='${quote_mysql:$local_part@$domain}' OR \
  `address`='${quote_mysql:@$domain}'}{yes}{no}}
  transport = dovecot_delivery


# начинаются транспорты - как доставляем почту
begin transports

# Доставка на удалённые хосты - по SMTP
remote_smtp:
  driver = smtp

# Доставка локальным адресатам - в dovecot
# Надо заметить что тут использовалась ранее прямая доставка
# в директорию, но щас с портами стал-таки устанавливаться deliver
# программа dovecot занимающаяся доставкой мессаг.
# Соответственно юзаем его.
dovecot_delivery:
  driver = pipe
  command = /usr/local/libexec/dovecot/deliver -d $local_part@$domain
  message_prefix =
  message_suffix =
  delivery_date_add
  envelope_to_add
  return_path_add
  log_output
  user = mailnull


# Имя программы
address_pipe:
  driver = pipe
  return_output

# Транспорт для автоответов
address_reply:
  driver = autoreply



# Начинаются повторы недоставленных писем.
begin retry

# Этот кусок я не трогал. Думаю разработчики лучше знают,
# какие тут должны быть цифирьки. Если же вы это знаете
# лучше их - меняйте. Хотя... А какого, если Вы такой
# умный, читаете этот мануал? Может ну, их, цифирьки, а? :)
# Address or Domain  Error   Retries
# -----------------  -----   -------
*                    *       F,2h,15m; G,16h,1h,1.5; F,4d,6h


# преобразование адресов. У меня такого нету.
begin rewrite


# Секция авторизации при отправке писем. Ввиду того,
# что почтовых клиентов много, и все всё делают
# по-своему, то и механизмов авторизации три...
begin authenticators

# А вот по какому методу авторизуется оутглюк - я уже и
# не помню... Хотя в своё время долго ковырялся,
# пока настроил... Толь plain, толь login...
auth_plain:
  driver = plaintext
  public_name = PLAIN
  server_condition = ${lookup mysql{SELECT `username` FROM \
                     `mailbox` WHERE `username` = \
                     '${quote_mysql:$auth2}' AND `password` = \
                     '${quote_mysql:$auth3}'}{yes}{no}}
  server_prompts = :
  server_set_id = $auth2

# Вроде по этому оутглюк, а по предыдущему нетскейп.
auth_login:
  driver = plaintext
  public_name = LOGIN
  server_condition = ${lookup mysql{SELECT `username` FROM \
                     `mailbox` WHERE `username` = \
                     '${quote_mysql:$auth1}' AND `password` = \
                     '${quote_mysql:$auth2}'}{yes}{no}}
  server_prompts = Username:: : Password::
  server_set_id = $auth1

# А так авторизуется "Летучая Мышь" - TheBat!
auth_cram_md5:
  driver = cram_md5
  public_name = CRAM-MD5
  server_secret = ${lookup mysql{SELECT `password` FROM \
                        `mailbox` WHERE `username` \
                        = '${quote_mysql:$auth1}'}{$value}fail}
  server_set_id = $auth2

# Фсё. Конфиг кончился. Два дня убил.
# &copy; lissyara       2006-02-25, 01:19


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

cd /usr/ports/security/clamav

make install && make clean
freshclam
Да еще неплохо обновление антивира поставить по 
ну смотрим, курим конфиги вылавливаем ощибки
первая ошибка это ругань на несоответствие названия машины днс имени.
Вас ждут увлекательные проблемы с пользователями и надо будет менять всякие uid и  gid
как узнать uid gid команда id [имя_пользователя]
еще есть проблемма с запросом для получения домашней директории пользователя
относительные пути не поддерживаются поэтому надо сделать что-то вроде этого

SELECT CONCAT('/var/mail/exim/',maildir) AS home , 26 AS uid , 6 AS gid FROM mailbox WHERE username = '%u@%n' AND active = '1'

Может возникнуть следующая проблема.
Dovecot может отвалиться при вызове доставщика (delivery)
Проблема все в тех-же uid и gid и правами доступа на папки.В логах пишется в какой папке косяк.



четверг, 1 марта 2012 г.

FreeBSD 8.2 первоначальная настройка

Так как кроме меня никто не читает решил сделать себе записную книжку.
Надоело судорожно вспоминать простые команды.
Ну так начнем.
Установку пропустим.
Далее идет настройка то есть SYSINSTAL.(можно вызвать в любой момент)
Тоже ничего сложного, тебе все говорят.
Молимся чтобы FreeBSD распознал встроенную сетевую карту.
Если нет, то у нас два пути.
1) Ищем сайт производителя, ищем чип сетевой карты, лезем на сайт производителя чипсета, и молимся чтобы был драйвер под фряху.(На сайте производителя материнской платы только под вынь или линь в лучшем случае)
2) Покупка сетевой карты в магазине :(
(есть третий вариант но я не обладаю написанием дров под фри :( )
есть еще вариант обновиться до stable(возможно если мамка новая там дрова есть), но без сетевой это трудно.
Первый вариант более подробно.
Скачиваем драйвера, кидаем на флешку.
Монтирование флешки во FreeBSD.
Как только втыкаеш её выдается сообшение прям в консоль.(если нет то dmesg)
Там сказанно какое устройство вы подключили.Обычно оно начинается с ad ну и цифра.
далее все просто команда mount но надо указать какую файловую систему вы монтируету
проще сделать mount_msdosfs ну или mount_ntfs
в итоге должно получиться mount_msdosfs /dev/da0s1 /mnt/flash
s1 после имени устройства обозначает, что монтируем первый раздел.
придется создать папку flash(если её нет) в папке mnt.
заходим в /mnt/flash и видим свои файлы.
Читаем readme, там должно быть все пошагово расписано.(действуйте строго по инструкции)
После того как карточка запустилась.Настраиваем интернет.
можно через sysinstall
можно в файле rc.conf прописать что-нить такое.
ifconfig_re0="inet 179.78.148.15 netmask 255.255.255.252"
defaultrouter="179.78.148.14"
и еще надо в файле /etc/resolv.conf прописать адреса днс серверов
nameserver XX.XX.XX.XX
Теперь надо обновить порты.Хочется чтобы все работало нормально.
Ставим CVSUP из портов и смотрим примеры sup файлов.Если нет иксов надо ставить cvsup-without-gui
Теперь настраиваем SSH демона
конфиг /etc/ssh/sshd_config
указываем порт Port 22
адрес с какого слушать AddressFamaly any(или конкретно адресс) ListenAddress 0.0.0.0
еще можно протокол поменять Protocol 2
Если хотите заходить под рутом то PermitRootLogin yes(страшные бородатые дядьки ругают за такое и правильно)
После пишем в /etc/rc.conf
sshd_enable="YES"
Теперь можно из под винды подключаться к нашему серверу с помощью программы PuTTY  и админить фрю.