postfix backup mx server

vladimir simeonov
29/07/2011

Целта на резервния mail server е:

1. складиране на входящи писма, в случай че главният сървър отпадне.

2. разтоварване на главният сървър от спам 🙂

Важно:

  • за да не влиза спам през backup mx, е много важно спам защитата на backup mx да е настроена аналогично на главния. ако не се приложи това правило, то backup mx ще приема писмата от името на главният сървър и ще му ги препраща за доставка до users maildir.
  • главният сървър ще трябва да приема писмата от backup mx безрезервно, т.е. да му се доверява напълно. в противен случай, главният сървър ще генерира bounce до backup-а, който от своя страна ще се чуди какво да прави с това писмо, което е рапортувал за доставено на upstream mx-a.

конфигурацията е изключително проста:

1. в DNS добавяте втори MX запис:

IN MX 10 mail.lordofdeath.net.

IN MX 20 mail2.lordofdeath.net.

2. инсталирате postfix, postfix-policyd, postgrey на резервния mail2

*За да имате пълен толеранс и също така съвместимост съветвам MySQL сървърите на mail и mail2 да работят в режим на master-master replication поне за базите с които работят postfix, postfix-policyd

** http://www.howtoforge.com/mysql_master_master_replication – mysql master-master replication howto

ако вашият backup mx (mail2) ще backup-ва единствено и само 1 сървър, то можете да ползвате таблицата domains за списък с домейните които ще relay-ва към primary mx-a.

в случай, че правите primary mx сървър на един набор от домейни да бъде backup mx за други домейни, то ще трябва да създадете отделна таблица за relay domains.

CREATE TABLE IF NOT EXISTS `relays` (

`active` int(11) NOT NULL DEFAULT ‘1’,

`source` varchar(50) NOT NULL DEFAULT ”,

`destination` varchar(50) NOT NULL,

`created _by` text,

`c_date` date DEFAULT NULL,

PRIMARY KEY (`source`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8;

промени по конфигурацията на primary mx не са нужни, следващите конф. са за backup mx (mail2):

mail_owner = postfix

unknown_local_recipient_reject_code = 550

mynetworks_style = host

debug_peer_level = 2

biff = no

append_dot_mydomain = no

myhostname = mail2.lordofdeath.net.

myorigin = mail2.lordofdeath.net.

mynetworks = $config_directory/mynetworks

mydestination = $myhostname, localhost

alias_maps = hash:/etc/aliases

unknown_local_recipient_reject_code = 552

unknown_hostname_reject_code = 551

unknown_client_reject_code = 481

unknown_address_reject_code = 554

unknown_virtual_alias_reject_code = 556

unknown_virtual_mailbox_reject_code = 557

non_fqdn_reject_code = 581

strict_rfc821_envelopes = no

smtpd_delay_reject = yes

smtpd_helo_required = yes

smtpd_client_restrictions =

check_client_access     mysql:$config_directory/mysql_virtual_client_access.cf,

check_client_access     mysql:$config_directory/mysql_virtual_nordns_access.cf,

permit_mynetworks

smtpd_sender_restrictions =

check_client_access     mysql:$config_directory/mysql_virtual_client_access.cf,

check_client_access     mysql:$config_directory/mysql_virtual_nordns_access.cf,

permit_mynetworks,

reject_unknown_sender_domain,

reject_unknown_client

smtpd_recipient_restrictions =

check_client_access     mysql:$config_directory/mysql_virtual_client_access.cf,

check_client_access     mysql:$config_directory/mysql_virtual_nordns_access.cf,

permit_mynetworks,

reject_non_fqdn_recipient,

reject_non_fqdn_sender,

reject_unknown_sender_domain,

reject_unknown_recipient_domain,

reject_unauth_destination,

reject_rbl_client bl.spamcop.net,

reject_rbl_client zen.spamhaus.org,

check_policy_service unix:private/policy-spf,

check_policy_service inet:127.0.0.1:10023,

check_policy_service inet:127.0.0.1:10031,

permit

smtpd_helo_restrictions =

permit_mynetworks,

check_client_access     mysql:$config_directory/mysql_virtual_helo_access.cf,

reject_non_fqdn_hostname,

reject_invalid_hostname,

permit

relay_domains = mysql:$config_directory/mysql_virtual_relay_domains.cf

relay_recipient_maps= mysql:$config_directory/mysql_virtual_relay_mailboxes.cf
mysql:$config_directory/mysql_virtual_forwardings.cf

virtual_alias_domains =

virtual_mailbox_domains =

#virtual_alias_maps =

smtpd_sasl_auth_enable = no

message_size_limit = 55971520

virtual_mailbox_limit = 55971520

mailbox_size_limit = 55971520

maximal_queue_lifetime = 168h

bounce_queue_lifetime = 168h

#SPF

spf-policyd_time_limit = 3600s

mysql_virtual_relay_domains.cf 

user = vmail_client

password = [email protected]

dbname = vmailsystem

table = relays

select_field = domain

where_field = domain

hosts = db1.lordofdeath.net

additional_conditions = and active = ‘1’

*** ако нежелаете да mail2 да прави проверка дали потребителя съществува, премахнете удебеленият текст за ‘relay_recipient_maps = ‘, но оставете самата директива.

mysql_virtual_relay_mailboxes.cf

user = vmail_clientpassword = [email protected]

dbname = vmailsystem

table = users

select_field = ‘OK’

where_field = email

hosts = db1.lordofdeath.net

additional_conditions = and active = ‘1’

mysql_virtual_forwardings.cf

user = vmail_clientpassword = [email protected]

dbname = vmailsystem

table = forwardings

select_field = ‘OK’

where_field = email

hosts = db1.lordofdeath.net

additional_conditions = and active = ‘1’

**** Тъйкато протокола за smtp повелява, че ако главният сървър не допуска писмото (graylist), сървъра, който се опитва да го изпрати, трябва да пробва с другите mx сървъри (backup mx-а), ако ползвате postfix-policyd, то трябва primary и backup mx сървърите да ползват еднаква конфигурация за postfix-policyd, но различни бази данни. това се налага от факта, че ако ползвате една база, то квотата за брой писма които едно IP може да прати за определен интервал, ще се достигне 2х по – бързо. пример:

mail.hostatme.com праща писмо до mail.lordofdeath.net, primary mx добавя запис в policyd db, писмото се graylist-ва. mail.hostatme.com праща същото писмо до mail2.lordofdeath.net. backup mx увеличава броя пъти за ip-то в записа на същата база.

друга причина за ползване на отделни таблици е ако ползвате graylist на policyd. при същия пример отгоре. primary mx ще добави запис, че е graylist-нал писмото. backup mx, ще види записа и ще го пропусне. но това не е повторен опит от страна на подателя, а просто обхождане на сървърите в опит да го достави. разбира се можете да поставите по – голям интервал на graylist след който да пропуска писмото, но това води до странични последствия като допълнитела латентност и забавяне на доставката, а и подателя може да обхожда сървърите с delay интервал.

Comments are closed !