web-dev-qa-db-fra.com

Bloquer la Chine avec iptables

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

Est-il possible de bloquer TOUTE la Chine ou tout autre pays avec iptables?

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

Des idées ? Je vous remercie!

9

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

...
$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 (au cours des deux dernières années) avec la Chine est qu’elles sont devenues très intelligentes et très souvent, une fois bloquées d’une adresse IP, elles basculent simplement vers une autre sur le même sous-réseau et continuent. Cela risque de manquer des entrées de table récentes par défaut (je pense que la valeur par défaut est 200). Je surveille cela, puis je cherche le segment IP actuel et bloque de manière permanente tout le segment. Dans mon cas, je me moque des dommages collatéraux, c’est-à-dire bloquer une personne innocente:

#
# 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 de la Chine ou de n’importe quel pays au format iptables ou autre, au format 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.

7
Doug Smythies

Bloc Chine utilisant ipset

Vous ne pouvez pas ajouter manuellement quelques milliers d'adresses IP à votre iptables, et même le faire automatiquement est une mauvaise idée car cela peut entraîner une charge de processeur importante (ou du moins je l'ai lue). Au lieu de cela, nous pouvons utiliser ipset qui est conçu pour ce genre de chose. ipset gère de grandes listes d'adresses IP; il vous suffit de créer une liste, puis de dire à iptables d'utiliser cette liste dans une règle.

Remarque; Je suppose que tout ce qui suit est 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, ce que vous devriez pouvoir comprendre à partir des commentaires qu'il contient. Créer un fichier:

nano /etc/block-china.sh

Voici ce que vous voulez 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 cela se fera dans une minute lorsque nous exécuterons le script. Premièrement, nous devons ajouter dans iptables une règle faisant 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, mes règles complètes iptables.firewall.rules ressemblent 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

À l'heure actuelle, 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 certaine sortie car il tire une nouvelle liste d’adresses IP basées en chinois, puis, après quelques secondes à peu près, il se termine et vous renvoie à une invite de commande.

Pour tester si cela a fonctionné, lancez:

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 à travailler sur les redémarrages. Cependant, les adresses IP changent et cette liste deviendra obsolète au fil du temps. Si vous souhaitez extraire et appliquer une liste mise à jour d'adresses IP, vous pouvez simplement exécuter le script block-china.sh.

Nous pouvons également configurer la machine pour qu'elle le fasse automatiquement via un travail cron:

crontab -e

Ajouter une ligne comme celle-ci:

* 5 * * * /etc/block-china.sh

Ceci exécutera /etc/block-china.sh à 5h tous les jours. L'utilisateur qui exécute le script doit être root ou posséder des privilèges root.

source

9
Surjit Sidhu

Vous voudrez peut-être installer quelque chose comme fail2ban pour bloquer les ips qui tentent de se connecter à votre serveur et échouent.

4
Kyle H

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 à partir du site site officiel du projet xtables-addons en utilisant wget. Une fois téléchargé, nous extrairons l'archive, puis nous la compilerons et l'installerons sur 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 allons exécuter un module appelé xt_geoip, fourni 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 téléchargé, nous le construirons et les déplacerons vers le chemin requis xt_geoip, à savoir /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, US 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...]
0
Markus Lenger