Балансировка отправки почты с нескольких IP (Postfix)
Dec 092016Install the perl module List::util::WeightedRoundRobin:
cpan install /List::util::WeightedRoundRobin/
Create the following perl script and make it executable:
vi /etc/postfix/random.pl
#!/usr/bin/perl -w
# author: Hari Hendaryanto <hari.h -at- csmcom.com>
use strict;
use warnings;
use Sys::Syslog qw(:DEFAULT setlogsock);
use List::Util::WeightedRoundRobin;
use Storable;
my $hashfile="/tmp/file.hash";
store {}, $hashfile unless -r $hashfile;
#
# our transports lists, we will define this in master.cf as transport services
# Queued using Weighted Round-Robin Scheduling
#
my $list = [
{
name => 'smtp1:',
weight => 1,
},
{
name => 'smtp2:',
weight => 1,
},
{
name => 'smtp3:',
weight => 1,
},
{
name => 'smtp4:',
weight => 1,
},
{
name => 'smtp5:',
weight => 1,
},
{
name => 'smtp6:',
weight => 1,
},
{
name => 'smtp7:',
weight => 1,
},
];
my $WeightedList = List::Util::WeightedRoundRobin->new();
my $weighted_list = $WeightedList->create_weighted_list( $list );
# $maxinqueue max number of queue in smtp list
my $maxinqueue = scalar(@{$weighted_list});
#
# Initalize and open syslog.
#
openlog('postfix/randomizer','pid','mail');
#
# Autoflush standard output.
#
select STDOUT; $|++;
while (<>) {
chomp;
my $count;
my $hash=retrieve($hashfile);
if (!defined $hash->{"index"})
{
$count = 0;
} else {
$count = $hash->{"index"};
}
if ($count >= $maxinqueue)
{
$hash->{"index"} = 0;
$count = 0;
}
$hash->{"index"}++;
store $hash, $hashfile;
my $random_smtp = ${$weighted_list}[$count];
if (/^get\s(.+)$/i) {
print "200 $random_smtp\n";
syslog("info","Using: %s Transport Service", $random_smtp);
next;
}
print "200 smtp:\n";
}
Execute the script to make sure it`s working and no errors are encountered:
/etc/postfix/random.pl
Configure postfix to use the random generated smtp transport.
Edit /etc/postfix/master.cf, by appending following lines:
## Round-robin outgoing smtp
127.0.0.1:23000 inet n n n - 0 spawn
user=nobody argv=/etc/postfix/random.pl
# random smtp
smtp1 unix - - n - - smtp
-o syslog_name=postfix-smtp1
-o smtp_helo_name=FQDN
-o smtp_bind_address=IP
smtp2 unix - - n - - smtp
-o syslog_name=postfix-smtp2
-o smtp_helo_name= FQDN
-o smtp_bind_address=IP
smtp3 unix - - n - - smtp
-o syslog_name=postfix-smtp3
-o smtp_helo_name=FQDN
-o smtp_bind_address=IP
smtp4 unix - - n - - smtp
-o syslog_name=postfix-smtp4
-o smtp_helo_name=FQDN
-o smtp_bind_address=IP
smtp5 unix - - n - - smtp
-o syslog_name=postfix-smtp5
-o smtp_helo_name=FQDN
-o smtp_bind_address=IP
smtp6 unix - - n - - smtp
-o syslog_name=postfix-smtp6
-o smtp_helo_name= FQDN
-o smtp_bind_address=IP
smtp7 unix - - n - - smtp
-o syslog_name=postfix-smtp7
-o smtp_helo_name= FQDN
-o smtp_bind_address=IP
Replace FQDN with desired hostname and IP with the list of the IP addresses you`d like to use.
Append the following lines to your /etc/postfix/main.cf:
transport_maps = tcp:127.0.0.1:23000
127.0.0.1:23000_time_limit = 3600s
Restart/reload postfix and verify everything is working correctly:
# postmap -q "dummy" tcp:127.0.0.1:23000
smtp4:
# postmap -q "dummy" tcp:127.0.0.1:23000
smtp5:
# postmap -q "dummy" tcp:127.0.0.1:23000
smtp6:
In your logs you should see the different smtp transport beeing used when mails are sent:
Sep 2 12:50:05 myserver postfix-smtp2/smtp[2016]: 3CA964C0004: to=<example@domain.org>, relay=domain.org[XXXXXXXXX]:25, delay=2, delays=0.03/0.01/0.18/1.8, dsn=2.0.0, status=sent (250 OK id=1T86oe-0005tU-E9)
Sep 2 12:50:05 myserver postfix-smtp5/smtp[2014]: 4EE244C0012: to=<example@domain.org>, relay=domain.org[XXXXXXXXX]:25, delay=2, delays=0.01/0/0.21/1.8, dsn=2.0.0, status=sent (250 OK id=1T86oe-0005tx-Gn)
Sep 2 12:50:05 myserver postfix-smtp3/smtp[2045]: 69305680035: to=<example@domain.org>, relay=domain.org[XXXXXXXXX]:25, delay=2, delays=0.05/0/0.11/1.9, dsn=2.0.0, status=sent (250 OK id=1T86oe-0005uJ-Ih)
Sep 2 12:50:05 myserver postfix-smtp3/smtp[2034]: 444B94C0006: to=<example@domain.org>, relay=domain.org[XXXXXXXXX]:25, delay=2.2, delays=0.04/0/0.21/1.9, dsn=2.0.0, status=sent (250 OK id=1T86oe-0005tW-G9)
Sep 2 12:50:05 myserver postfix-smtp1/smtp[2039]: 585A6583CFE: to=<example@domain.org>, relay=domain.org[XXXXXXXXX]:25, delay=2.2, delays=0.01/0/0.15/2, dsn=2.0.0, status=sent (250 OK id=1T86oe-0005u0-GO)