{"id":3233,"date":"2018-05-28T20:08:22","date_gmt":"2018-05-28T18:08:22","guid":{"rendered":"https:\/\/www.fanjoe.be\/?p=3233"},"modified":"2018-05-28T20:08:22","modified_gmt":"2018-05-28T18:08:22","slug":"iptables-ipset-bannir-des-grandes-listes-dip-extraites-de-plusieurs-sites","status":"publish","type":"post","link":"https:\/\/www.fanjoe.be\/?p=3233","title":{"rendered":"IPtables + IPset : Bannir des grandes listes d\u2019IP extraites de plusieurs sites"},"content":{"rendered":"<h1>Introduction<\/h1>\n<p>Comme on l&rsquo;a vu dans <a href=\"https:\/\/www.fanjoe.be\/?p=3207\" target=\"_blank\" rel=\"noopener\">cet article<\/a>, il est possible d&rsquo;extraire, puis de bloquer, une liste d&rsquo;IP extraite d&rsquo;un site comme <a href=\"https:\/\/www.blocklist.de\/\" target=\"_blank\" rel=\"noopener\">https:\/\/www.blocklist.de\/<\/a><\/p>\n<p>Malheureusement, lorsque ces listes contiennent plusieurs milliers d\u2019occurrences, IPtables peine \u00e0 les ajouter une \u00e0 une. La cadence d&rsquo;ajout passe de plusieurs dizaines d&rsquo;IP \u00e0 la seconde \u00e0 plusieurs secondes par IP au fur et \u00e0 mesure de l&rsquo;avancement de la t\u00e2che.<\/p>\n<hr \/>\n<p>Voici d\u2019autres articles de mon blog qui traitent du m\u00eame sujet :<\/p>\n<ul>\n<li><a href=\"https:\/\/www.fanjoe.be\/?p=1003\" target=\"_blank\" rel=\"noopener\">Raspberry Pi : Configurer IPtables<\/a><\/li>\n<li><a href=\"https:\/\/www.fanjoe.be\/?p=1009\" target=\"_blank\" rel=\"noopener\">Raspberry Pi : Configurer Fail2Ban<\/a><\/li>\n<li><a href=\"https:\/\/www.fanjoe.be\/?p=3185\" rel=\"bookmark\">Fail2Ban : Bannir des IP signal\u00e9es par AbuseIPDB<\/a><\/li>\n<li><a href=\"https:\/\/www.fanjoe.be\/?p=3207\" rel=\"bookmark\">IPtables : Bannir une liste d\u2019IP extraite de BlockList.de<\/a><\/li>\n<\/ul>\n<p><!--more--><\/p>\n<h1>IPset<\/h1>\n<h2>Pr\u00e9sentation<\/h2>\n<p>IPset a \u00e9t\u00e9 introduit dans la version 2.6.32 du noyau GNU\/Linux et est pris en charge dans Debian 7 et 8, ainsi que dans Red Hat 6 et suivants.<\/p>\n<p>Il permet de stocker des adresses IP, des r\u00e9seaux, des num\u00e9ros de port (TCP\/UDP), des adresses MAC, des noms d&rsquo;interfaces ou des combinaisons de ceux-ci.<\/p>\n<p>Comme il utilise une table de hachage pour stocker\/r\u00e9cup\u00e9rer les adresses IP, la recherche est beaucoup plus rapide que des milliers de r\u00e8gles d&rsquo;interdiction d&rsquo;IPtables analys\u00e9es s\u00e9quentiellement.<\/p>\n<p>Cependant, une liste IPset est limit\u00e9e \u00e0 2^16 entr\u00e9es (65536).<\/p>\n<h2>Installation<\/h2>\n<p>Pour installer IPset, nous allons utiliser ces commandes :<\/p>\n<pre>$ sudo apt-get update &amp;&amp; sudo apt-get upgrade &amp;&amp; sudo apt-get install ipset<\/pre>\n<p>Ce qui va probablement nous obliger \u00e0 installer quelques d\u00e9pendances :<\/p>\n<pre>Lecture des listes de paquets... Fait\r\nConstruction de l'arbre des d\u00e9pendances \r\nLecture des informations d'\u00e9tat... Fait\r\nLes paquets suppl\u00e9mentaires suivants seront install\u00e9s\u00a0: \r\nlibipset3 libmnl0\r\nLes NOUVEAUX paquets suivants seront install\u00e9s\u00a0:\r\nipset libipset3 libmnl0\r\n0 mis \u00e0 jour, 3 nouvellement install\u00e9s, 0 \u00e0 enlever et 0 non mis \u00e0 jour.\r\nIl est n\u00e9cessaire de prendre 105 ko dans les archives.\r\nApr\u00e8s cette op\u00e9ration, 337 ko d'espace disque suppl\u00e9mentaires seront utilis\u00e9s.\r\nSouhaitez-vous continuer ? [O\/n] o<\/pre>\n<h2>Ajout d&rsquo;une r\u00e8gle au firewall<\/h2>\n<p>Vous pouvez vous reporter \u00e0 cet article pour la configuration du firewall avec IPtables : <a href=\"https:\/\/www.fanjoe.be\/?p=1003\" target=\"_blank\" rel=\"noopener\">https:\/\/www.fanjoe.be\/?p=1003<\/a><\/p>\n<p>Juste apr\u00e8s la suppression des r\u00e8gles pr\u00e9c\u00e9dentes nous allons ajouter la partie <strong>IPset<\/strong> :<\/p>\n<pre><span style=\"color: #999999;\">#Suppression des r\u00e8gles pr\u00e9c\u00e9dentes\r\niptables -F\r\niptables -X<\/span>\r\n\r\n#########\r\n# IPset #\r\n#########\r\n\r\nipset create blacklist hash:ip hashsize 4096\r\niptables -I INPUT   -m set --match-set blacklist src -j DROP\r\niptables -I FORWARD -m set --match-set blacklist src -j DROP\r\n\r\n<span style=\"color: #999999;\">########\r\n# DROP #\r\n########<\/span><\/pre>\n<p>Nous avons cr\u00e9\u00e9 une table appel\u00e9e <strong>blacklist<\/strong> dans laquelle nous allons ajouter notre liste d&rsquo;IP.<\/p>\n<p>Ensuite, nous avons cr\u00e9\u00e9 une r\u00e8gle <strong>IPtables<\/strong> en <strong>Input<\/strong> et en <strong>Forward<\/strong> qui va chercher la correspondance avec le contenu de notre table. Si elle \u00ab\u00a0match\u00a0\u00bb, le paquet est bloqu\u00e9.<\/p>\n<p>Tout \u00e0 la fin de notre fichier firewall, nous allons ajouter cet appel au script que nous allons voir plus loin :<\/p>\n<pre># Ex\u00e9cution du script de BlackListIP-Start\r\n\/home\/pi\/scripts\/BlackListIP\/BlackListIP-Start.bash<\/pre>\n<h1>Scripts<\/h1>\n<h2>Script d&rsquo;initialisation<\/h2>\n<p>On va cr\u00e9er \/ \u00e9diter le fichier <code>\/home\/pi\/scripts\/BlackListIP\/BlackListIP-Start.bash<\/code> :<\/p>\n<pre>$ sudo nano \/home\/pi\/scripts\/BlackListIP\/BlackListIP-Start.bash<\/pre>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\n#!\/bin\/bash\r\n\r\n#####################################################\r\n#                                                   #\r\n#  Script ex\u00e9cut\u00e9 au boot par \/etc\/init.d\/firewall  #\r\n#                                                   #\r\n#  Ban avec ipset toutes les IP des fichiers :      #\r\n#  \/home\/pi\/scripts\/BlackListIP\/BlackListIP.txt     #\r\n#                                                   #\r\n#####################################################\r\n\r\n# V\u00e9rifie que l'on est en Root\r\nif &#x5B;&#x5B; $EUID -ne 0 ]];\r\nthen\r\n\techo &quot;Ce script doit \u00eatre ex\u00e9cut\u00e9 avec les privil\u00e8ges administrateur&quot;\r\n   \texit 1\r\nfi\r\n\r\n# Flush de la table blacklist.\r\nipset flush blacklist  &gt; \/dev\/null\r\n\r\n# Charge les IP dans ipset\r\nwhile read ip\r\ndo\r\n\tipset add blacklist $ip\r\ndone &lt; \/home\/pi\/scripts\/BlackListIP\/BlackListIP.txt\r\n\r\n<\/pre>\n<p>On enregistre le fichier et on le rend ex\u00e9cutable :<\/p>\n<pre>$ sudo chmod +x \/home\/pi\/scripts\/BlackListIP\/BlackListIP-Start.bash<\/pre>\n<h2>Script de mise \u00e0 jour de la liste d&rsquo;IP \u00e0 bloquer<\/h2>\n<h3>Les sites<\/h3>\n<p>Voici une liste de sites qui mettent \u00e0 disposition des listes d&rsquo;IP \u00e0 bannir :<\/p>\n<ul>\n<li><a href=\"http:\/\/danger.rulez.sk\/projects\/bruteforceblocker\/blist.php\" target=\"_blank\" rel=\"noopener\">http:\/\/danger.rulez.sk\/projects\/bruteforceblocker\/blist.php<\/a><\/li>\n<li><a href=\"http:\/\/cinsscore.com\/list\/ci-badguys.txt\" target=\"_blank\" rel=\"noopener\">http:\/\/cinsscore.com\/list\/ci-badguys.txt<\/a><\/li>\n<li><a href=\"https:\/\/lists.blocklist.de\/lists\/all.txt\" target=\"_blank\" rel=\"noopener\">https:\/\/lists.blocklist.de\/lists\/all.txt <\/a><\/li>\n<\/ul>\n<p>Un site qui r\u00e9f\u00e9rence plusieurs listes :<\/p>\n<ul>\n<li><a href=\"https:\/\/zeltser.com\/malicious-ip-blocklists\/\" target=\"_blank\" rel=\"noopener\">https:\/\/zeltser.com\/malicious-ip-blocklists\/<\/a><\/li>\n<\/ul>\n<h3>Le script<\/h3>\n<p>On va cr\u00e9er \/ \u00e9diter le fichier <code>\/home\/pi\/scripts\/BlackListIP\/BlackListIP-Refresh.bash<\/code> :<\/p>\n<pre>$ sudo nano \/home\/pi\/scripts\/BlackListIP\/BlackListIP-Refresh.bash<\/pre>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\n#!\/bin\/bash\r\n\r\n#######################################################################\r\n#                                                                     #\r\n#  Script ex\u00e9cut\u00e9 par cron pour rafraichir la liste des IP publiques  #\r\n#                                                                     #\r\n#  Ban avec ipset toutes les IP du fichier :                          #\r\n#  \/home\/pi\/scripts\/BlackListIP\/BlackListIP.txt                       #\r\n#                                                                     #\r\n#######################################################################\r\n\r\n# V\u00e9rifie que l'on est en Root\r\nif &#x5B;&#x5B; $EUID -ne 0 ]];\r\nthen\r\n\techo &quot;Ce script doit \u00eatre ex\u00e9cut\u00e9 avec les privil\u00e8ges administrateur&quot;\r\n   \texit 1\r\nfi\r\n\r\nBLACKLIST_FILE=&quot;\/home\/pi\/scripts\/BlackListIP\/BlackListIP.txt&quot;\r\nBLACKLIST_FILE_TMP=&quot;\/home\/pi\/scripts\/BlackListIP\/BlackListIP.tmp&quot;\r\n\r\nBLACKLISTS=(\r\n&quot;http:\/\/danger.rulez.sk\/projects\/bruteforceblocker\/blist.php&quot;\r\n&quot;http:\/\/cinsscore.com\/list\/ci-badguys.txt&quot;\r\n&quot;https:\/\/lists.blocklist.de\/lists\/all.txt&quot;\r\n)\r\n\r\nfor liste in &quot;${BLACKLISTS&#x5B;@]}&quot;\r\ndo\r\n\tLISTE_TMP=$(curl &quot;$liste&quot;)\r\n\techo &quot;$LISTE_TMP&quot; | grep -Po '(?:\\d{1,3}\\.){3}\\d{1,3}(?:\/\\d{1,2})?' &gt;&gt; $BLACKLIST_FILE_TMP\r\ndone\r\n\r\nsort -n -t . -k 1,1 -k 2,2 -k 3,3 -k 4,4 $BLACKLIST_FILE_TMP | uniq &gt; $BLACKLIST_FILE\r\nrm $BLACKLIST_FILE_TMP\r\n\r\n# Flush de la table blacklist pour \u00e9viter les doublons.\r\nipset flush blacklist  &gt; \/dev\/null\r\n\r\nwhile read ip\r\ndo\r\n\t#echo $ip\r\n\tipset add blacklist $ip\r\ndone &lt; $BLACKLIST_FILE\r\n\r\n<\/pre>\n<p>On enregistre le fichier et on le rend ex\u00e9cutable :<\/p>\n<pre>$ sudo chmod +x \/home\/pi\/scripts\/BlackListIP\/BlackListIP-Refresh.bash<\/pre>\n<p>Puis, au lieu de relancer le firewall ou de red\u00e9marrer le RPi, nous allons ex\u00e9cuter le script que nous venons d&rsquo;\u00e9crire :<\/p>\n<pre>$ sudo \/home\/pi\/scripts\/BlackListIP\/BlackListIP-Refresh.bash<\/pre>\n<p>Il faut compter jusqu&rsquo;\u00e0 5 minutes pour charger toutes les IP (\u00b140000) dans la table.<\/p>\n<p>Si vous voulez une sortie \u00e0 l&rsquo;\u00e9cran pour voir les IP d\u00e9filer, d\u00e9-commentez la ligne <code># echo $ip<\/code><\/p>\n<h2>cron<\/h2>\n<p>On va mettre la liste des IP \u00e0 jour avec <code>cron<\/code> :<\/p>\n<pre>$ sudo crontab -e<\/pre>\n<pre># Charge la liste des IP blacklist\u00e9es depuis plusieurs sites tous les jours \u00e0 14h\r\n00 14 * * * sudo \/home\/pi\/scripts\/BlackListIP\/BlackListIP-Refresh.bash<\/pre>\n<p>&nbsp;<\/p>\n<p><span style=\"text-decoration: underline;\"><strong>R\u00e9f\u00e9rences :<\/strong><\/span><\/p>\n<ul>\n<li><a href=\"http:\/\/www.randomdevstuff.com\/use-ipset-to-block-multiple-ips\/\" target=\"_blank\" rel=\"noopener\">http:\/\/www.randomdevstuff.com\/use-ipset-to-block-multiple-ips\/<\/a><\/li>\n<li><a href=\"http:\/\/unixetc.co.uk\/2016\/04\/18\/protect-your-web-server-with-ipset\/\" target=\"_blank\" rel=\"noopener\">http:\/\/unixetc.co.uk\/2016\/04\/18\/protect-your-web-server-with-ipset\/<\/a><\/li>\n<li><a href=\"http:\/\/www.randomdevstuff.com\/use-ipset-to-block-multiple-ips\/\" target=\"_blank\" rel=\"noopener\">http:\/\/www.randomdevstuff.com\/use-ipset-to-block-multiple-ips\/<\/a><\/li>\n<li><a href=\"https:\/\/neverendingsecurity.wordpress.com\/2015\/04\/13\/iptables-blacklist-script\/\" target=\"_blank\" rel=\"noopener\">https:\/\/neverendingsecurity.wordpress.com\/2015\/04\/13\/iptables-blacklist-script\/<\/a><\/li>\n<li><a href=\"http:\/\/bignole.50webs.com\/ipset.html\" target=\"_blank\" rel=\"noopener\">http:\/\/bignole.50webs.com\/ipset.html<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Introduction <\/p>\n<p>Comme on l&rsquo;a vu dans <a href=\"https:\/\/www.fanjoe.be\/?p=3207\" target=\"_blank\" rel=\"noopener\">cet article<\/a>, il est possible d&rsquo;extraire, puis de bloquer, une liste&#8230;<\/p>\n","protected":false},"author":1,"featured_media":3249,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","jetpack_post_was_ever_published":false},"categories":[10,3,173,12],"tags":[244,92,139,322,90],"class_list":["post-3233","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-geek","category-informatique","category-linux","category-raspberrypi","tag-adresse-ip","tag-firewall","tag-ip","tag-ipset","tag-iptables","end"],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/www.fanjoe.be\/wp-content\/uploads\/2018\/05\/IPSet-00.png","_links":{"self":[{"href":"https:\/\/www.fanjoe.be\/index.php?rest_route=\/wp\/v2\/posts\/3233","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.fanjoe.be\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.fanjoe.be\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.fanjoe.be\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.fanjoe.be\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3233"}],"version-history":[{"count":0,"href":"https:\/\/www.fanjoe.be\/index.php?rest_route=\/wp\/v2\/posts\/3233\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.fanjoe.be\/index.php?rest_route=\/wp\/v2\/media\/3249"}],"wp:attachment":[{"href":"https:\/\/www.fanjoe.be\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3233"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.fanjoe.be\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3233"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.fanjoe.be\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3233"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}