Firewall par pays

Voici une façon efficace de mettre en place un parefeu qui autorise les conexions selon le pays.Dans mon cas, je voulais bloquer tout ce qui ne provient pas du Canada,US,UK. Mon log de NGINX m'indiquait qu'il y avait constament des robots (Chine,Russie) qui attaquaient mon site. J'ai utilisé IPSET qui permet de créer des listes d'adresse IP pour ensuite les ajouter facilement à iptables. J'ai fait un script qui va chercher les adresses IP des 3 pays sur http://www.ipdeny.com.

1- Installation de IPset avec persistent

sudo apt update && apt install ipset iptables netfilter-persistent ipset-persistent iptables-persistent

2- Mettre le script dans un dosier quelquonque et lui donner les droits pour l'execution.

chmod u+x /home/pi/Get_IP_Country

3- Ajouter le script à crontab afin de mettre à jour les adresses IP à minuit chaque jour:

crontab -e

# Update ipset ip list
00 00 * * * /home/pi/Get_IP_Country

sudo /etc/init.d/cron restart

4- Ajouter les règles de parefeu à iptables au démarrage du raspberry pi.
( ATTENTION : Le script prend environ 90 secondes à s'executer, donc le parefeu sera inactif durant ce temps après un redémarrage)

sudo nano /etc/rc.local

# Update ipset ip list at reboot
sudo /home/pi/domoticz/scripts/Get_IP_Country &

5- Vérifier que les règles sont présentes dans iptables.

iptables -L
ipset list ca.zone | sort -n

Mon fichier iptables-export ressemble à ceci:

# Generated by iptables-save v1.4.21 on Sun Dec 18 13:36:50 2016
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [137:16992]
:LOGGING - [0:0]
-A INPUT -i lo -j ACCEPT -m comment --comment "loopback tout est permis"
-A INPUT -s 192.168.0.0/24 -j ACCEPT -m comment --comment "Reseau interne tout est permis"
-A INPUT -p udp -m udp --dport 53 -m comment --comment "Port 53 DNS" -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -m set --match-set ca.zone src -j ACCEPT -m comment --comment "Port 80 permis pour le Canada"
-A INPUT -p tcp -m tcp --dport 80 -m set --match-set us.zone src -j ACCEPT -m comment --comment "Port 80 permis pour le USA"
-A INPUT -p tcp -m tcp --dport 80 -m set --match-set uk.zone src -j ACCEPT -m comment --comment "Port 80 permis pour le UK"
-A INPUT -p tcp -m tcp --dport 443 -m set --match-set ca.zone src -j ACCEPT -m comment --comment "Port 443 HTTPS permis pour le Canada"
-A INPUT -p tcp -m tcp --dport 443 -m set --match-set us.zone src -j ACCEPT -m comment --comment "Port 443 HTTPS pour le USA"
-A INPUT -p tcp -m tcp --dport 443 -m set --match-set uk.zone src -j ACCEPT -m comment --comment "Port 443 HTTPS pour le UK"
-A INPUT -p tcp -m tcp --dport 45 -m set --match-set ca.zone src -j ACCEPT -m comment --comment "Port 45 permis pour SFTP pour le Canada"
-A INPUT -p tcp -m tcp --dport 8989 -m set --match-set ca.zone src -j ACCEPT -m comment --comment "Port 8989 permis pour HTTP pour le Canada"
-A INPUT -m state --state ESTABLISHED,RELATED -m comment --comment "Packet accepte lorsque connexion etabli" -j ACCEPT
-A INPUT -p tcp --dport 587 -j ACCEPT -m comment --comment "Gmail SMTP"
-A INPUT -p tcp --dport 465 -j ACCEPT -m comment --comment "Gmail SMTP"
-A INPUT -p all -j DROP
COMMIT
# Completed on Sun Dec 18 13:36:50 2016