Bloquer la Chine avec iptables

10

Je viens de me connecter sur un serveur GitLab et j'ai remarqué qu'il y avait 18,974 échecs de connexion depuis la dernière vérification du serveur - près de 5 jours. J'ai vérifié les Ip et il semble que la plupart d'entre eux venaient de Chine et ont essayé d'accéder avec SSH et Brute Force. J'ai commencé à bloquer certains IP mais j'ai réalisé que c'était une énorme perte de temps et une meilleure idée serait de bloquer tout le pays.

Existe-t-il un moyen de bloquer TOUTE la Chine ou tout autre pays avec iptables?

J'ai trouvé quelques articles sur Internet mais presque tous sont des scripts bash. Je suis un débutant sous Linux, donc je ne comprends pas vraiment tous ces scripts. Je trouve iptables vraiment intéressant et je veux en savoir plus.

Des idées ? Je vous remercie!

Caranfil Alegzandru
la source
4
J'ai résolu le même problème d'une manière différente. J'ai renforcé SSH sur le serveur GitLab de mon client en désactivant l'authentification par mot de passe et par défi et en autorisant uniquement la connexion avec des clés SSL. Peut-être que cela fonctionnerait dans votre situation? Le blocage des plages IP peut réduire le «bruit», mais il ne vous donnera pas une réelle protection contre le forçage brutal.
blendenzo
jusqu'à présent, cela n'a pas fonctionné. le serveur gitlab est toujours en fonction et j'ai eu 0 effraction. Les accès Ssh se font uniquement avec les clés ssh et j'ai désactivé la connexion root. C'est juste que je veux apprendre les iptables si mal ..
Caranfil Alegzandru
1
Vous pouvez également basculer votre ssh vers un port autre que celui par défaut de votre routeur. Cela a fait chuter mes tentatives d'attaque par bot ssh de centaines par jour à zéro.
Organic Marble

Réponses:

7

Utiliser iptables pour identifier automatiquement, puis bloquer, les méchants pour ssh peut être fait en utilisant le recentmodule. Le segment suivant doit venir après votre ESTABLISHED,RELATEDligne générique :

...
$IPTABLES -A INPUT -i $EXTIF -s $UNIVERSE -d $EXTIP -m state --state ESTABLISHED,RELATED -j ACCEPT
...
# Secure Shell on port 22.
#
# Sometimes I uncomment the next line to simply disable external SSH access.
# Particulalry useful when I am rebooting often, thereby losing my current BADGUY table.
# $IPTABLES -A INPUT -i $EXTIF -m state --state NEW -p tcp -s $UNIVERSE -d $EXTIP --dport 22 -j DROP

# Dynamic Badguy List. Detect and DROP Bad IPs that do password attacks on SSH.
# Once they are on the BADGUY list then DROP all packets from them.
# Sometimes make the lock time very long. Typically to try to get rid of coordinated attacks from China.
$IPTABLES -A INPUT -i $EXTIF -m recent --update --hitcount 3 --seconds 90000 --name BADGUY_SSH -j LOG --log-prefix "SSH BAD:" --log-level info
$IPTABLES -A INPUT -i $EXTIF -m recent --update --hitcount 3 --seconds 90000 --name BADGUY_SSH -j DROP
$IPTABLES -A INPUT -i $EXTIF -p tcp -m tcp --dport 22 -m recent --set --name BADGUY_SSH -j ACCEPT

Maintenant, le problème récent (l'année dernière ou deux) avec la Chine est qu'ils sont devenus très intelligents et très souvent une fois bloqués d'une adresse IP, ils passent simplement à une autre sur le même sous-réseau et continuent. Cela court le risque de manquer d'entrées de table récentes par défaut (je pense que la valeur par défaut est 200). Je surveille cela, puis recherche le segment IP réel et bloque définitivement le segment entier. Dans mon cas, je ne me soucie pas des dommages collatéraux, c'est-à-dire de bloquer quelqu'un d'innocent:

#
# After a coordinated attack involving several sub-nets from China, they are now banned forever.
# List includes sub-nets from unknown origin, and perhaps Hong Kong
#
$IPTABLES -A INPUT -i $EXTIF -s 1.80.0.0/12 -d $UNIVERSE -j DROP
$IPTABLES -A INPUT -i $EXTIF -s 27.148.0.0/14 -d $UNIVERSE -j DROP
$IPTABLES -A INPUT -i $EXTIF -s 27.152.0.0/13 -d $UNIVERSE -j DROP
$IPTABLES -A INPUT -i $EXTIF -s 43.229.0.0/16 -d $UNIVERSE -j DROP
$IPTABLES -A INPUT -i $EXTIF -s 43.255.0.0/16 -d $UNIVERSE -j DROP
...

Où dans ce qui précède:

# The location of the iptables program
#
IPTABLES=/sbin/iptables

#Setting the EXTERNAL and INTERNAL interfaces and addresses for the network
#
EXTIF="enp4s0"
INTIF="enp2s0"
EXTIP="...deleted..."
INTNET="192.168.111.0/24"
INTIP="192.168.111.1/32"
UNIVERSE="0.0.0.0/0"

Vous pouvez obtenir la liste complète des adresses IP pour la Chine ou tout autre pays, au format iptables ou autre, ici . Cependant, la liste est à la fois étonnamment longue et plutôt dynamique. Moi-même, j'ai décidé de ne pas bloquer toute la liste.

Doug Smythies
la source
Ce ^! Cela pourrait être la meilleure réponse que j'aie jamais reçue. Ce pourrait être une question stupide, mais je suppose que toutes ces règles entrent dans un script bash, non? J'ai encore quelques problèmes pour comprendre iptables mais je trouve ça fascinant.
Caranfil Alegzandru
Oui, j'utilise un script bash. Certains, et moi aussi, utilisent une méthode de restauration directe iptables, qui est plus rapide à charger. J'ai changé parce que j'inclus certaines commandes non iptables dans le même script.
Doug Smythies
12

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

Surjit Sidhu
la source
Pourquoi le limiter au seul protocole TCP? Il semble fonctionner sans spécifier de protocole. Suggérez d'utiliser les nouvelles listes agrégées, car elles sont beaucoup plus courtes:wget http://www.ipdeny.com/ipblocks/data/aggregated/cn-aggregated.zone
Doug Smythies
Il n'y a rien ici qui restaure l'ipset après le redémarrage.
Doug Smythies
4

Vous voudrez peut-être installer quelque chose comme fail2ban afin qu'il bloque les IPS qui tentent de se connecter à votre serveur et échouent.

Kyle H
la source
je pourrais également utiliser le pare-feu csf et bloquer tous les pays que je veux à partir des fichiers de configuration. Le truc, c'est que je veux vraiment utiliser iptables pour pouvoir en savoir plus.
Caranfil Alegzandru
Vous devriez voir quels pays ont quels blocs d'adresses IP leur sont attribués pour savoir qui bloquer. Je ne sais pas si ce serait super précis ou non. Vous pouvez utiliser iptables -L pour afficher les règles actuelles d'iptables, iptables-save pour montrer quelles commandes ont été exécutées pour créer lesdites règles, puis concevoir vos propres règles et tester à l'aide de machines de test pour en savoir plus. C'est ainsi que je l'ai appris.
Kyle H
0

Vous pouvez utiliser le module geoip pour iptables: https://linoxide.com/linux-how-to/block-ips-countries-geoip-addons/

Une fois notre système mis à niveau et les dépendances installées, nous allons maintenant installer les addons xtables dans notre machine. Pour ce faire, nous téléchargerons la dernière archive tar du site officiel du projet xtables-addons en utilisant wget. Une fois qu'il est téléchargé, nous allons extraire l'archive tar, puis le compiler et l'installer dans notre machine.

wget http://downloads.sourceforge.net/project/xtables-addons/Xtables-addons/xtables-addons-2.13.tar.xz
tar xf xtables-addons-2.13.tar.xz
cd xtables-addons-2.13
./configure
make
make install [...]

Ensuite, nous exécuterons un module appelé xt_geoip qui est livré avec l'extension xtables-addons qui télécharge la base de données GeoIP de MaxMind et la convertit en une forme binaire reconnue par xt_geoip. Une fois qu'il est téléchargé, nous le construisons et les déplaçons vers le xt_geoipchemin requis , c'est-à-dire /usr/share/xt_geoip.

cd geoip
./xt_geoip_dl
./xt_geoip_build GeoIPCountryWhois.csv
mkdir -p /usr/share/xt_geoip/
cp -r {BE,LE} /usr/share/xt_geoip/

Voici la syntaxe de base pour utiliser iptables avec le module geoip afin de bloquer le trafic en provenance ou à destination d'un pays. Ici, nous devons utiliser le code ISO3166 à deux lettres à la place du pays, par exemple, États-Unis pour les États-Unis, IE pour l'Irlande, IN pour l'Inde, CN pour la Chine, etc.

iptables -m geoip --src-cc country[,country...] --dst-cc country[,country...]
Markus Lenger
la source
0

Vous utilisez la liste de pare-feu IP2Location pour générer des iptables pour la Chine.

Le fichier est au format suivant. Exécutez-le dans le shell et vous devriez bloquer toutes les adresses IP chinoises.

iptables -A INPUT -s 8.8.8.8/24 -j DROP
Michael C.
la source