Configurare un Firewall con Load balancing

La configurazione di un firewall con bilanciamento di carico varia molto poco dalla classica configurazione di un firewall con un unico provider, come unica differenza avrà due o più WAN.

Iniziamo con le impostazioni di base necessarie per la maggior parte dei casi e rispettando la regola base dei firewall “chiudo tutte le porte e apro solo quelle che servono”.

La confiugurazione delle interfaccie di rete del firewall sarà ad esempio la seguente:

LAN eth0 192.168.1.2
WAN eth1 10.1.1.2 (ISP 1)
WAN eth2 172.10.10.2 (ISP 2)

Iniziamo col preparare l’ambiente per il forwarding abilitando il modulo ip_forward

sysctl -w net.ipv4.ip_forward=1

oppure

echo 1 > /proc/sys/net/ipv4/ip_forward

Per abilitarlo permanentemente aggiungiamo (o decommentiamo) nel file /etc/sysctl.conf la riga

net.ipv4.ip_forward = 1

iptables -F
iptables -X
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
# INPUT
iptables -A INPUT -m state --state INVALID -j DROP
iptables -A INPUT -p tcp -m tcp --tcp-flags RST RST -m limit --limit 2/second --limit-burst 2 -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m recent --set --name SshBrute --rsource
iptables -A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 4 --name SshBrute --rsource -j DROP
iptables -A INPUT -i eth0 -p tcp -d 192.168.1.2 --dport 22 -j ACCEPT
iptables -A INPUT -j LOG --log-level 7 --log-prefix "--DROP_INPUT-- "
iptables -A INPUT -m limit --limit 3/min --limit-burst 3 -j LOG --log-prefix "--DROP_INPUT-- "
iptables -A INPUT -j DROP
# FORWARD
iptables -A FORWARD -m state --state INVALID -j DROP
iptables -A FORWARD -i eth0 -o eth2 -p tcp -m state --state NEW -m multiport --dports 20,21,80,443 -j ACCEPT
iptables -A FORWARD -i eth0 -o eth1 -p tcp -m state --state NEW -m multiport --dport 53,123 -j ACCEPT
iptables -A FORWARD -i eth0 -o eth1-p udp -m state --state NEW -m multiport --dport 53,123 -j ACCEPT
iptables -A FORWARD -s 127.0.0.1 -p tcp -m state --state NEW -m multiport --dport 53,123 -j ACCEPT
iptables -A FORWARD -s 127.0.0.1 -p udp -m state --state NEW -m multiport --dport 53,123 -j ACCEPT
iptables -A FORWARD -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -p tcp -j REJECT --reject-with tcp-reset
iptables -A FORWARD -j LOG --log-level 7 --log-prefix "--DROP_FORWARD-- "
iptables -A FORWARD -j DROP
# OUTPUT
iptables -A OUTPUT -s 127.0.0.1 -o lo -j ACCEPT
iptables -A OUTPUT -p udp -d 8.8.8.8 --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp -d 1.1.1.1 --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -m limit --limit 3/min --limit-burst 3 -j LOG --log-prefix "--DROP_OUTPUT-- "
iptables -A OUTPUT -j LOG --log-level 7 --log-prefix "--DROP_OUTPUT-- "
iptables -A OUTPUT -j DROP
# NAT
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth1 -j SNAT --to-source 10.1.1.2
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth2 -j SNAT --to-source 172.10.10.2

Le righe in corsivo sono le varianti che bisogna aggiungere per gestire il secondo uplinks. Questa parte di configurazione si limita a consentire l’accesso a internet, porta 80 e 443, e all’uso dell’ftp porta 20,21 ma non instrada verso un provider o l’altro. Per forzare i pacchetti ad uscire da una WAN piuttosto che dall’altra dobbiamo ricorrere alla tabella “mangle” usata per cambiare il TOS dei pacchetti.

iptables -t mangle -A PREROUTING -i eth0 -s 192.168.1.164 -j MARK --set-xmark 1
iptables -t mangle -A PREROUTING -i lo -p tcp -m tcp --dport 80 -j MARK --set-xmark 2
iptables -t mangle -A PREROUTING -i eth0 -p tcp -m tcp --dport 80 -j MARK --set-xmark 1
iptables -t mangle -A PREROUTING -i eth0 -p tcp -m tcp --dport 20 -j MARK --set-xmark 1
iptables -t mangle-A PREROUTING -i eth0 -p tcp -m tcp --dport 21 -j MARK --set-xmark 1

Con queste righe ad esempio forzo il traffico di un host della LAN, il 192.168.1.164 ad usare l’ISP 1 marcando i pacchetti con –set-xmark 1, tutta la navigazione del firewall verso l’ISP 2 e nuovamente l’uso del servizio FTP viene indirizzato verso l’ISP 1.

Lo splitting dei pacchetti è possibile solo se in precedenza ho identificato i due uplinks col marker 1 e 2 come spiegato nell’aticolo “Routing tra due uplinks/providers e Load balancing”.