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”.