Multiple uplinks - load balancing

Rokas
2004-02-06T21:52:54Z

Hello!

I have set up a LINUX router with two seperate uplinks to do load
balancing. I made all the configuration after the "NANO-HOWTO to use
more than one independent Internet connection" document. I patched my
2.4.24 kernel with patches, described in this document. My
configuration is:
---------------------------------------------------------------
#!/bin/bash
#------------------------------
LAN_IF - LAN interface
LAN_IP - LAN IP
LAN_NET - LAN network/mask
#------------------------------
INET1_IF - external interface no. 1
INET1_IP - external IP no. 1
INET1_NET - external network/mask no. 1
INET1_GW - remote gateway no. 1
#------------------------------
INET2_IF - external interface no. 2
INET2_IP - external IP no. 2
INET2_NET - external network/mask no. 2
INET2_GW - remote gateway no. 2
#------------------------------
echo "1" > /proc/sys/net/ipv4/ip_forward

/sbin/modprobe ip_conntrack_ftp
/sbin/modprobe ip_nat_ftp
/sbin/modprobe ip_conntrack_irc
/sbin/modprobe ip_nat_irc

IPTABLES=/usr/sbin/iptables

$IPTABLES -t filter -P INPUT ACCEPT
$IPTABLES -t filter -P OUTPUT ACCEPT
$IPTABLES -t filter -P FORWARD ACCEPT
$IPTABLES -t nat -P PREROUTING ACCEPT
$IPTABLES -t nat -P POSTROUTING ACCEPT
$IPTABLES -t nat -P OUTPUT ACCEPT
$IPTABLES -t mangle -P PREROUTING ACCEPT
$IPTABLES -t mangle -P INPUT ACCEPT
$IPTABLES -t mangle -P OUTPUT ACCEPT
$IPTABLES -t mangle -P FORWARD ACCEPT
$IPTABLES -t mangle -P POSTROUTING ACCEPT
$IPTABLES -t nat -F
$IPTABLES -t mangle -F
$IPTABLES -t filter -F
$IPTABLES -t filter -X keep_state
$IPTABLES -t nat -X keep_state

$IPTABLES -t filter -N keep_state
$IPTABLES -t filter -A keep_state -m state --state RELATED,ESTABLISHED -j ACCEPT
$IPTABLES -t filter -A keep_state -j RETURN
$IPTABLES -t nat -N keep_state
$IPTABLES -t nat -A keep_state -m state --state RELATED,ESTABLISHED -j ACCEPT
$IPTABLES -t nat -A keep_state -j RETURN

$IPTABLES -t nat -A PREROUTING -j keep_state
$IPTABLES -t nat -A POSTROUTING -j keep_state
$IPTABLES -t nat -A OUTPUT -j keep_state
$IPTABLES -t filter -A INPUT -j keep_state
$IPTABLES -t filter -A FORWARD -j keep_state
$IPTABLES -t filter -A OUTPUT -j keep_state

/sbin/ip rule del prio 50 table main
/sbin/ip rule add prio 50 table main
/sbin/ip route del default table main

/sbin/ip rule del prio 201 from $INET1_NET table 201
/sbin/ip rule add prio 201 from $INET1_NET table 201
/sbin/ip route add default via $INET1_GW dev $INET1_IF \
            src $INET1_IP proto static table 201
/sbin/ip route append prohibit default table 201 metric 1 proto static

/sbin/ip rule del prio 202 from $INET2_NET table 202
/sbin/ip rule add prio 202 from $INET2_NET table 202
/sbin/ip route add default via $INET2_GW dev $INET2_IF \
            src $INET2_IP proto static table 202
/sbin/ip route append prohibit default table 202 metric 1 proto static

/sbin/ip rule del prio 222 table 222
/sbin/ip rule add prio 222 table 222
/sbin/ip route add default table 222 proto static \
            nexthop via $INET1_GW dev $INET1_IF \
            nexthop via $INET2_GW dev $INET2_IF

$IPTABLES -t nat -A POSTROUTING -o $INET1_IF -s $LAN_NET -j SNAT --to-source
$INET1_IP
$IPTABLES -t nat -A POSTROUTING -o $INET2_IF -s $LAN_NET -j SNAT --to-source
$INET2_IP
---------------------------------------------------------------------------------

Load balancing works well, and everything seems to be OK.
But there is a problem: two uplinks are from different ISP''s, so they
have their own SMTP servers. I have to use only one SMTP server to
send e-mail, so I set up SMTP server of ISP1 in my e-mail client
program. But because of load balancing, SMTP traffic sometimes go
through the second line ISP2, and then the SMTP server of ISP1 refuses
to accept my message.

So I would like to "tie" SMTP traffic to ISP1 line. What rules should
I use? Perhaps I should mark all the SMTP traffic with IPTABLES MARK?

I would be very grateful for your help and suggestions...

     Rokas Zakarevicius