Postfix (антиспам+антивирус), как почтовый шлюз с Exchange

Автор Graf, 09 апреля 2012, 13:24:35

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Graf

Wiki формат

==============
Обсуждаем ТУТ
==============

=== Postfix ===

Шлюз (mail.mydom.ru)
внешний IP-адрес (Internet) - 44.55.66.77
внутренний IP-адрес            -192.168.10.245
Exchenge                               -192.168.10.246

Рабочие файлы. Только нужно будет поменять на свои данные (IP, пути, названия и т.д.)
положить в /etc/postfix
aliases
checks.reg
helo_checks
main.cf
master.cf
transport
mydom_blacklist
mydom_real_rec
mydom_valid_rec

положить в /etc/iptables (каталог создать)
rc.iptables
rc.iptables_flush

положить в /etc/rc.d
rc.clamav
rc.local
rc.postfix
rc.firewall

положить в /etc или настроить те, что поставятся
clamd.conf
clamsmtpd.conf
freshclam.conf

положить в /etc/mail/spamassassin
local.cf

на Exchange
2postfix.bat

Добавляем необходимые группы и пользователя.

  # groupadd -g 200 postfix
  # useradd -u 200 -d /dev/null -s /bin/false -g postfix postfix
  # groupadd -g 201 postdrop


можно скачать последнюю версию с http://postfix.cs.utah.edu/source/official распаковать и собрать, я же буду собирать при помощи sbopkg .
подправим SlackBuild (на сей момент 2.9.1 последняя версия)
VERSION=${VERSION:-2.9.1}

и info

PRGNAM="postfix"                                                                                                                                           
VERSION="2.9.1"                                                                                                                                             
HOMEPAGE="http://www.postfix.org/"                                                                                                                         
DOWNLOAD="http://postfix.cs.utah.edu/source/official/postfix-2.9.1.tar.gz"                                                                                 
MD5SUM="5c81b304a42c691671454dfe80b506ca"   


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

И пошли настраивать..
Разрешаем ретрансляцию на почтовом шлюзе для нашего внутреннего почтового сервера. Добавляем IP адрес внутреннего почтового сервера в список серверов параметра mynetworks в файл main.cf на почтовом шлюзе:
mynetworks = 127.0.0.0/8 192.168.10.246/24
Доступ на ретрансляцию ограничен адресом localhost почтового шлюза (127.0.0.1) и внутреннего почтового сервера (в нашем примере это 192.168.10.246), так что другие хосты внутри нашей сети не могут использовать шлюз для пересылки почты.

Указываем Postfix на необходимость приема сообщений из внешней сети для хоста внутренней сети. С помощью параметра relay_domains Postfix определяет список доменов, для которых он осуществляет пересылку, даже в том случае, если не является местом конечного назначения для этих доменов.
relay_domains = mydom.ru

Теперь сказжем ему, куда ретранслировать входящие сообщения, направляющиеся в наш домен. Для этого создаем карту транспорта в файле /etc/postfix/transport.
mydom.ru smtp:[192.168.10.246]
В этой строке smtp означает, что Postfix должен использовать тип транспорта smtp, определенный в файле master.cf. Квадратные скобки имеют важное значение, т. к. они отменяют поиск MX записи.
Теперь нам нужно создать индексированный файл следующей командой:
# postmap hash:/etc/postfix/transport

И задаем параметр transport_maps  в файле main.cf :
transport_maps = hash:/etc/postfix/transport

Чтобы письма идущие на не существующий адрес, шли «лесом», составим список действительных получателей для внутреннего сервера. Для этого создадим текстовый файл /etc/postfix/mydom_real_rec и запишем туда РЕАЛЬНО существующие на Exchange, адреса.

postmaster@mydom.ru     OK
it@mydom.ru     OK
v_pupkin@mydom.ru       OK
....
....


а в main.cf добавляем строчку
relay_recipient_maps =  hash:/etc/postfix/mydom_real_rec

и создаем  индексированный файл
# postmap hash:/etc/postfix/mydom_real_rec
в итоге получим файл - /etc/postfix/mydom_real_rec.db

А если получателей очень много?
Тогда идем на Exchange и запускаем батник  2postfix.bat,  вот с таким содержимым (все в одну строчку)

csvde -m -n -g -f "C:\mydom_recipients.txt" -r "(|(&(objectClass=user)(objectCategory=person)) (objectClass=groupOfNames) (objectClass=msExchDynamicDistributionList))" -l proxyAddresses


На выходе получаем файл C:\mydom_recipients.txt с примерно, вот атким содержимым:

DN,proxyAddresses
.....
.....
"CN=IT,OU=IT,DC=MYDOM",smtp:it@mydom.ru;X400:c=US\;a=\;p=MYDOM\;o=Exchange\;s=it\;;SMTP:it@mydom.ru
"CN=v_pipkin,OU=User,DC=MYDOM",X400:c=US\;a= \;p=MYDOM\;o=Exchange\;s=v_pupkin\;;SMTP:v_pupkin@mydom.ru
.....
.....


Перенесем его на сервер с postfix в /etc/postfix/mydom_recipients.txt .
Создам файл /etc/postfix/mydom_blacklist и внесем туда те адреса, что есть в exchange, но не должны получать почту, т.е. для фильтрации, например:

mydom-exchange
SystemMailbox


теперь запустим скрипт  mydom_valid_rec

#!/bin/sh
cat ./mydom_recipients.txt  | tr -d \" | tr , \\n | tr \; \\n | awk -F\: '/(SMTP|smtp):/ \
{printf("%s\tOK\n",$2)}' | \
grep -v -f ./mydom_blacklist > ./mydom_real_rec


получаем файл  mydom_real_rec со списком почтовых ящиков понятным postfix'у, и пересоздадим  индексированный файл
# postmap hash:/etc/postfix/mydom_real_rec

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

Запретим демону master запускать локальный агент доставки - это будет означать отключение локального агента доставки, т. к. на данной машине получателей нет. Отредактируем файл master.cf и закомментируйем строку, содержащую локальную службу:

#
# ==========================================================================
# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (yes)   (never) (100)
# ==========================================================================
smtp      inet  n       -       n       -       -       smtpd
.....
.....
discard   unix  -       -       n       -       -       discard
#local     unix  -       n       n       -       -       local
virtual   unix  -       n       n       -       -       virtual
lmtp      unix  -       -       n       -       -       lmtp
anvil     unix  -       -       n       -       1       anvil
......
......


Теперь настроим exchange для работы с postfix.

Запустим Exchange System Manager:
Administrative Groups → Ваша группа (у меня это First Administrative Groups) →  Server → Ваш почтовый сервер →  Protocols → SMTP →  Клик правой кнопкой мыши на Default Virtual SMTP Server → Properties → вкладка Delivery → Advanced

Заполним поля, как показано на рисунке.
Помним, что сервер Exchange не принимает IP адрес в качестве значения для поля Smart host.

Далее, ограничим количество одновременных исходящих соединений.Жмем на кнопку «Outbound connections...» и
заполняем поля как показано на рисунке (если у вас не так много сообщений и почтовых ящиков, значения можно увеличить).


Создадим отдельный коннектор.
Administrative Groups → Ваша группа (у меня это First Administrative Groups) → Routing Groups →  First Routing Group → правой кнопкой мыши на Connectors → New → SMTP Connector...


Дадим название «1», Ставим «точку» напротив «Forward all mail....» и вбиваем IP-адрес нашего Postfix сервера в квадратных скобках!
Нажимаем на кнопку «Add...» и добавляем наш exchange сервер (Default Virtual SMTP Server)


Теперь лучше сервисы exchange перезапустить.
Стартануть Postfix
# /etc/rc.d/rc.postfix start

поправить iptables на предмет открытия 25 порта (/etc/iptables/rc.iptables) и запустить .
# /etc/rc.d/rc.firewall start

Теперь Postfix будет принимать и отдавать Exchange все, что только в него свалиться для домена mydom.ru, отфильтровывая только не существующие ящики.
Но этого "маловато будет" (с) мультик - "Падал прошлогодний снег"

Прикрутим антивирус (ClamAV) и спам фильтр (Spamassasin).

==============
Обсуждаем ТУТ
==============

Graf

#1

==============
Обсуждаем ТУТ
==============

=== ClamAV ===

Скачиваем с http://www.clamav.net/lang/ru/download/sources/, распаковываем, начинаем собирать и устанавливать.
Перед инсталляцией необходимо создать группу и юзверя clamav:

# groupadd -g 210 clamav
# useradd -u 210 -d /dev/null -s /bin/false -g clamav clamav
# configure --prefix=/usr --sysconfdir=/etc --enable-milter --with-iconv
# make
# make install DESTDIR=/tmp/clamav-0.97.4
# cd /tmp/clamav-0.97.4
# makepkg -l y -c n /tmp/clamav-0.97.4.tgz
# installpkg /tmp/clamav-0.97.4.tgz


Редактируем /etc/clamd.conf

LogFile /var/log/clamd.log
LogFileMaxSize 2M
LogTime yes
PidFile /var/run/clamav/clamd.pid
TemporaryDirectory /var/tmp
DatabaseDirectory /var/lib/clamav
LocalSocket /var/run/clamav/clamd.socket
FixStaleSocket yes
MaxConnectionQueueLength 30
StreamMaxLength 10M
SelfCheck 1800
User clamav
MaxScanSize 50M
MaxFileSize 15M
MaxRecursion 10
MaxFiles 1500

все остальное оставляем по умолчанию.

Создаем каталог /var/lib/clamav , файл /var/log/clamd.log , даем права и запускаем:

# chown clamav:clamav /var/log/clamd.log
# chown clamav:clamav /var/lib/clamav
# clamd


Настраиваем  freshclam.
Редактируем  /etc/freshclam.conf

DatabaseDirectory /var/lib/clamav
UpdateLogFile /var/log/freshclam.log
PidFile /var/run/clamav/freshclam.pid
DatabaseOwner clamav
AllowSupplementaryGroups yes
DatabaseMirror db.ru.clamav.net
DatabaseMirror database.clamav.net
Checks 48
NotifyClamd /etc/clamd.conf


Открываем для freshclam порты 53 и 80 в iptables.
$IPTABLES -A OUTPUT -p UDP -s $INET_IP -m multiport --port 53,80 -j ACCEPT

и рестартуем
/etc/rc.firewall restart

Создаем  файл /var/log/freshclam.log , даем права и запускаем:

# chown clamav:clamav /var/log/freshclam.log
# freshclam
  ClamAV update process started at Tue Apr 11 09:02:55 2012                                                               
  Downloading main.cvd [100%]                                                                                             
  main.cvd updated (version: 53, sigs: 846214, f-level: 53, builder: sven)                                               
  Downloading daily.cvd [100%]                                                                                           
  daily.cvd updated (version: 12972, sigs: 96960, f-level: 60, builder: ccordes)                                         
  Downloading bytecode.cvd [100%]                                                                                         
  bytecode.cvd updated (version: 142, sigs: 40, f-level: 60, builder: acab)                                               
...


=== ClamSMTP===

Скачиваем с http://memberwebs.com/nielsen/software/clamsmtp, распаковываем, начинаем собирать и устанавливать.

# configure --prefix=/usr --sysconfdir=/etc
# make
# make install DESTDIR=/tmp/clamsmtp-1.10
# cd /tmp/clamsmtp-1.10
# makepkg -l y -c n /tmp/clamsmtp-1.10.tgz
# installpkg /tmp/clamsmtp-1.10.tgz


Редактируем  /etc/clamsmtpd.conf  если нет, создаем

OutAddress: 10026
XClient: off
Listen: 127.0.0.1:10025
ClamAddress: /var/run/clamav/clamd.socked
Header: X-Virus-Scanned: -= ClamAV =-
TempDirectory: /tmp
Action: drop
Quarantine: off
User: clamav               


Создадим  загрузочный  скрипт /etc/rc.d/rc.clamav:

#! /bin/bash

start()
{
    if [ -f /var/run/clamav/clamd.pid ]; then
        if ps xa | grep ^$(head -1 /var/run/clamav/calmd.pid) > /dev/null; then
            echo "ClamAv working!"
        else
            rm -r /var/run/clamav/clamd.pid
        fi
    fi
    echo "Start a ClamAv antivirus"
    clamd

    if [ -f /var/run/clamav/freshclam.pid ]; then
        if ps xa | grep ^$(head -1 /var/run/clamav/freshcalm.pid) > /dev/null; then
            echo "FreshClam working!"
        else
            rm -r /var/run/clamav/freshclam.pid
        fi
    fi
    echo "Start a freshclam"
    freshclam -d
    echo "Start a ClamSMTP"
    clamsmtpd
}

stop()
{
    killall clamd
    killall freshclam
    killall clamsmtpd
}

case $1 in
start)
  start ;;
stop)
  stop ;;
restart)
  stop
  start ;;
*)
echo "Usage rc.clamav start|stop|restart"
exit 88
esac


И запускаем:

#/etc/rc.d/rc.clamav stop
#/etc/rc.d/rc.clamav start


=== Spamassasin ===

Скачиваем с http://spamassassin.apache.org/  последнюю версию spamassasin'a, распаковываем, начинаем собирать и устанавливать.
# perl Makefile.PL

если ругается на модули (типа Encode::Detect), то устанавливаем все, на что жалуется:

# perl -MCPAN -e shell
    cpan shell -- CPAN exploration and modules installation (v1.9402)
    Enter 'h' for help.
    cpan[1]>  install Encode::Detect
    ..........
    cpan[1]>  exit


когда установку модулей закончили повторяем и продолжаем:

# perl Makefile.PL
# make
# make install


После установке правим файл /etc/mail/spamassassin/local.cf

rewrite_header Subject *****SPAM*****
report_safe 2
trusted_networks 192.168.10.
trusted_networks 127.
lock_method flock
required_score 6.0
use_bayes 1
bayes_auto_learn 1
bayes_ignore_header X-Bogosity
bayes_ignore_header X-Spam-Flag
bayes_ignore_header X-Spam-Status

ifplugin Mail::SpamAssassin::Plugin::Shortcircuit
shortcircuit USER_IN_WHITELIST       on
shortcircuit USER_IN_BLACKLIST       on
endif # Mail::SpamAssassin::Plugin::Shortcircuit

ok_languages ru en
ok_locales ru en
report_charset windows-1251
bayes_path                              /etc/mail/spamassassin/bayes/bayes
bayes_file_mode 0777

required_score 6.0 - чем меньше, тем сильней защита, но больше вероятность ложных срабатываний (по умолчанию - 5.0).

Создаем  каталог /etc/mail/spamassassin/bayes и назначаем  владельцем  юзверя mailagent с правами 0755.

А теперь все свяжем!
Приводим файл /etc/postfix/master.cf к нижеследующему виду:

#                                                                                                                                                                                                                                           
# ==========================================================================                                                                                                                                                                 
# service type  private unpriv  chroot  wakeup  maxproc command + args                                                                                                                                                                       
#               (yes)   (yes)   (yes)   (never) (100)                                                                                                                                                                                       
# ==========================================================================                                                                                                                                                                 
smtp      inet  n       -       n       -       -       smtpd                                                                                                                                                                               
#submission inet n       -       n       -       -       smtpd                                                                                                                                                                               
#  -o smtpd_tls_security_level=encrypt                                                                                                                                                                                                       
#  -o smtpd_sasl_auth_enable=yes                                                                                                                                                                                                             
#  -o smtpd_client_restrictions=permit_sasl_authenticated,reject                                                                                                                                                                             
#  -o milter_macro_daemon_name=ORIGINATING                                                                                                                                                                                                   
#smtps     inet  n       -       n       -       -       smtpd                                                                                                                                                                               
#  -o smtpd_tls_wrappermode=yes                                                                                                                                                                                                             
#  -o smtpd_sasl_auth_enable=yes                                                                                                                                                                                                             
#  -o smtpd_client_restrictions=permit_sasl_authenticated,reject                                                                                                                                                                             
#  -o milter_macro_daemon_name=ORIGINATING                                                                                                                                                                                                   
#628       inet  n       -       n       -       -       qmqpd                                                                                                                                                                               
                                                                                                                                                                                                                                             
scan      unix  -       -       n       -       16      smtp                                                                                                                                                                                 
     -o smtp_send_xforward_command=yes                                                                                                                                                                                                       
     -o smtp_tls_security_level=none                                                                                                                                                                                                         
                                                                                                                                                                                                                                             
127.0.0.1:10026 inet  n -       n       -       16      smtpd                                                                                                                                                                               
     -o content_filter=                                                                                                                                                                                                                     
     -o receive_override_options=no_unknown_recipient_checks,no_header_body_checks                                                                                                                                                           
     -o smtpd_helo_restrictions=                                                                                                                                                                                                             
     -o smtpd_client_restrictions=                                                                                                                                                                                                           
     -o smtpd_sender_restrictions=                                                                                                                                                                                                           
     -o smtpd_recipient_restrictions=permit_mynetworks,reject                                                                                                                                                                               
     -o mynetworks_style=host                                                                                                                                                                                                               
     -o smtpd_authorized_xforward_hosts=127.0.0.0/8                                                                                                                                                                                         
                                                                                                                                                                                                                                             
smtp      inet  n       -       n       -       -       smtpd                                                                                                                                                                               
     -o content_filter=spam:dummy                                                                                                                                                                                                           
                                                                                                                                                                                                                                             
spam      unix  -       n       n       -       -       pipe                                                                                                                                                                                 
     flags=R user=mailagent argv=/usr/bin/spamc -u mailagent -e /usr/sbin/sendmail -f $sender $recipient                                                                                                                                     
                                                                                                                                                                                                                                             
pickup    fifo  n       -       n       60      1       pickup                                                                                                                                                                               
cleanup   unix  n       -       n       -       0       cleanup                                                                                                                                                                             
qmgr      fifo  n       -       n       300     1       qmgr                                                                                                                                                                                 
#qmgr     fifo  n       -       n       300     1       oqmgr                                                                                                                                                                               
tlsmgr    unix  -       -       n       1000?   1       tlsmgr                                                                                                                                                                               
rewrite   unix  -       -       n       -       -       trivial-rewrite                                                                                                                                                                     
bounce    unix  -       -       n       -       0       bounce                                                                                                                                                                               
defer     unix  -       -       n       -       0       bounce                                                                                                                                                                               
trace     unix  -       -       n       -       0       bounce                                                                                                                                                                               
verify    unix  -       -       n       -       1       verify                                                                                                                                                                               
flush     unix  n       -       n       1000?   0       flush                                                                                                                                                                               
proxymap  unix  -       -       n       -       -       proxymap                                                                                                                                                                             
proxywrite unix -       -       n       -       1       proxymap                                                                                                                                                                             
smtp      unix  -       -       n       -       -       smtp                                                                                                                                                                                 
# When relaying mail as backup MX, disable fallback_relay to avoid MX loops                                                                                                                                                                 
relay     unix  -       -       n       -       -       smtp                                                                                                                                                                                 
        -o smtp_fallback_relay=                                                 
#       -o smtp_helo_timeout=5 -o smtp_connect_timeout=5                                                                                                                                                                                     
showq     unix  n       -       n       -       -       showq                                                                                                                                                                               
error     unix  -       -       n       -       -       error                                                                                                                                                                               
retry     unix  -       -       n       -       -       error                                                                                                                                                                               
discard   unix  -       -       n       -       -       discard                                                                                                                                                                             
#local     unix  -       n       n       -       -       local                                                                                                                                                                               
virtual   unix  -       n       n       -       -       virtual                                                                                                                                                                             
lmtp      unix  -       -       n       -       -       lmtp                                                                                                                                                                                 
anvil     unix  -       -       n       -       1       anvil                                                                                                                                                                               
scache    unix  -       -       n       -       1       scache


Рестартанем postfix и запустим spamd и :

# /etc/rc.d/rc.postfix restart
# /usr/bin/spamd -l -d -s /var/log/spamd/spamd.log


Чтобы при перезагрузке системы все загружалось само, добавим в /etc/rc.d/rc.local:

/etc/rc.d/rc.postfix start                                                                                                                                 
/etc/rc.d/rc.clamav start                                                                                                                                   
/usr/bin/spamd -l -d -s /var/log/spamd/spamd.log


В приложенном, вверху статьи, файле main.cf, еще очень много настроек для фильтрации спама самим postfix'ом.
Я их не привожу, они работают. Но еще больше их не включено в этот файл, потому-что они мне просто не нужны.
О всех этих настройках можно узнать (и очень советую) из нижеприведенной книги.

=== Ссылался на.... ====
1. Ральф Гильдебрандт, Патрик Кеттер Postfix. Подробное руководство (Перевод П. Шера)
2. http://www.sys-adm.org.ua/mail/postfix-clamsmtp-sa.php

==============
Обсуждаем ТУТ
==============