Build load balancer native smtp server dengan postfix dan saslauth

Setelah bisa build native smtp server dengan postfix, dengan autentikasi model submission port 587. selanjutnya kita akan membuat smtp tersebut mempunyai 2 ip public sebagai sendernya.

ada beberapa cara agar kita bisa sending email dengan beberapa ip public: 1. Assign ip public ke dalam smtp server tersebut, lalu binding ip addressnya dan gunakan ip public tersebut ( http://marinovl.blogspot.co.id/2012/09/postfix-how-to-balance-outgoing-emails.html ). Cara ini tidak bisa, karena digital ocean hanya menerapkan floating ip (forwarding). ip public tidak bisa diassign langsung via interface os. 2. Dengan cara relay ke dalam 2 ip public tersebut dari mesin yang lain. Tentunya kita harus menyiapkan 3 buah mesin os. 2 mesin untuk sender, 1 mesin sebagai load balance. masing2 mesin os mempunyai ip public sendiri. untuk konsep load balance, cukup dengan dns round robin saja yang paling mudah.

Persiapan:

  1. Clone droplets / mesin os yang sudah kita build dari tutorial "build native smtp server dengan support submission authentication"
  2. Enable masing2 private ip.

setting hostname mesin:

  1. nws1.abc.co.id , dan cek semua yg berkaitan dengan hostname di postfix nya. set spf dari domain abc.co.id ke ip hostname ini.
  2. nws2.abc.co.id , dan cek semua yg berkaitan dengan hostname di postfix nya. set spf dari domain abc.co.id ke ip hostname ini.

test 2 droplet tersebut dengan phpmailer , pastikan spf, rdns sudha diset dengan baik. jika 2 mesin tersebut sudah ok maka bisa build untuk load balancernya.

Setup Load Balancer

Load balancer smtp dibuild dengan os ubuntu based debian, dengan enable ip private dan dengan hostname blsmtp.abc.co.id

install smtp server postfix.

apt-get install postfix sasl2-bin

config main.cf

relayhost = [mpl.abc.co.id]:587
smtp_sasl_auth_enable = yes
smtp_sasl_security_options = noanonymous

relay_domains =
home_mailbox = Maildir/
mydomain = blsmtp.abc.co.id
smtpd_use_tls = yes
smtpd_tls_key_file = /root/abc.co.id/abc.co.id.key
smtpd_tls_cert_file = /root/abc.co.id/chained.crt
smtpd_tls_auth_only=yes
smtp_tls_security_level=may

smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3
smtpd_tls_protocols = !SSLv2, !SSLv3
smtp_tls_mandatory_protocols = !SSLv2, !SSLv3
smtp_tls_protocols = !SSLv2, !SSLv3

smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination


mailbox_size_limit = 256000000
myorigin = abc.co.id
myhostname = abc.co.id
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 10.15.0.8 128.199.193.151
mydestination = newsletter.abc.co.id, localhost.localdomain, localhost
recipient_delimiter = +
inet_interfaces = all
smtp_tls_CApath = /etc/ssl/certs
smtpd_sasl_local_domain = $myhostname

smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd

define sasl user password untuk relay ke 2 mesin smtp:

vim /etc/postfix/sasl_passwd
[mpl.abc.co.id]:587 u:p
[10.130.11.5]:587 u@blsmtp.abc.co.id:p

jangan lupa set dns untuk mpl.abc.co.id ke ip private masing2 mesin smtp server.

set master.cf seperti berikut

smtp      inet  n       -       -       -       -       smtpd
submission inet n       -       -       -       -       smtpd
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_reject_unlisted_sender=yes
  -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
  -o broken_sasl_auth_clients=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
smtps     inet  n       -       -       -       -       smtpd
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
  -o broken_sasl_auth_clients=yes
  -o content_filter=
  -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
  -o milter_macro_daemon_name=ORIGINATING
pickup    unix  n       -       -       60      1       pickup
cleanup   unix  n       -       -       -       0       cleanup
qmgr      unix  n       -       n       300     1       qmgr
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?   0       flush
proxymap  unix  -       -       n       -       -       proxymap
proxywrite unix -       -       n       -       1       proxymap
smtp      unix  -       -       -       -       -       smtp
relay     unix  -       -       -       -       -       smtp
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
maildrop  unix  -       n       n       -       -       pipe
  flags=DRhu user=vmail argv=/usr/bin/maildrop -d ${recipient}
uucp      unix  -       n       n       -       -       pipe
  flags=Fqhu user=uucp argv=uux -r -n -z -a$sender - $nexthop!rmail ($recipient)
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}

set /etc/postfix/sasl/smtpd.conf

pwcheck_method: auxprop
auxprop_plugin: sasldb
mech_list: PLAIN LOGIN

set /etc/default/saslauthd:

START=yes
DESC="SASL Authentication Daemon"
NAME="saslauthd"
MECHANISMS="shadow"
MECH_OPTIONS="PLAIN LOGIN"
THREADS=5
OPTIONS="-c -m /var/run/saslauthd"

create user via sasl

saslpasswd2 -c -u domain user

untuk check user:

sasldblistusers2

setelah selesai, tinggal test ke smtp load balancer dengan user dan password yg telah dibuat:

vim blsmtp.php

<?php
//require_once('class.phpmailer.php');
require 'PHPMailerAutoload.php';

$imeladdress = "userp@k24.co.id";
$mail = new PHPMailer(); // create a new object
$mail->IsSMTP(); // enable SMTP
$mail->SMTPDebug = 1; // debugging: 1 = errors and messages, 2 = messages only
$mail->SMTPAuth = true; // authentication enabled
//$mail->SMTPSecure = ''; // secure transfer enabled REQUIRED for GMail
$mail->Host = "blsmtp.abc.co.id";
$mail->Port = 587; // or 587
$mail->IsHTML(true);
$mail->XMailer = ' ';
//$mail->Username = "user@i.abc.co.id";
//$mail->Username = "oksoft@i.abc.co.id";
$mail->Username = "useren@blsmtp.abc.co.id";
$mail->Password = "p%";
$mail->SetFrom('newsletter@abc.co.id', 'abc.co.id');
//$mail->AddReplyTo('user@abc.co.id', 'abc.co.id');
$mail->Sender="newsletter@abc.co.id";
$mail->Subject = "Inspirasi sehat";
//$mail->addCustomHeader("List-Unsubscribe",'<mailto:unsubscribe@abc.co.id?subject=Unsubscribe>, <http://abc.co.id>');
//$mail->Body = file_get_contents('file.html');
//$mail->Body = file_get_contents('gmail.html');
$mail->Body = "testaja";
$mail->AddAddress("$imeladdress");
 if(!$mail->Send())
    {
    echo "Mailer Error: " . $mail->ErrorInfo;
    }
    else
    {
    echo "Message has been sent";
    }
?>




user@it-infra ~/Downloads/PHPMailer-master $ php blsmtp.php 
2016-08-23 03:41:18 CLIENT -> SERVER: EHLO it-infra
2016-08-23 03:41:18 CLIENT -> SERVER: STARTTLS
2016-08-23 03:41:18 CLIENT -> SERVER: EHLO it-infra
2016-08-23 03:41:18 CLIENT -> SERVER: AUTH LOGIN
2016-08-23 03:41:18 CLIENT -> SERVER: ZVd1YTVtazI0LmNvLmlk
2016-08-23 03:41:18 CLIENT -> SERVER: OFlzYelI=
2016-08-23 03:41:18 CLIENT -> SERVER: MAIL FROM:<newsletter@abc.co.id>
2016-08-23 03:41:18 CLIENT -> SERVER: RCPT TO:<userp@k24.co.id>
2016-08-23 03:41:19 CLIENT -> SERVER: DATA
2016-08-23 03:41:19 CLIENT -> SERVER: Date: Tue, 23 Aug 2016 11:41:17 +0800
2016-08-23 03:41:19 CLIENT -> SERVER: To: userp@k24.co.id
2016-08-23 03:41:19 CLIENT -> SERVER: From: noreply@abc.co.id
2016-08-23 03:41:19 CLIENT -> SERVER: Subject: inspirasi sehat
2016-08-23 03:41:19 CLIENT -> SERVER: Message-ID: <c3bf4cf888fb9f37e7257d0fc1462bec@it-infra>
2016-08-23 03:41:19 CLIENT -> SERVER: X-Mailer: PHPMailer 5.2.13 (https://github.com/PHPMailer/PHPMailer)
2016-08-23 03:41:19 CLIENT -> SERVER: MIME-Version: 1.0
2016-08-23 03:41:19 CLIENT -> SERVER: Content-Type: text/html; charset=iso-8859-1
2016-08-23 03:41:19 CLIENT -> SERVER: Content-Transfer-Encoding: quoted-printable
2016-08-23 03:41:19 CLIENT -> SERVER: 233);"><br></span></div></div></body></html>=0A
2016-08-23 03:41:19 CLIENT -> SERVER: .
2016-08-23 03:41:19 CLIENT -> SERVER: QUIT

hasil email dengan menggunakan random ip address:

terlihat ip menggunakan 128.x.x.180 setelah diterima dari ip internal 10.130.11.5, dimana ip internal ini adalah ip dari blsmtp.abc.co.id (mesin load balancer).

terlihat ip address menggunakan 188.x.x.205 setelah diterima dari ip internal 10.130.11.5, dimana ip internal ini adalah ip dari blsmtp.abc.co.id (mesin load balancer)

selesai.

ref: https://wiki.debian.org/PostfixAndSASL