Bloc de Chine à l'aide de l'ipset
Vous ne pouvez pas ajouter manuellement quelques milliers d'adresses IP à vos iptables, et même le faire automatiquement est une mauvaise idée car cela peut causer beaucoup de charge CPU (ou j'ai lu). Au lieu de cela, nous pouvons utiliser un ipset qui est conçu pour ce genre de chose. l'ipset gère de grandes listes d'adresses IP; vous créez simplement une liste, puis vous dites à iptables d'utiliser cette liste dans une règle.
Remarque; Je suppose que l'intégralité de ce qui suit se fait en tant que root. Ajustez en conséquence si votre système est basé sur sudo.
apt-get install ipset
Ensuite, j'ai écrit un petit script Bash pour faire tout le travail, que vous devriez pouvoir comprendre à partir des commentaires qu'il contient. Créez un fichier:
nano /etc/block-china.sh
Voici ce que vous souhaitez y coller:
# Create the ipset list
ipset -N china hash:net
# remove any old list that might exist from previous runs of this script
rm cn.zone
# Pull the latest IP set for China
wget -P . http://www.ipdeny.com/ipblocks/data/countries/cn.zone
# Add each IP address from the downloaded list into the ipset 'china'
for i in $(cat /etc/cn.zone ); do ipset -A china $i; done
# Restore iptables
/sbin/iptables-restore < /etc/iptables.firewall.rules
Enregistrez le fichier. Rendez-le exécutable:
chmod +x /etc/block-china.sh
Cela n'a encore rien fait, mais ce sera dans une minute lorsque nous exécuterons le script. Tout d'abord, nous devons ajouter une règle dans iptables qui fait référence à cette nouvelle liste d'ipsets définie par le script ci-dessus:
nano /etc/iptables.firewall.rules
Ajoutez la ligne suivante:
-A INPUT -p tcp -m set --match-set china src -j DROP
Enregistrez le fichier. Pour être clair, mon iptables.firewall.rules complet ressemble maintenant à ceci:
*filter
# Allow all loopback (lo0) traffic and drop all traffic to 127/8 that doesn't use lo0
-A INPUT -i lo -j ACCEPT
-A INPUT -d 127.0.0.0/8 -j REJECT
# Accept all established inbound connections
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Block anything from China
# These rules are pulled from ipset's china list
# The source file is at /etc/cn.zone (which in turn is generated by a shell script at /etc/block-china.sh )
-A INPUT -p tcp -m set --match-set china src -j DROP
# Allow all outbound traffic - you can modify this to only allow certain traffic
-A OUTPUT -j ACCEPT
# Allow HTTP and HTTPS connections from anywhere (the normal ports for websites and SSL).
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT
# Allow SSH connections
#
# The -dport number should be the same port number you set in sshd_config
#
-A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT
# Allow ping
-A INPUT -p icmp -j ACCEPT
# Log iptables denied calls
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
# Drop all other inbound - default deny unless explicitly allowed policy
-A INPUT -j DROP
-A FORWARD -j DROP
COMMIT
Pour l'instant, rien n'a changé avec le serveur car aucune nouvelle règle n'a été appliquée; pour ce faire, exécutez le script block-china.sh:
/etc/block-china.sh
Cela devrait montrer une sortie car il tire une nouvelle liste d'adresses IP chinoises, puis, après quelques secondes environ, il se terminera et vous ramènera à une invite de commandes.
Pour tester si cela a fonctionné, exécutez:
iptables -L
Vous devriez maintenant voir une nouvelle règle bloquant la Chine - la sortie devrait ressembler à ceci:
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere
REJECT all -- anywhere loopback/8 reject-with icmp-port-unreachable
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
DROP tcp -- anywhere anywhere match-set china src
ACCEPT tcp -- anywhere anywhere tcp dpt:http
ACCEPT tcp -- anywhere anywhere tcp dpt:https
ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh
ACCEPT icmp -- anywhere anywhere
LOG all -- anywhere anywhere limit: avg 5/min burst 5 LOG level debug prefix "iptables denied: "
DROP all -- anywhere anywhere
Chain FORWARD (policy ACCEPT)
target prot opt source destination
DROP all -- anywhere anywhere
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere
Presque fini! Cela fonctionne et continuera de fonctionner sur les redémarrages. Mais, les adresses IP changent et cette liste deviendra obsolète au fil du temps. Si vous souhaitez extraire et appliquer une liste d'adresses IP mise à jour, vous pouvez simplement réexécuter le script block-china.sh.
Nous pouvons également configurer la machine pour qu'elle le fasse automatiquement via une tâche cron:
crontab -e
Ajoutez une ligne comme celle-ci:
* 5 * * * /etc/block-china.sh
Cela fonctionnera /etc/block-china.sh à 5h du matin tous les jours. L'utilisateur exécutant le script devra être root ou disposer des privilèges root.
la source