Postfix how to balance outgoing emails via multiple IP addresses
Postfix how to balance outgoing emails via multiple IP addresses Postfix how to balance outgoing emails via multiple IP addressesThe solution is depending on postfix`s TCP_TABLES and a perl script. In my example I`m using 7 different IP address to route outgoingmails, make sure you`ve already the IP addresses you are going to use have been configured on your box.First get a recent postfix rpm from here http://ftp.wl0.org/official/2.9/RPMS-rhel5-x86_64/. This one is built for rhel5/centos5 however should be workingwithout much hassle on rhel6/centos5. Install the package:# rpm -Uvh postfix-2.9.1-1.rhel5.x86_64.rpmMake sure its built with tcp tables support:# postconf -mbtreecidrenvironfailhashinternalldapmemcachenisproxyregexpstatictcptexthashunixInstall the perl moduleList::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 use strict;use warnings;use Sys::Syslog qw(:DEFAULT setlogsock);useList::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 listmy $maxinqueue = scalar(@{$weighted_list});## Initalize and open syslog.#openlog('postfix/randomizer','pid','mail');## Autoflush standard output.#selectSTDOUT; $|++;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.plConfigurepostfix to use the random generated smtp transport.Edit /etc/postfix/master.cf, by appending following lines:## Round-robin outgoing smtp127.0.0.1:23000 inet n n n - 0 spawnuser=nobody argv=/etc/postfix/random.pl# random smtpsmtp1 unix - - n - - smtp-o syslog_name=postfix-smtp1-o smtp_helo_name=FQDN -o smtp_bind_address=IPsmtp2 unix - - n - - smtp-o syslog_name=postfix-smtp2-o smtp_helo_name= FQDN -o smtp_bind_address=IPsmtp3 unix - - n - - smtp-o syslog_name=postfix-smtp3 -o smtp_helo_name=FQDN -o smtp_bind_address=IPsmtp4 unix- - n - - smtp-o syslog_name=postfix-smtp4 -o smtp_helo_name=FQDN -o smtp_bind_address=IPsmtp5 unix - - n - - smtp-o syslog_name=postfix-smtp5 -o smtp_helo_name=FQDN -o smtp_bind_address=IPsmtp6 unix - - n - - smtp-o syslog_name=postfix-smtp6-o smtp_helo_name=FQDN -o smtp_bind_address=IPsmtp7 unix - - n - - smtp-o syslog_name=postfix-smtp7-o smtp_helo_name= FQDN -o smtp_bind_address=IPReplace 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:23000127.0.0.1:23000_time_limit = 3600sRestart/reload postfix and verify everything is working correctly:# postmap -q "dummy" tcp:127.0.0.1:23000smtp4:# postmap -q "dummy" tcp:127.0.0.1:23000smtp5:# postmap-q "dummy" tcp:127.0.0.1:23000smtp6: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: 3CA964C0004: to=, relay=domain.org: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: 4EE244C0012: to=, relay=domain.org: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 myserverpostfix-smtp3/smtp: 69305680035: to=, relay=domain.org: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: 444B94C0006: to=, relay=domain.org: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: 585A6583CFE: to=, relay=domain.org:25, delay=2.2, delays=0.01/0/0.15/2, dsn=2.0.0, status=sent (250 OK id=1T86oe-0005u0-GO)Andalso you get an entry when the perl script is used to provide transport:Sep 2 13:24:59 myserver postfix/randomizer: Using: smtp6: Transport ServiceThis guide is based on:http://www.kutukupret.com/2011/05/22/postfix-rotating-outgoing-ip-using-tcp_table-and-perl/http://www.kutukupret.com/2010/12/06/postfix-randomizing-outgoing-ip-using-tcp_table-and-perl/Allcredists to Hari Hendaryanto
页:
[1]