LinuxOpen.ru > библиотека > Пример настройки корпоративного почтового сервера на базе Postfix в Ubuntu Linux
Пример настройки корпоративного почтового сервера на базе Postfix в Ubuntu Linux19 ноября 2009. Разместил: root |
|
Виртуальные домены и пользователи будут храниться в MySQL. Управлять всем этим делом будем через вэб-интерфейс Postfixadmin. В качестве антивируса особых альтернатив не вижу — ClamAV. Спамом будут заниматься Spamassassin, Razor, Pyzor и стандартные средства самого Postfix.
Для решения задачи с ограничением размера отправляемых писем был выбран Apolicy — очень интересный плагин, умеющий помимо вышеописанного делать грэйлистинг, spf и еще ряд интересных вещей. В качестве плацдарма Ubuntu Server 9.10 (Karmic Koala). Начнем... # aptitude update # cat /etc/dovecot/dovecot-postfix.conf protocols = imap pop3 listen =* disable_plaintext_auth = no shutdown_clients = yes log_path =/var/log/dovecot.log info_log_path =/var/log/dovecot.log log_timestamp ="%Y-%m-%d %H:%M:%S " login_dir =/var/run/dovecot/login login_chroot = yes login_user = dovecot login_process_size =64 login_process_per_connection = yes login_processes_count =3 login_max_processes_count =128 login_max_connections =256 login_greeting = Hell-o!. login_log_format_elements = user=<%u> method=%m rip=%r lip=%l %c login_log_format =%$:%s mail_location = maildir:/var/mail/%d/%n mail_privileged_group =mail mail_access_groups =mail first_valid_uid =7 first_valid_gid =7 protocol imap { imap_client_workarounds = delay-newmail outlook-idle netscape-eoh tb-extra-mailbox-sep } protocol pop3 { pop3_uidl_format =%08Xu%08Xv pop3_client_workarounds = outlook-no-nuls oe-ns-eoh } protocol managesieve { sieve=~/.dovecot.sieve sieve_storage=~/sieve } protocol lda { postmaster_address = admin@domain.ru mail_plugin_dir =/usr/lib/dovecot/modules/lda auth_socket_path =/var/run/dovecot/auth-master } auth default{ mechanisms = plain login cram-md5 passdb sql { args =/etc/dovecot/dovecot-sql.conf } userdb passwd { } userdb sql { args =/etc/dovecot/dovecot-sql.conf } socket listen { master { path =/var/run/dovecot/auth-master mode =0660 user = dovecot group =mail } client { path =/var/run/dovecot/auth-client mode =0660 user = postfix group = postfix } } } В файле dovecot-sql.conf в качестве uid & gid стаим принадлежащие юзеру mail. # cat /etc/dovecot/dovecot-sql.conf connect = host=localhost dbname=mail user=mail password=password 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`,8AS `uid`,8AS `gid` FROM `mailbox` WHERE `username` ='%n@%d' AND `active`='1' Конфиги Postfix в итоге выглядят следущим образом: # cat /etc/postfix/main.cf append_dot_mydomain = no readme_directory = no # Укажем откуда брать алиасы и пользователей. alias_database =hash:/etc/aliases alias_maps =hash:/etc/aliases # Virtual mailbox settings virtual_mailbox_base =/var/mail virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql_virtual_domains_maps.cf virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf virtual_alias_maps = proxy:mysql:/etc/postfix/mysql_virtual_alias_maps.cf virtual_mailbox_limit_maps = proxy:mysql:/etc/postfix/mysql_virtual_mailbox_limit_maps.cf # Сетевые настройки mydomain = domain.ru myhostname =mail.domain.ru myorigin =$mydomain #mydestination = $myhostname, localhost, localhost.$myhostname, localhost.$mydomain, $mydomain, 063.su, furgonz.ru, domain.net mydestination =$myhostname, localhost, localhost.$myhostname, localhost.$mydomain mynetworks = 127.0.0.0/8, 192.168.0.0/16 smtp_helo_name=$myhostname smtpd_banner =$myhostname ESMTP Mail Server inet_protocols = ipv4 inet_interfaces = all # Прикручиваем SASL авторизазацию через dovecot #smtpd_sasl_type = dovecot #smtpd_sasl_path = private/auth-client #smtpd_sasl_auth_enable = yes #smtpd_sasl_exceptions_networks=$mynetworks # Почту будет раскладывать тоже dovecot mailbox_transport = dovecot mailbox_command =/usr/lib/dovecot/deliver dovecot_destination_recipient_limit =1 virtual_transport = dovecot # Настройки ящиков message_size_limit =10240000 virtual_mailbox_base =/var/mail recipient_delimiter =+ # Ограничения smtpd_client_restrictions = permit_mynetworks, check_client_access mysql:/etc/postfix/mysql_virtual_alias_maps.cf reject_unknown_client_hostname, reject_unauth_pipelining, smtpd_recipient_restrictions = check_policy_service inet:127.0.0.1:10001, permit_mynetworks, reject_unauth_destination, reject_invalid_hostname, reject_non_fqdn_hostname, reject_non_fqdn_sender, reject_non_fqdn_recipient, reject_unknown_sender_domain, reject_unknown_recipient_domain, reject_unauth_pipelining, permit_auth_destination, reject_unlisted_recipient, reject_unauth_destination reject_rbl_client opm.blitzed.org, reject_rbl_client list.dsbl.org, reject_rbl_client zen.spamhaus.org, reject_rbl_client cbl.abuseat.org, reject_rbl_client dul.dnsbl.sorbs.net, reject_rbl_client dnsbl.njabl.org, reject_rbl_client dynablock.njabl.org, reject_rbl_client bl.spamcop.net, reject_rbl_client bl.csma.biz, reject_rbl_client dnsbl.sorbs.net, reject_rbl_client smtp.dnsbl.sorbs.net, reject_rbl_client combined.njabl.org, reject_rbl_client rbl.majordomo.ru, smtpd_sender_restrictions = check_policy_service inet:127.0.0.1:10001, permit_mynetworks, check_sender_access hash:/etc/postfix/sender_access reject_unknown_sender_domain, reject_unlisted_sender, reject_non_fqdn_sender smtpd_helo_restrictions = permit_mynetworks, check_helo_access hash:/etc/postfix/helo_access reject_invalid_helo_hostname, reject_unknown_helo_hostname, reject_non_fqdn_helo_hostname smtpd_data_restrictions = permit_mynetworks, reject_multi_recipient_bounce, reject_unauth_pipelining smtpd_etrn_restrictions = permit_mynetworks, reject header_checks = regexp:/etc/postfix/header_checks sender_bcc_maps =hash:/etc/postfix/sender_bcc_maps #recipient_bcc_maps = hash:/etc/postfix/recipient_bcc_maps strict_rfc821_envelopes = yes smtpd_reject_unlisted_sender = yes smtpd_reject_unlisted_recipient=yes disable_vrfy_command = yes show_user_unknown_table_name = no smtpd_helo_required = yes smtp_always_send_ehlo = yes smtp_never_send_ehlo=no smtpd_delay_reject=no address_verify_sender=&lt;&gt; address_verify_negative_cache=yes address_verify_poll_count=1 address_verify_positive_expire_time=31d address_verify_positive_refresh_time=7d address_verife_negative_expire_time=3d address_verify_negative_refresh_time=3h allow_untrusted_routing=no resolve_null_domain=no resolve_numeric_domain=no smtpd_recipient_limit=100 smtp_quote_rfc821_envelope=yes smtpd_soft_error_limit =2 smtpd_error_sleep_time = ${stress?0}${stress:10s} smtpd_hard_error_limit = ${stress?3}${stress:20} smtpd_timeout = ${stress?30}${stress:300} # Таймауты по RFC 2821 smtpd_timeout=5m smtpd_starttls_timeout=5m smtp_mail_timeout=5m smtp_rcpt_timeout=5m smtp_data_init_timeout=2m smtp_data_xfer_timeout=3m smtp_data_done_timeout=10m maximal_queue_lifetime=4d bounce_queue_lifetime=4d queue_run_delay=30m minimal_backoff_time=3h maximal_backoff_time=5h # Прикручиваем Amavis content_filter = smtp-amavis:[127.0.0.1]:10024 # cat /etc/postfix/master.cf # Postfix master process configuration file. For details on the format # of the file, see the master(5) manual page (command: "man 5 master"). # # Do not forget to execute "postfix reload" after editing this file. # # ========================================================================== # service type private unpriv chroot wakeup maxproc command + args # (yes) (yes) (yes) (never) (100) # ========================================================================== smtp inet n - n -- smtpd #submission inet 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 - - - - 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 - - - - qmqpd pickup fifo n --601 pickup cleanup unix n ---0 cleanup qmgr fifo n - n 3001 qmgr #qmgr fifo n - - 300 1 oqmgr tlsmgr unix ---1000? 1 tlsmgr rewrite unix ----- trivial-rewrite bounce unix ----0 bounce defer unix ----0 bounce trace unix ----0 bounce verify unix ----1 verify flush unix n --1000? 0flush proxymap unix -- n -- proxymap proxywrite unix -- n -1 proxymap smtp unix ----- smtp # When relaying mail as backup MX, disable fallback_relay to avoid MX loops relay unix ----- smtp -o smtp_fallback_relay= # -o smtp_helo_timeout=5 -o smtp_connect_timeout=5 showq unix n ---- showq error unix ----- error retry unix ----- error discard unix ----- discard local unix - n n -- local virtual unix - n n --virtual lmtp unix ----- lmtp anvil unix ----1 anvil scache unix ----1 scache # # ==================================================================== # Interfaces to non-Postfix software. Be sure to examine the manual # pages of the non-Postfix software to find out what options it wants. # # Many of the following services use the Postfix pipe(8) delivery # agent. See the pipe(8) man page for information about ${recipient} # and other message envelope options. # ==================================================================== # # maildrop. See the Postfix MAILDROP_README file for details. # Also specify in main.cf: maildrop_destination_recipient_limit=1 # maildrop unix - n n -- pipe flags=DRhu user=vmail argv=/usr/bin/maildrop -d ${recipient} # # See the Postfix UUCP_README file for configuration details. # uucp unix - n n -- pipe flags=Fqhu user=uucp argv=uux -r -n -z -a$sender-$nexthop!rmail ($recipient) # # Other external delivery methods. # ifmail unix - n n -- pipe flags=F user=ftn argv=/usr/lib/ifmail/ifmail -r $nexthop($recipient) bsmtp unix - n n -- pipe flags=Fq. user=bsmtp argv=/usr/lib/bsmtp/bsmtp -t$nexthop-f$sender$recipient scalemail-backend unix - n n -2 pipe flags=R user=scalemail argv=/usr/lib/scalemail/bin/scalemail-store ${nexthop} ${user} ${extension} mailman unix - n n -- pipe flags=FR user=list argv=/usr/lib/mailman/bin/postfix-to-mailman.py ${nexthop} ${user} # delivery through dovecot dovecot unix - n n -- pipe flags=DRhu user=mail:mail argv=/usr/lib/dovecot/deliver -d $(recipient) # Amavis -o receive_override_options=no_header_body_checks,no_unknown_recipient_checks smtp-amavis unix ----2 smtp -o smtp_data_done_timeout=1200 -o smtp_send_xforward_command=yes -o disable_dns_lookups=yes -o max_use=20 127.0.0.1:10025 inet n ---- smtpd -o content_filter= -o local_recipient_maps= -o relay_recipient_maps= -o smtpd_restriction_classes= -o smtpd_delay_reject=no -o smtpd_client_restrictions=permit_mynetworks,reject -o smtpd_helo_restrictions= -o smtpd_sender_restrictions= -o smtpd_recipient_restrictions=permit_mynetworks,reject -o smtpd_data_restrictions=reject_unauth_pipelining -o smtpd_end_of_data_restrictions= -o mynetworks=127.0.0.0/8 -o smtpd_error_sleep_time=0 -o smtpd_soft_error_limit=1001 -o smtpd_hard_error_limit=1000 -o smtpd_client_connection_count_limit=0 -o smtpd_client_connection_rate_limit=0 -o receive_override_options=no_header_body_checks,no_unknown_recipient_checks Дальше приведу содержимое используемых в main.cf файлов и кратко объясню для чего они нужны: # cat /etc/postfix/header_checks В файле перечислены вложения, которые система не пропускает. # cat /etc/postfix/helo_access С помощью этой проверки отбраковываем тех, кто подставляет в helo название нашего сервера. # cat /etc/postfix/recipient_bcc_maps @domain2.ru audit@domain.ru # cat /etc/postfix/sender_bcc_maps @domain2.ru audit@domain.ru В этих файлах прописано почту каких доменов и куда мы копируем. Для контроля и безопасности. # cat /etc/postfix/sender_access @spammer.ru REJECT В этом файле можно вручную добавлять адресатов и домены в черный и белый списки. # postmap /etc/postfix/header_checks Дальше содержимое файлов, которые будут работать с MySQL: # cat /etc/postfix/mysql_virtual_alias_maps.cf password = password hosts = localhost dbname =mail table = alias select_field = goto where_field = address additional_conditions = and active ='1' query = SELECT goto FROM alias WHERE address='%s' AND active ='1' # cat /etc/postfix/mysql_virtual_domains_maps.cf password = password hosts = localhost dbname =mail table = domain select_field = domain where_field = domain additional_conditions = and backupmx ='0' and active ='1' query = SELECT domain FROM domain WHERE domain='%s' AND backupmx ='0' AND active ='1' # cat /etc/postfix/mysql_virtual_mailbox_limit_maps.cf password = password hosts = localhost dbname =mail table = mailbox select_field = quota where_field = username additional_conditions = and active ='1' query = SELECT quota FROM mailbox WHERE username='%s' AND active ='1' # cat /etc/postfix/mysql_virtual_mailbox_maps.cf password = password hosts = localhost dbname =mail table = mailbox select_field = CONCAT(domain,'/',maildir) where_field = username additional_conditions = and active ='1' query = SELECT CONCAT(domain,'/',maildir) FROM mailbox WHERE username='%s' AND active ='1' Для того, чтобы на постфикс начал работать антивирус со всем антиспамовым хозяйством, необходимо астроить Amavis, который всех их связывает: # cat/etc/amavis/conf.d/15-content_filter_mode @bypass_virus_checks_maps =( \%bypass_virus_checks, \@bypass_virus_checks_acl, \$bypass_virus_checks_re); @bypass_spam_checks_maps =( \%bypass_spam_checks, \@bypass_spam_checks_acl, \$bypass_spam_checks_re); 1;# ensure a defined return Для того, чтобы спам отбивался, а не просто проходил с пометкой, в /etc/amavis/conf.d/20-debian_defaults меняем $final_spam_destiny на D_DISCARD; # cat /etc/spamassassin/local.cf report_safe 1 trusted_networks 192.168. required_score 5.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 skip_rbl_checks 0 use_razor2 1 use_pyzor 1 dns_available yes ## Optional Score Increases score SPF_FAIL 10.000 score SPF_HELO_FAIL 10.000 score RAZOR2_CHECK 2.500 score PYZOR_CHECK 2.500 score BAYES_99 4.300 score BAYES_95 3.500 score BAYES_80 3.000 whitelist_from @host.superjob.ru Дальше нужно корректно расставить права доступа: # chmod -R 770 /var/mail # usermod -a -G amavis mail Создаем в MySQL базу с соответствующими привилегиями: # mysql -p mysql grant all on mail.* to mail identified by 'password'; mysql bye Postfixadmin можно скачать отсюда: http://sourceforge.net/projects/postfixadmin/ Дальше качаем apolicy: http://download.gna.org/apolicy/apolicy-0.73.tar.gz # aptitude install python-ipy python-dns python-twisted-core python-twisted-bin python-spf ... и тут полезли какие-то ошибки ))... # mkdir /usr/lib/python2.6/dist-packages/apolicy # /etc/init.d/apolicy start Конфиг apolicy с разруливанием размеров писем: # cat /etc/apolicy/policy.conf acl local_domains sender @domain2.ru acl privileged_users sender admin@domain.ru acl privileged_users sender office@domain.ru acl 1mb size 1024000 action deny_max_1mb REJECT Sorry, but You can't sent more than 1mb access local_domains !privileged_users 1mb deny_max_1mb Вроде все настроили, теперь делаем рестарт всех возможный сервисов, либо просто перезагружаемся. Проверяем: # telnet localhost 110 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. +OK Hell-o!. # telnet localhost 25 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. 220mail.domain.ru ESMTP Mail Server Ну и дальше пробуем почтовым клиентом отправить, получить... смотрим логи, если что — там все есть!
|