Postfix Smtp Outgoing IP Rotator using iptables

This is the scheme

e.g:

I got 5 Public IPs. i’m Gonna configure them, so Postfix can use multiple interfaces/ips for outgoing smtp connections.

First we need creating Interface aliases for those 5 public IPs.

In my system, using fedora:

# cd /etc/sysconfig/network-scripts/
# cp ifcfg-eth0 ifcfg-eth0:1

Edit ifcfg-eth0:1

# vi ifcfg-eth0\:1

DEVICE=eth0 <-- default device
HWADDR=XX:XX:XX:XX:XX:XX
ONBOOT=yes
TYPE=Ethernet
BOOTPROTO=none
IPADDR=202.XXX.XX.2 <-- default eth0 IP address
PREFIX=24
GATEWAY=202.XXX.XX.1
DNS1=202.XXX.XX.XX

Change DEVICE and IPADDR parameters

DEVICE=eth0:1 <-- device alias #1
HWADDR=XX:XX:XX:XX:XX:XX
ONBOOT=yes
TYPE=Ethernet
BOOTPROTO=none
IPADDR=202.XXX.XX.3 <-- IP alias #1
PREFIX=24
GATEWAY=202.XXX.XX.1
DNS1=202.XXX.XX.XX

We can continue with next interfaces for IP aliases same way as mention above.

when we were done, bring those IP aliases up.

#ifup eth0:1
#ifup eth0:2
#ifup eth0:3
#ifup eth0:4
......
next interfaces

Check if interfaces is up

#ifconfig
eth0      Link encap:Ethernet  HWaddr XX:XX:XX:XX:XX:XX  
          inet addr:202.XXX.XX.2  Bcast:202.XXX.XX.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:feb0:e91/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:598678 errors:0 dropped:0 overruns:0 frame:0
          TX packets:26348 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:49088016 (46.8 MiB)  TX bytes:7707579 (7.3 MiB)

eth0:1    Link encap:Ethernet  HWaddr XX:XX:XX:XX:XX:XX  
          inet addr:202.XXX.XX.3  Bcast:202.XXX.XX.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

eth0:2    Link encap:Ethernet  HWaddr XX:XX:XX:XX:XX:XX  
          inet addr:202.XXX.XX.4  Bcast:202.XXX.XX.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

eth0:3    Link encap:Ethernet  HWaddr XX:XX:XX:XX:XX:XX  
          inet addr:202.XXX.XX.5  Bcast:202.XXX.XX.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

......
and so on

There’s no particular configuration need to adjust in postfix.

Now the iptables part.make sure your iptables support for statistic match module.

# iptables -m statistic -h
......
......
......
statistic match options:
 --mode mode                    Match mode (random, nth)
 random mode:
 --probability p                 Probability
 nth mode:
 --every n                       Match every nth packet
 --packet p                      Initial counter value (0 <= p <= n-1, default 0)

Next continue with iptables rule for rotating source IP addresses.

# iptables -t nat -I POSTROUTING -m state --state NEW -p tcp --dport 25 -o eth0 -m statistic --mode nth --every 5 -j SNAT --to-source 202.XXX.XX.2
# iptables -t nat -I POSTROUTING -m state --state NEW -p tcp --dport 25 -o eth0 -m statistic --mode nth --every 5 -j SNAT --to-source 202.XXX.XX.3
# iptables -t nat -I POSTROUTING -m state --state NEW -p tcp --dport 25 -o eth0 -m statistic --mode nth --every 5 -j SNAT --to-source 202.XXX.XX.4
# iptables -t nat -I POSTROUTING -m state --state NEW -p tcp --dport 25 -o eth0 -m statistic --mode nth --every 5 -j SNAT --to-source 202.XXX.XX.5
# iptables -t nat -I POSTROUTING -m state --state NEW -p tcp --dport 25 -o eth0 -m statistic --mode nth --every 5 -j SNAT --to-source 202.XXX.XX.6

done

note: this guide based on someone’s post on postfix-users mailing list

50 Comments

  1. Mageler

    Does the rotating IPs via a IP table actually work? If so how would I configure this in Ubuntu? Let me know thanks. I have my email server using post fix for bulk email for my clients email marketing needs.
    Thanks
    Mageler

    • admin admin

      yes it work, i’m using it on one of smtp outgoing farm for my customer, it work on ubuntu i guess, if it support iptables statistic module.

  2. Marco

    I tried this solution and it worked, except that it doens't change the hostname. This kind of mess up the delivery rate.

    Do you know a solution to make it use the correct reverse dns for each IP?

    • admin admin

      i’m afraid it cannot be done, postfix will always using same helo name, if it’s what you meant.
      postfix cannot change helo name dynamically on the fly.

      or you were asking about how to setup dns reverse?it just setting ptr record in dns server in that case.

  3. Peter

    Any idea why I am getting a “No chain/target/match by that name” on this one with a Parallels VPS?
    iptables -t nat -I POSTROUTING -m state –state NEW -p tcp –dport 25 -o venet0 -m statistic –mode nth –every 5 -j SNAT –to-source xx.xx.xx.xx

    • Peter

      To answer my own question on this – the statistic module was not enabled by the host – so make sure the needed modules are enabled if you are trying this on a VPS!

      • leenoux leenoux

        yes, or you can build your own iptables. i’m using centos 5

        # cat /etc/redhat-release 
        CentOS release 5.4 (Final)
        

        i’ve compiled iptables manualy using fedora 12’s iptables

        iptables-1.4.3.2-2.fc12.src.rpm
        

        i’m not found any glitch yet 😀

        • Josh Sanders

          How do you compile iptables-1.4.3.2-2.fc12.src.rpm
          for CentOS 5.5? Do you have a procedure?

          Thanks

  4. Peter

    Once again I got some questions for you 😉 I’ve implemented this strategy on a new server that has 60 IPs – but…
    Some IPs seem to be way more used than others, especially the ones that are “first” in the IPtables rules… Any ideas on this?
    Secondly – I was wondering, when analyzing mail logs, is there any way to include which IP postfix used in that situaiton? Cause else an error on one IP would be a bit like looking for a needle in a stack somewhere…

    • When your MTA send 5 mail sessions simultaneously, when hit iptables rules in nat table sequence, statistic module will distributed the connection in round-roubin fashion. so those 5 mail session only hit the upper 5 iptables rules.(i’m not realy sure how this nth sequence work either)..hehe

      -m statistic --mode nth --every ...
      

      when your mail traffic never burst large scale simultaneous connection, it will never reach all iptables statistic rules.
      alternatively, you can play with –mode random (i’ve never tried this) or set

       smtp_connection_cache_on_demand = off
      

      i’t’s enabled by default, this will avoid one session hanging on the same connection.

      about second question, i’m afraid i don’t know how to log which ip used by postfix outgoing session.
      i’m just change the syslog name for outgoing smtp

      slow  unix -       -       n       -       -       smtp
                -o syslog_name=postfix-to-rotator
      
      • Peter

        Very interesting – I guess the random-mode would work best? Or would the smtp_connection_cache work the exact same way? Because the smtp_connection:cache would be an easy fix to implement on machines that are already setup with the nth mode? 🙂

        For new setups, i just need to figure out now, if the probability setting takes an input with 2 decimals – since 0.1 would be 10% and that would be to much for a setup with more than 10 IPs.

        • i’m using 29 IPs using –-mode nth and smtp_connection_cache_on_demand = off. here’s is my statistic

          Chain POSTROUTING (policy ACCEPT 68M packets, 3977M bytes)
           pkts bytes target     prot opt in     out     source               destination         
          38293 2106K SNAT       tcp  --  *      eth0    2xx.x.x.121       0.0.0.0/0           state NEW tcp dpt:25 statistic mode nth every 29 to:2xx.x.x.247 
          36972 2036K SNAT       tcp  --  *      eth0    2xx.x.x.121       0.0.0.0/0           state NEW tcp dpt:25 statistic mode nth every 29 to:2xx.x.x.248 
          35697 1964K SNAT       tcp  --  *      eth0    2xx.x.x.121       0.0.0.0/0           state NEW tcp dpt:25 statistic mode nth every 29 to:2xx.x.x.50 
          34467 1899K SNAT       tcp  --  *      eth0    2xx.x.x.121       0.0.0.0/0           state NEW tcp dpt:25 statistic mode nth every 29 to:2xx.x.x.51 
          33278 1828K SNAT       tcp  --  *      eth0    2xx.x.x.121       0.0.0.0/0           state NEW tcp dpt:25 statistic mode nth every 29 to:2xx.x.x.52 
          32130 1768K SNAT       tcp  --  *      eth0    2xx.x.x.121       0.0.0.0/0           state NEW tcp dpt:25 statistic mode nth every 29 to:2xx.x.x.53 
          --- snip ----
          17084  941K SNAT       tcp  --  *      eth0    2xx.x.x.121       0.0.0.0/0           state NEW tcp dpt:25 statistic mode nth every 29 to:2xx.x.x.70 
          16495  909K SNAT       tcp  --  *      eth0    2xx.x.x.121       0.0.0.0/0           state NEW tcp dpt:25 statistic mode nth every 29 to:2xx.x.x.40 
          15926  876K SNAT       tcp  --  *      eth0    2xx.x.x.121       0.0.0.0/0           state NEW tcp dpt:25 statistic mode nth every 29 to:2xx.x.x.245 
          15377  846K SNAT       tcp  --  *      eth0    2xx.x.x.121       0.0.0.0/0           state NEW tcp dpt:25 statistic mode nth every 29 to:2xx.x.x.246 
          14847  817K SNAT       tcp  --  *      eth0    2xx.x.x.121       0.0.0.0/0           state NEW tcp dpt:25 statistic mode nth every 29 to:2xx.x.x.116 
          14335  787K SNAT       tcp  --  *      eth0    2xx.x.x.121       0.0.0.0/0           state NEW tcp dpt:25 statistic mode nth every 29 to:2xx.x.x.249 
          

          with average/low traffic lower iptables rules will not so often reached.

          • Peter

            With the smtp_connection.. = off, my postfix installation just queues all mails, and never starts to send anything out – so i implemented -mod random instead…

            But I need to wait a couple of days for some SNDS data to update, it seems to bee the easiest way to check if IPs are used randomly or if some of them are preferred by the iptables…

  5. Kim Doff

    Hello,

    I am a newbie
    I would like to add this to my VPS.
    How can I enable nat on iptables.
    I have Fedora 13 and iptables-1.4.7-2.
    thanks

    • fedora 13 should be supporting nat by default. just follow the instruction..

  6. Josh Sanders

    When I try to add the iptables rule for rotating source IP addresses, I have this error message:

    iptables: No chain/target/match by that name.

    I have
    Fedora13 32 bits
    iptables-1.4.7-2
    kernel 2.6.18

    Also, I initialized iptables table ‘nat’
    # iptables -t nat -nvL

    But Iptables cannot add those rules.
    Any idea?

  7. Josh Sanders

    How can I enable the statistic module?

    “To answer my own question on this – the statistic module was not enabled by the host – so make sure the needed modules are enabled if you are trying this on a VPS”

      • josh

        Well, It is not very helpful.
        Thanks anyway

        • i still don’t get what you mean, statistic module should be there by default.(AFAIK)
          was iptables_nat modules loaded?

          # lsmod | grep nat
          iptable_nat             7456  0 
          nf_nat                 22372  1 iptable_nat
          

          was iptables modules xt_statistic loaded?

          # lsmod | grep statistic
          xt_statistic            2008  1 
          
          • upss, sorry i didn’t notice that you have kernel 2.6.18.
            in my older machine using that kernel, statistic module is not supported.
            i’m affraid the only solution is upgrade to newer kernel.

          • Josh Sanders

            Which versions of Kernel, Fedora and iptables do you have?

          • # cat /etc/redhat-release 
            Fedora release 12 (Constantine)
            
            [root@dev ~]# uname -a
            Linux dev.corp.3g-net.net 2.6.31.5-127.fc12.x86_64 #1 SMP Sat Nov 7 21:11:14 EST 2009 x86_64 x86_64 x86_64 GNU/Linux
            
            [root@dev ~]# iptables -v
            iptables v1.4.5: no command specified
            
          • Josh Sanders

            Another questions

            Which server virtualisation technology do you have?
            XEN or OPENVZ?

          • some installed barely on machines, some using vmware esxi

          • Josh Sanders

            Hello,

            If I want to change to “every” .. what should I do?

            I mean, should I flush iptables? or just enter the iptables rules again.

            Thanks

  8. Josh Sanders

    How do you compile iptables-1.4.3.2-2.fc12.src.rpm
    for CentOS 5.5? Do you have a procedure?

    • Josh Sanders

      I got those errors

      [root@kme src]# rpmbuild –rebuild iptables-1.4.3.2-2.fc12.src.rpm

      Installing iptables-1.4.3.2-2.fc12.src.rpm

      warning: user mockbuild does not exist – using root
      warning: group mockbuild does not exist – using root

      error: unpacking of archive failed on file /usr/src/redhat/SOURCES/iptables-1.4.
      3.1-cloexec.patch;4dad5990: cpio: MD5 sum mismatch

      error: iptables-1.4.3.2-2.fc12.src.rpm cannot be installed

      • try

        # rpm -Uvh iptables-1.4.3.2-2.fc12.src.rpm --nomd5 
        # cd `rpm --eval '%{_specdir}'`
        # rpmbuild -ba iptables.spec
        
        • Josh Sanders

          What I did wrong?

          I did

          # rpm -Uvh iptables-1.4.3.2-2.fc12.src.rpm –nomd5
          # cd `rpm –eval ‘%{_specdir}’`
          # rpmbuild -ba iptables.spec
          # cd /usr/src/redhat/RPMS/i386
          # rpm -Uvh iptables-1.4.3.2-2.i386.rpm
          # rpm -qa | grep iptables
          iptables-1.4.3.2-2

          # service iptables restart

          iptables: Applying firewall rules: FATAL: Could not load /lib/modules/2.6.18-164
          .11.1.el5.028stab068.3PAE/modules.dep: No such file or directory
          FATAL: Could not load /lib/modules/2.6.18-164.11.1.el5.028stab068.3PAE/modules.d
          ep: No such file or directory

          • Josh Sanders

            # depmod -a
            WARNING: Couldn’t open directory /lib/modules/2.6.18-164.11.1.el5.028stab068.3PAE: No such file or directory
            FATAL: Could not open /lib/modules/2.6.18-164.11.1.el5.028stab068.3PAE/modules.dep.temp for writing: No such file or directory

            Any ideas?

          • What is in /lib/modules/2.6.18-164.11.1.el5.028stab068.3PAE/ ?
            Is that the kernel release you are running?
            If not include the kernel release as an argument:

            sudo /sbin/depmod -a `uname -r`
            
  9. Julian

    Hello,

    I Tried this method and it works fine.

    Do you know if there is a way to rotate
    hostnames after –every XXX emails?

    • you can read my article about randomize outgoing mail using tcp_table and perl

  10. Martin

    Hi,

    I tried to upgrade my centos 5 iptables 1.3.5 using the following cmds but I got error as follows:

    # rpm -Uvh iptables-1.4.3.2-2.fc12.src.rpm –nomd5
    # cd `rpm –eval ‘%{_specdir}’`
    # rpmbuild -ba iptables.spec
    # cd /usr/src/redhat/RPMS/i386
    # rpm -Uvh iptables-1.4.3.2-2.i386.rpm

    Errors: error: Failed dependencies:
    iptables = 1.3.5 is needed by (installed) iptables-ipv6-1.3.5-5.3.el5_4.1.i386
    iptables = 1.3.5 is needed by (installed) iptables-devel-1.3.5-5.3.el5_4.1.i386

    Please any idea what might be wrong? My Iptables details as follows:

    rpm -qa | grep iptables
    iptables-1.3.5-5.3.el5_4.1
    iptables-ipv6-1.3.5-5.3.el5_4.1
    iptables-devel-1.3.5-5.3.el5_4.1

  11. chaeplin

    I have tested “–every n”. With same “n”, packets aren’t evenly distributed.
    N should be like N, N-1, N-2 ….

    not even and packet drop
    5 276 ACCEPT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:80 statistic mode nth every 5
    4 232 ACCEPT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:80 statistic mode nth every 5
    3 152 ACCEPT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:80 statistic mode nth every 5
    2 100 ACCEPT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:80 statistic mode nth every 5
    2 104 ACCEPT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:80 statistic mode nth every 5
    5 256 ACCEPT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:80


    evenly
    29 1608 ACCEPT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:80 statistic mode nth every 5
    29 1524 ACCEPT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:80 statistic mode nth every 4
    28 1488 ACCEPT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:80 statistic mode nth every 3
    28 1440 ACCEPT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:80 statistic mode nth every 2
    28 1460 ACCEPT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:80 statistic mode nth every 1
    0 0 ACCEPT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:80

  12. mohd

    Hi friend,

    I want to ask you is it possible to send emails from proxy ip’s and get inboxing.

  13. Gino

    Hi leenoux,

    Can you install this on my server? I need ip rotation so I can send unlimeted mails.

  14. Achal

    Your post is nice but i want ip rotation in postfix such that ip’s are rotated every hour how can i achieve this.

  15. I have 2 question and please answer me
    1-
    Is it possible to configure VPS for IPV6 for ip rotation ?
    how is it possible?
    2-is it possible assign IPV6 for vmware for VPS

    • 1. technicaly, yes. just figure out how to setup ipv6 aliasing at your VPS (lots of tutorial/howto out there).
      2. yes. i’ve been running my ipv6 on my VPS for years.

Leave a Reply

Your email address will not be published. Required fields are marked *