Содержание

Mail-relay Server (почтовый шлюз с Exchange)


Postfix

Дано:
Шлюз (mail.mydom.ru)
Внешний IP-адрес (Internet) - 44.55.66.77
Внутренний IP-адрес - 192.168.10.245
Exchange - 192.168.10.246

Рабочие файлы. Только нужно будет поменять на свои данные (IP, пути, названия и т.д.)

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

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

Можно скачать последнюю версию с POSTFIX, распаковать и собрать, я же буду собирать при помощи 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
slackware.su_forum_files_postfix_exchange_postfix2_0.jpg Заполним поля, как показано на рисунке.
Помним, что сервер Exchange не принимает IP адрес в качестве значения для поля Smart host.

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

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

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

Теперь лучше сервисы 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).

ClamAV

Скачиваем последнюю версию ClamAV, распаковываем, начинаем собирать и устанавливать.
Перед инсталляцией необходимо создать группу и юзверя 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

Скачиваем последнюю версию 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

Скачиваем последнюю версию spamassasin, распаковываем, начинаем собирать и устанавливать.

 # 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'ом.
Я их не привожу, они работают. Но еще больше их не включено в этот файл, потому-что они мне просто не нужны.
О всех этих настройках можно узнать (и очень советую) из нижеприведенной книги.

Ссылался на….


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

Обсуждаем на форуме