Site icon WolwX.net

Bloquer les connexions par pays, IpTables avec GeoIP

Classique de l’administration système et de la sécurité d’un serveur dédié, voici comment utiliser la fonction GeoIP avec notre pare-feu natif à Linux, IpTables 😀

Je vais vous décrire comment bloquer tout le trafic, que ce soit des connexions SSH, des pings, des connexions à vos sites web, ou autre, provenant d’un pays, ou de plusieurs.

Ceci ne vous permettra pas de combler d’éventuelles failles, mais sera pratique pour énormément diminuer l’exposition de votre serveur dédié aux problèmes de hacks provenant de certains pays.

En effet, peu d’entre nous ont réellement besoin que nos services, web ou autre, soit disponible hors de la France, ou dans des pays tel que la Chine, la Russie, l’Algérie, ou autre …
L’exemple de ces pays est très simple, une grosse majorité des tentatives de piratages provenant d’ip hébergées sur leur territoire.

Celà peut ce constater aussi sur vos hébergements web, par exemple sur WordPress, avec un plugin tel que Wordfence, on constate facilement des dizaines et des dizaines de tentatives de login bizarre, ou de brute-force …

Donc voyons voir comment coupler un module “GeoIP” avec IpTables, le parefeu natif à linux.

1> Installation et pré-réglages

Dans un premier temps, il est nécessaire d’installer les prérequis :

La méthode simple avec dkms qui ce charge de compiler l’ensemble

# apt-get install dkms
# apt-get install libtext-csv-xs-perl
# apt-get install xtables-addons-common xtables-addons-dkms geoip-database libgeoip1 unzip
[output]

On vérifie que l’addons est bien installé

# dkms status xtables-addons
xtables-addons, 1.42, 3.2.0-4-amd64, x86_64: installed
xtables-addons, 1.42, 3.2.0-4-rt-amd64, x86_64: installed

La seconde méthode, si vous rencontrez des problèmes avec dkms, procéder à la compilation autrement

# apt-get install xtables-addons-common xtables-addons-source dkms libtext-csv-xs-perl geoip-database libgeoip1 unzip

 

Si vous rencontrez une erreur lors de la compilation :

Il vous faudra impérativement changer le kernel, merci OVH …

Voici un petit article vous expliquant la démarche =>
http://www.wolwx.net/changer-de-kernel-serveur-ovh-soyoustart-kimsufi/

 

Après avoir installé l’addons, il vous faut télécharger le script de récupération GeoIP en la plaçant dans notre répertoire de fonctionnement :

# mkdir /usr/share/xt_geoip; cd /usr/share/xt_geoip; wget http://www.wolwx.net/wp-content/uploads/2015/01/geoip-dl-build.tar.gz; tar xvf geoip-dl-build.tar.gz; rm geoip-dl-build.tar.gz;
--2015-01-27 22:22:58-- http://www.wolwx.net/wp-content/uploads/2015/01/geoip-dl-build.tar.gz
Résolution de www.wolwx.net... 37.59.46.137
Connexion vers www.wolwx.net|37.59.46.137|:80...connecté.
requête HTTP transmise, en attente de la réponse...200 OK
Longueur: 1463 (1,4K) [application/x-gzip]
Sauvegarde en : «geoip-dl-build.tar.gz»

100%[======================================>] 1 463 --.-K/s ds 0s

2015-01-27 22:22:58 (243 MB/s) - «geoip-dl-build.tar.gz» sauvegardé [1463/1463]

xt_geoip_dl
xt_geoip_build

Puis on exécute le téléchargement de la base de donnée geoip de maxmind.com :

# ./xt_geoip_dl
--2015-01-27 22:23:35-- http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
Résolution de geolite.maxmind.com... 141.101.114.190, 141.101.115.190, 2400:cb00:2048:1::8d65:73be, ...
Connexion vers geolite.maxmind.com|141.101.114.190|:80...connecté.
requête HTTP transmise, en attente de la réponse...200 OK
Longueur: 432763 (423K) [application/octet-stream]
Sauvegarde en : «GeoIP.dat.gz»

100%[======================================>] 432 763 --.-K/s ds 0,05s

2015-01-27 22:23:35 (7,96 MB/s) - «GeoIP.dat.gz» sauvegardé [432763/432763]

--2015-01-27 22:23:35-- http://geolite.maxmind.com/download/geoip/database/GeoIPv6.csv.gz
Réutilisation de la connexion existante vers geolite.maxmind.com:80.
requête HTTP transmise, en attente de la réponse...200 OK
Longueur: 947425 (925K) [application/octet-stream]
Sauvegarde en : «GeoIPv6.csv.gz»

100%[======================================>] 947 425 --.-K/s ds 0,1s

2015-01-27 22:23:35 (7,80 MB/s) - «GeoIPv6.csv.gz» sauvegardé [947425/947425]

--2015-01-27 22:23:35-- http://geolite.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip
Réutilisation de la connexion existante vers geolite.maxmind.com:80.
requête HTTP transmise, en attente de la réponse...200 OK
Longueur: 1551827 (1,5M) [application/zip]
Sauvegarde en : «GeoIPCountryCSV.zip»

100%[======================================>] 1 551 827 3,82M/s ds 0,4s

2015-01-27 22:23:36 (3,82 MB/s) - «GeoIPCountryCSV.zip» sauvegardé [1551827/1551827]

Terminé --2015-01-27 22:23:36--
Téléchargé(s): 3 fichiers, 2,8M en 0,6s (5,04 MB/s)
Archive: GeoIPCountryCSV.zip
inflating: GeoIPCountryWhois.csv

Et on peut ensuite exporter cette base de manière à l’utiliser avec IpTable :

# ./xt_geoip_build -D . *.csv 146238 entries total
0 IPv6 ranges for A1 Anonymous Proxy
94 IPv4 ranges for A1 Anonymous Proxy
0 IPv6 ranges for A2 Satellite Provider
335 IPv4 ranges for A2 Satellite Provider
[...]
0 IPv6 ranges for WF Wallis and Futuna
6 IPv4 ranges for WF Wallis and Futuna
5 IPv6 ranges for WS Samoa
17 IPv4 ranges for WS Samoa
5 IPv6 ranges for YE Yemen
28 IPv4 ranges for YE Yemen
0 IPv6 ranges for YT Mayotte
29 IPv4 ranges for YT Mayotte
142 IPv6 ranges for ZA South Africa
703 IPv4 ranges for ZA South Africa
11 IPv6 ranges for ZM Zambia
65 IPv4 ranges for ZM Zambia
10 IPv6 ranges for ZW Zimbabwe
61 IPv4 ranges for ZW Zimbabwe

 

2> Utilisation de règles GeoIP pour IpTable

Enfin, vous pourrez utiliser la fonction GeoIP avec IpTables :

# iptables -A INPUT -m geoip --src-cc CN -j DROP

Cette ligne résultant par un blocage des connexions provenant de la Chine.

Je vous conseil d’ailleurs de faire une règle par Pays afin de pouvoir désactiver les règles plus facilement au besoin.

Au cas ou, sachez que pour faire une règle sur plusieurs pays, il suffit de séparer par une virgule de cette manière (exemple fait avec la Chine, Taiwan, la Russie, et l’Algérie) : CN,TW,RU,DZ

On peut pousser le réglage et ainsi mieux filtrer en ne bloquant que certains port pour les pays choisis.

Avec cette règle en exemple, les connexions provenant de Chine seront autorisées en navigation web, ou en connexion sur des serveurs de jeux ou vocaux entre autre, mais bloquées sur les ports de connexion SSH et FTP.

# iptables -A INPUT -p tcp --dport 22,21 -m geoip --src-cc CN -j DROP

Contre exemple, refuser toutes les connexions port SSH qui ne sont pas du pays choisi (ici la France) :

# iptables -A INPUT -p tcp -m geoip ! --src-cc FR --dport 22 -j DROP

Et pour vérifier la bonne existante des réglages que l’on vient de faire :

# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
fail2ban-ssh tcp -- anywhere anywhere multiport dports ssh
fail2ban-ssh tcp -- anywhere anywhere multiport dports ssh
DROP all -- anywhere anywhere -m geoip --source-country CN
DROP all -- anywhere anywhere -m geoip --source-country RU
DROP all -- anywhere anywhere -m geoip --source-country TW
DROP all -- anywhere anywhere -m geoip --source-country DZ

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

Chain fail2ban-ssh (2 references)
target prot opt source destination
RETURN all -- anywhere anywhere
RETURN all -- anywhere anywhere

On y retrouve ici, des blocages sur les pays que sont la Chine (CN), la Russie (RU), Taiwan (TW) et l’Algérie (DZ).

D’autre part, voici quelques commandes utiles :

Comme la commande pour supprimer une règle

# iptables -D INPUT -m geoip --src-cc CN -j DROP

On supprime ici la règle de blocage correspondante à la Chine.

Et au besoin, voici simplement la commande permettant de lister les fonctions disponibles :

# iptables -m geoip --help
iptables v1.4.14

Usage: iptables -[ACD] chain rule-specification [options]
 iptables -I chain [rulenum] rule-specification [options]
 iptables -R chain rulenum rule-specification [options]
 iptables -D chain rulenum [options]
 iptables -[LS] [chain [rulenum]] [options]
 iptables -[FZ] [chain] [options]
 iptables -[NX] chain
 iptables -E old-chain-name new-chain-name
 iptables -P chain target [options]
 iptables -h (print this help information)

Commands:
Either long or short options are allowed.
 --append -A chain Append to chain
 --check -C chain Check for the existence of a rule
 --delete -D chain Delete matching rule from chain
 --delete -D chain rulenum
 Delete rule rulenum (1 = first) from chain
 --insert -I chain [rulenum]
 Insert in chain as rulenum (default 1=first)
 --replace -R chain rulenum
 Replace rule rulenum (1 = first) in chain
 --list -L [chain [rulenum]]
 List the rules in a chain or all chains
 --list-rules -S [chain [rulenum]]
 Print the rules in a chain or all chains
 --flush -F [chain] Delete all rules in chain or all chains
 --zero -Z [chain [rulenum]]
 Zero counters in chain or all chains
 --new -N chain Create a new user-defined chain
 --delete-chain
 -X [chain] Delete a user-defined chain
 --policy -P chain target
 Change policy on chain to target
 --rename-chain
 -E old-chain new-chain
 Change chain name, (moving any references)
Options:
 --ipv4 -4 Nothing (line is ignored by ip6tables-restore)
 --ipv6 -6 Error (line is ignored by iptables-restore)
[!] --proto -p proto protocol: by number or name, eg. `tcp'
[!] --source -s address[/mask][...]
 source specification
[!] --destination -d address[/mask][...]
 destination specification
[!] --in-interface -i input name[+]
 network interface name ([+] for wildcard)
 --jump -j target
 target for rule (may load target extension)
 --goto -g chain
 jump to chain with no return
 --match -m match
 extended match (may load extension)
 --numeric -n numeric output of addresses and ports
[!] --out-interface -o output name[+]
 network interface name ([+] for wildcard)
 --table -t table table to manipulate (default: `filter')
 --verbose -v verbose mode
 --line-numbers print line numbers when listing
 --exact -x expand numbers (display exact values)
[!] --fragment -f match second or further fragments only
 --modprobe=<command> try to insert modules using this command
 --set-counters PKTS BYTES set the counter during insert/append
[!] --version -V print package version.

geoip match options:
[!] --src-cc, --source-country country[,country...]
 Match packet coming from (one of) the specified country(ies)
[!] --dst-cc, --destination-country country[,country...]
 Match packet going to (one of) the specified country(ies)

NOTE: The country is inputed by its ISO3166 code.

Enfin, très pratique, sachez que la liste des pays ainsi que leurs codes associés, est au format ISO 3166, elle est disponible sur ce lien :
http://fr.wikipedia.org/wiki/ISO_3166-1

 

3> Vérification du fonctionnement des règles GeoIP

Afin de nous assurer que tout est ok, il suffit de vérifier le auth.log, ou un log de serveur (apache, mail, ou autre)

Voici l’exemple des “drop” effectués, dans le syslog, par IpTable depuis l’application de ces nouvelles règles GeoIP :

[…]

Jan 31 16:38:13 mondedie kernel: [ 6538.094771] DROP-RUSSIE: IN=eth0 OUT= MAC=e0:cb:4e:8c:a7:b4:6c:9c:ed:bb:bd:80:08:00 SRC=195.88.208.131 DST=xx.xx.xx.xx LEN=42 TOS=0x00 PREC=0x00 TTL=244 ID=21067 PROTO=UDP SPT=28155 DPT=9987 LEN=22
Jan 31 16:38:14 mondedie kernel: [ 6539.396250] DROP-CHINE: IN=eth0 OUT= MAC=e0:cb:4e:8c:a7:b4:6c:9c:ed:bb:6f:80:08:00 SRC=123.125.71.96 DST=xx.xx.xx.xx LEN=60 TOS=0x00 PREC=0x00 TTL=45 ID=29431 DF PROTO=TCP SPT=43345 DPT=80 WINDOW=14600 RES=0x00 SYN URGP=0
Jan 31 16:38:15 mondedie kernel: [ 6540.391375] DROP-CHINE: IN=eth0 OUT= MAC=e0:cb:4e:8c:a7:b4:6c:9c:ed:bb:6f:80:08:00 SRC=123.125.71.96 DST=xx.xx.xx.xx LEN=60 TOS=0x00 PREC=0x00 TTL=45 ID=29432 DF PROTO=TCP SPT=43345 DPT=80 WINDOW=14600 RES=0x00 SYN URGP=0

[…]

 

4> Sauvegarder les réglages geoip dans IpTable

Effectivement, les réglages fait en l’état sauterons au moindre redémarrage de votre serveur dédié … 🙁

Afin d’avoir en permanence vos réglages sauvegardés, et rechargés en cas de reboot, voici la manipulation à faire.

Il faut dans un premier temps exporter les règles :

# iptables-save > /etc/iptables-geoip

Puis les inclure en importation automatique au redémarrage :

# nano /etc/network/interfaces

Rajouter

post-up iptables-restore < /etc/iptables-geoip

Après la dernière ligne du paragraphe “auto eth0”, de cette manière

auto eth0
iface eth0 inet static
address xx.xx.xx.xx
netmask 255.255.255.0
network xx.xx.xx.0
broadcast xx.xx.xx.255
gateway xx.xx.xx.254
post-up iptables-restore < /etc/iptables-geoip

Après reboot, vous pourrez revérifier immédiatement la présence des règles et constater par vous mêmeavec la commande citée plus haut :

# iptables -L

Voilà donc comment sécuriser un peu plus son serveur dédié 🙂

Sources :
http://www.how-to.ovh/viewtopic.php?t=11&p=15
http://debian-facile.org/viewtopic.php?id=7185

Quitter la version mobile