multiple ISP routing/firewall

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



hi all,
i am in a not so common situation and i have tried to figure out the solution without luck. i have 3 leased lines from three different vendors. i want to distribute outbound traffic from my lan on these three differnet links. i have some degree of success i.e. i can route the traffic but internet access speed is very slow. i guess that this is due to differnet DNS servers of these vendors. moreover if i have the unristricted access to internet, i am fine. but not with the restrictions on services and ports. after this all internet access is denied. This is my firewalling script for ur debugging and any remedial measures.

#!/bin/sh               
# Iptables userspace executable
IPTABLES="/usr/local/sbin/iptables"

# Internal Interface
NET_INT_INT=eth0
# Internal IP
NET_INT_IP=a.b.c.201
# Internal Subnet
NET_INT_SUB=24
# Internal Network
NET_INT_NET=a.b.c.0

# First external interface
NET_EXT_INT1=eth1
# First external IP
NET_EXT_IP1=a.b.c.201
# First external interface's gateway
NET_EXT_GW1=a.b.c.1

# Second external interface
NET_EXT_INT2=eth2
# Second external IP
NET_EXT_IP2=a.b.c.201
# Second external interface's gateway
NET_EXT_GW2=a.b.c.1

# Third external interface
NET_EXT_INT3=eth3
# Third external IP
NET_EXT_IP3=a.b.c.201
# Third external interface's gateway
NET_EXT_GW3=a.b.c.1

echo "Flushing All Tables"
$IPTABLES -F
$IPTABLES -F -t nat
$IPTABLES -F -t mangle
$IPTABLES -X -t nat
$IPTABLES -X -t mangle
$IPTABLES -X

$IPTABLES -t mangle -N ETH1
$IPTABLES -t mangle -F ETH1
$IPTABLES -t mangle -A ETH1 -j MARK --set-mark 1

$IPTABLES -t mangle -N ETH2
$IPTABLES -t mangle -F ETH2
$IPTABLES -t mangle -A ETH2 -j MARK --set-mark 2

$IPTABLES -t mangle -N ETH3
$IPTABLES -t mangle -F ETH3
$IPTABLES -t mangle -A ETH3 -j MARK --set-mark 3

$IPTABLES -t nat -N SPOOF_ETH1
$IPTABLES -t nat -F SPOOF_ETH1
$IPTABLES -t nat -A SPOOF_ETH1 -j SNAT --to ${NET_EXT_IP1}

$IPTABLES -t nat -N SPOOF_ETH2
$IPTABLES -t nat -F SPOOF_ETH2
$IPTABLES -t nat -A SPOOF_ETH2 -j SNAT --to ${NET_EXT_IP2}

$IPTABLES -t nat -N SPOOF_ETH3
$IPTABLES -t nat -F SPOOF_ETH3
$IPTABLES -t nat -A SPOOF_ETH3 -j SNAT --to ${NET_EXT_IP3}

echo "Setting some local network rules..."
$IPTABLES -A INPUT -p icmp -s ${NET_INT_NET}/${NET_INT_SUB} -d ${NET_INT_IP} -j ACCEPT

echo "Setting Mangle rules for eth1..."
$IPTABLES -t mangle -A OUTPUT -o ! ${NET_INT_INT} -m random --average 40 -j ETH1
$IPTABLES -t mangle -A PREROUTING -i ${NET_INT_INT} -m random --average 40 -j ETH1
ip ro add table 10 default via ${NET_EXT_GW1} dev ${NET_EXT_INT1}
ip ru add fwmark 1 table 10
ip ro fl ca

echo "Setting Mangle rules for eth2..."
$IPTABLES -t mangle -A OUTPUT -o ! ${NET_INT_INT} -m random --average 40 -j ETH2
$IPTABLES -t mangle -A PREROUTING -i ${NET_INT_INT} -m random --average 40 -j ETH2
ip ro add table 20 default via ${NET_EXT_GW2} dev ${NET_EXT_INT2}
ip ru add fwmark 2 table 20
ip ro fl ca

echo "Setting Mangle rules for eth3..."
$IPTABLES -t mangle -A OUTPUT -o ! ${NET_INT_INT} -m random --average 20 -j ETH3
$IPTABLES -t mangle -A PREROUTING -i ${NET_INT_INT} -m random --average 20 -j ETH3
ip ro add table 30 default via ${NET_EXT_GW3} dev ${NET_EXT_INT3}
ip ru add fwmark 3 table 30
ip ro fl ca

echo "Accept pre established connections....."
$IPTABLES -A INPUT   -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT  -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

echo "Accept everything on local loopback....."
$IPTABLES -A INPUT  -i lo  -j ACCEPT 
$IPTABLES -A OUTPUT  -o lo  -j ACCEPT 

echo "Setting up Internet Access rules for services allowed......"
$IPTABLES -N RULE_0
$IPTABLES -A INPUT -p icmp  -s w.x.y.z/a  --icmp-type 11/0   -m state --state NEW  -j RULE_0 
$IPTABLES -A INPUT -p icmp  -s w.x.y.z/a  --icmp-type 11/1   -m state --state NEW  -j RULE_0 
$IPTABLES -A INPUT -p icmp  -s w.x.y.z/a  --icmp-type 0/0   -m state --state NEW  -j RULE_0 
$IPTABLES -A INPUT -p icmp  -s w.x.y.z/a  --icmp-type 3  -m state --state NEW  -j RULE_0 
$IPTABLES -A INPUT -p tcp  -s w.x.y.z/a  --source-port 20  --destination-port 1024:65535  -m state --state NEW  -j RULE_0 
$IPTABLES -A INPUT -p tcp  -m multiport  -s w.x.y.z/a  --destination-port 21,20,80,443  -m state --state NEW  -j RULE_0 
$IPTABLES -A OUTPUT -p icmp  -s w.x.y.z/a  --icmp-type 11/0   -m state --state NEW  -j RULE_0 
$IPTABLES -A OUTPUT -p icmp  -s w.x.y.z/a  --icmp-type 11/1   -m state --state NEW  -j RULE_0 
$IPTABLES -A OUTPUT -p icmp  -s w.x.y.z/a  --icmp-type 0/0   -m state --state NEW  -j RULE_0 
$IPTABLES -A OUTPUT -p icmp  -s w.x.y.z/a  --icmp-type 3  -m state --state NEW  -j RULE_0 
$IPTABLES -A OUTPUT -p tcp  -s w.x.y.z/a  --source-port 20  --destination-port 1024:65535  -m state --state NEW  -j RULE_0 
$IPTABLES -A OUTPUT -p tcp  -m multiport  -s w.x.y.z/a  --destination-port 21,20,80,443  -m state --state NEW  -j RULE_0 
$IPTABLES -A FORWARD -p icmp  -s w.x.y.z/a  --icmp-type 11/0   -m state --state NEW  -j RULE_0 
$IPTABLES -A FORWARD -p icmp  -s w.x.y.z/a  --icmp-type 11/1   -m state --state NEW  -j RULE_0 
$IPTABLES -A FORWARD -p icmp  -s w.x.y.z/a  --icmp-type 0/0   -m state --state NEW  -j RULE_0 
$IPTABLES -A FORWARD -p icmp  -s w.x.y.z/a  --icmp-type 3  -m state --state NEW  -j RULE_0 
$IPTABLES -A FORWARD -p tcp  -s w.x.y.z/a  --source-port 20  --destination-port 1024:65535  -m state --state NEW  -j RULE_0 
$IPTABLES -A FORWARD -p tcp  -m multiport  -s w.x.y.z/a  --destination-port 21,20,80,443  -m state --state NEW  -j RULE_0 
$IPTABLES -A RULE_0  -j LOG  --log-level info --log-prefix "RULE 0 -- ACCEPT " 
$IPTABLES -A RULE_0  -j ACCEPT 

echo "Setting up Internet Access rules for services denied......"
$IPTABLES -N RULE_1
$IPTABLES -A INPUT -p tcp  -s w.x.y.z/a  --syn   -j RULE_1 
$IPTABLES -A INPUT -p tcp  -s w.x.y.z/a  --tcp-flags ALL URG,ACK,PSH,RST,SYN,FIN  -j RULE_1 
$IPTABLES -A INPUT -p tcp  -s w.x.y.z/a  --destination-port 1024:65535  -j RULE_1 
$IPTABLES -A INPUT -p tcp  -s w.x.y.z/a  --destination-port 6000:6063  -j RULE_1 
$IPTABLES -A INPUT -p tcp  -m multiport  -s w.x.y.z/a  --destination-port 5190,1494,709,710,1720,3268,3269,2000,5631,7070,2998,445,49,42,113  -j RULE_1 
$IPTABLES -A INPUT -p tcp  -m multiport  -s w.x.y.z/a  --destination-port 13,53,2105,79,143,6667,993,88,543,544,389,636,98,515,98  -j RULE_1 
$IPTABLES -A INPUT -p tcp  -m multiport  -s w.x.y.z/a  --destination-port 135,3306,1433,2049,139,119,563,110,995,5432,26000,515,512,513,514  -j RULE_1 
$IPTABLES -A INPUT -p tcp  -m multiport  -s w.x.y.z/a  --destination-port 4321,554,25,5510,465,1080,1521,3128,22,111,23,540,3389,7100  -j RULE_1 
$IPTABLES -A OUTPUT -p tcp  -s w.x.y.z/a  --syn   -j RULE_1 
$IPTABLES -A OUTPUT -p tcp  -s w.x.y.z/a  --tcp-flags ALL URG,ACK,PSH,RST,SYN,FIN  -j RULE_1 
$IPTABLES -A OUTPUT -p tcp  -s w.x.y.z/a  --destination-port 1024:65535  -j RULE_1 
$IPTABLES -A OUTPUT -p tcp  -s w.x.y.z/a  --destination-port 6000:6063  -j RULE_1 
$IPTABLES -A OUTPUT -p tcp  -m multiport  -s w.x.y.z/a  --destination-port 5190,1494,709,710,1720,3268,3269,2000,5631,7070,2998,445,49,42,113  -j RULE_1 
$IPTABLES -A OUTPUT -p tcp  -m multiport  -s w.x.y.z/a  --destination-port 13,53,2105,79,143,6667,993,88,543,544,389,636,98,515,98  -j RULE_1 
$IPTABLES -A OUTPUT -p tcp  -m multiport  -s w.x.y.z/a  --destination-port 135,3306,1433,2049,139,119,563,110,995,5432,26000,515,512,513,514  -j RULE_1 
$IPTABLES -A OUTPUT -p tcp  -m multiport  -s w.x.y.z/a  --destination-port 4321,554,25,5510,465,1080,1521,3128,22,111,23,540,3389,7100  -j RULE_1 
$IPTABLES -A FORWARD -p tcp  -s w.x.y.z/a  --syn   -j RULE_1 
$IPTABLES -A FORWARD -p tcp  -s w.x.y.z/a  --tcp-flags ALL URG,ACK,PSH,RST,SYN,FIN  -j RULE_1 
$IPTABLES -A FORWARD -p tcp  -s w.x.y.z/a  --destination-port 1024:65535  -j RULE_1 
$IPTABLES -A FORWARD -p tcp  -s w.x.y.z/a  --destination-port 6000:6063  -j RULE_1 
$IPTABLES -A FORWARD -p tcp  -m multiport  -s w.x.y.z/a  --destination-port 5190,1494,709,710,1720,3268,3269,2000,5631,7070,2998,445,49,42,113  -j RULE_1 
$IPTABLES -A FORWARD -p tcp  -m multiport  -s w.x.y.z/a  --destination-port 13,53,2105,79,143,6667,993,88,543,544,389,636,98,515,98  -j RULE_1 
$IPTABLES -A FORWARD -p tcp  -m multiport  -s w.x.y.z/a  --destination-port 135,3306,1433,2049,139,119,563,110,995,5432,26000,515,512,513,514  -j RULE_1 
$IPTABLES -A FORWARD -p tcp  -m multiport  -s w.x.y.z/a  --destination-port 4321,554,25,5510,465,1080,1521,3128,22,111,23,540,3389,7100  -j RULE_1 
$IPTABLES -A RULE_1  -j LOG  --log-level info --log-prefix "RULE 1 -- DENY " 
$IPTABLES -A RULE_1  -j DROP 

echo "Setting up internet access from firewall....."
$IPTABLES -N RULE_2
$IPTABLES -A OUTPUT  -s ${NET_INT_IP}  -m state --state NEW  -j RULE_2 
$IPTABLES -A OUTPUT  -s ${NET_EXT_IP1}  -m state --state NEW  -j RULE_2 
$IPTABLES -A OUTPUT  -s ${NET_EXT_IP2}  -m state --state NEW  -j RULE_2 
$IPTABLES -A OUTPUT  -s ${NET_EXT_IP3}  -m state --state NEW  -j RULE_2 
$IPTABLES -A RULE_2  -j LOG  --log-level info --log-prefix "RULE 2 -- ACCEPT " 
$IPTABLES -A RULE_2  -j ACCEPT 

echo "Setting up catch all rules......"
$IPTABLES -N RULE_4
$IPTABLES -A OUTPUT  -j RULE_4 
$IPTABLES -A INPUT  -j RULE_4 
$IPTABLES -A FORWARD  -j RULE_4 
$IPTABLES -A RULE_4  -j LOG  --log-level info --log-prefix "RULE 4 -- DENY " 
$IPTABLES -A RULE_4  -j DROP 


echo "Setting up spoofing rules..."
$IPTABLES -t nat -A POSTROUTING -o ${NET_EXT_INT1} -j SPOOF_ETH1
$IPTABLES -t nat -A POSTROUTING -o ${NET_EXT_INT2} -j SPOOF_ETH2
$IPTABLES -t nat -A POSTROUTING -o ${NET_EXT_INT3} -j SPOOF_ETH3

echo "Adding default route..."
ip ro add default nexthop via ${NET_EXT_GW1} dev ${NET_EXT_INT1} weight 1 nexthop via ${NET_EXT_GW2} dev ${NET_EXT_INT2} weight 1 nexthop via ${NET_EXT_GW3} dev ${NET_EXT_INT3} weight 1

echo "Disabling Reverse Path Filtering..."
echo 0> /proc/sys/net/ipv4/conf/eth1/rp_filter
echo 0> /proc/sys/net/ipv4/conf/eth2/rp_filter
echo 0> /proc/sys/net/ipv4/conf/eth3/rp_filter

echo "Enabling IPv4 Packet forwarding..."
echo "1"> /proc/sys/net/ipv4/ip_forward



[Index of Archives]     [Linux Netfilter Development]     [Linux Kernel Networking Development]     [Netem]     [Berkeley Packet Filter]     [Linux Kernel Development]     [Advanced Routing & Traffice Control]     [Bugtraq]

  Powered by Linux