{"id":1003,"date":"2014-07-14T19:26:53","date_gmt":"2014-07-14T17:26:53","guid":{"rendered":"https:\/\/www.fanjoe.be\/?p=1003"},"modified":"2019-01-26T20:15:00","modified_gmt":"2019-01-26T19:15:00","slug":"raspberry-pi-configurer-iptables","status":"publish","type":"post","link":"https:\/\/www.fanjoe.be\/?p=1003","title":{"rendered":"Raspberry Pi : Configurer IPtables"},"content":{"rendered":"<p><a href=\"https:\/\/www.fanjoe.be\/wp-content\/uploads\/2014\/07\/IPtables-01.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1005\" src=\"https:\/\/www.fanjoe.be\/wp-content\/uploads\/2014\/07\/IPtables-01.jpg\" alt=\"IPtables-01\" width=\"620\" height=\"310\" srcset=\"https:\/\/www.fanjoe.be\/wp-content\/uploads\/2014\/07\/IPtables-01.jpg 620w, https:\/\/www.fanjoe.be\/wp-content\/uploads\/2014\/07\/IPtables-01-175x87.jpg 175w, https:\/\/www.fanjoe.be\/wp-content\/uploads\/2014\/07\/IPtables-01-300x150.jpg 300w\" sizes=\"auto, (max-width: 620px) 100vw, 620px\" \/><\/a><\/p>\n<p>Je me suis r\u00e9cemment rendu compte des dangers auxquels mon Raspberry Pi \u00e9tait expos\u00e9.<\/p>\n<p>Bien qu&rsquo;il soit plac\u00e9 derri\u00e8re un router avec des fonctions de pare-feu activ\u00e9es, le Pi n&rsquo;est pas \u00e0 l\u2019abri de nombreuses attaques. J&rsquo;ai donc activ\u00e9 quelques protections dont la premi\u00e8re est <strong>IPtables<\/strong>.<\/p>\n<hr \/>\n<p>Voici d&rsquo;autres articles de mon blog qui traitent du m\u00eame sujet :<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\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\" target=\"_blank\" rel=\"noopener\">IPtables : Bannir une liste d&rsquo;IP extraite de BlockList.de<\/a><\/li>\n<li><a href=\"https:\/\/www.fanjoe.be\/?p=3233\" rel=\"bookmark\">IPtables + IPset : Bannir des grandes listes d\u2019IP extraites de plusieurs sites<\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<hr \/>\n<p><!--more-->Normalement, IPtables est install\u00e9 d&rsquo;origine sur le RPi.<br \/>\nSi ce n&rsquo;\u00e9tait pas le cas, il suffit de l&rsquo;installer comme ceci :<\/p>\n<pre>$ sudo apt-get update &amp;&amp; sudo apt-get upgrade &amp;&amp; sudo apt-get install iptables<\/pre>\n<p>Une fois le pare-feu install\u00e9, on va v\u00e9rifier qu&rsquo;aucune r\u00e8gle n&rsquo;a \u00e9t\u00e9 configur\u00e9e :<\/p>\n<pre>$ sudo iptables -L<\/pre>\n<p>On devrait obtenir ceci :<\/p>\n<pre>Chain INPUT (policy DROP)\ntarget\u00a0\u00a0\u00a0\u00a0 prot opt source\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 destination\n\nChain FORWARD (policy DROP)\ntarget\u00a0\u00a0\u00a0\u00a0 prot opt source\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 destination\n\nChain OUTPUT (policy ACCEPT)\ntarget\u00a0\u00a0\u00a0\u00a0 prot opt source\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 destination<\/pre>\n<p>Pour bloquer des ports et modifier les restrictions d&rsquo;acc\u00e8s, il faut appeler <code>iptables<\/code> en ligne de commande avec les privil\u00e8ges root. Mais d\u00e8s que le RPi est red\u00e9marr\u00e9, tous ce qui a \u00e9t\u00e9 configur\u00e9 est perdu et il faut tout recommencer.<\/p>\n<p>Pour \u00e9viter ces inconv\u00e9nients, on va cr\u00e9er un script comprenant toutes les commandes pour configurer le pare-feu et l&rsquo;ex\u00e9cuter lors du d\u00e9marrage du Pi.<\/p>\n<p>On cr\u00e9e un fichier que l&rsquo;on va nommer <code>firewall<\/code> et que l&rsquo;on va placer dans le dossier <code>\/etc\/init.d\/<\/code> :<\/p>\n<pre>$ sudo nano \/etc\/init.d\/firewall<\/pre>\n<p>On va y copier les lignes suivantes :<\/p>\n<pre>#!\/bin\/sh\n### BEGIN INIT INFO\n# Provides:          firewall rules\n# Required-Start:    $remote_fs $syslog\n# Required-Stop:     $remote_fs $syslog\n# Default-Start:     2 3 4 5\n# Default-Stop:      0 1 6\n# Short-Description: Start daemon at boot time\n# Description:       Enable service provided by daemon.\n### END INIT INFO\n\n#Suppression des r\u00e8gles pr\u00e9c\u00e9dentes\niptables -F\niptables -X\n\n########\n# DROP #\n########\n\n# D\u00e9finition du blocage g\u00e9n\u00e9ral\niptables -P INPUT DROP\niptables -P OUTPUT DROP\niptables -P FORWARD DROP\n\n# Drop des scans XMAS et NULL\niptables -A INPUT -p tcp --tcp-flags FIN,URG,PSH FIN,URG,PSH -j DROP\niptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP\niptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP\niptables -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP\n\n##########\n# ACCEPT #\n##########\n\n# Conservations des connexions d\u00e9j\u00e0 \u00e9tablies\niptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT\niptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT\n\n# Autorisation du loopback (127.0.0.1)\niptables -A INPUT -i lo -j ACCEPT\niptables -A OUTPUT -o lo -j ACCEPT\n\n# Autorisation des \u00e9changes avec le serveur DNS (53)\niptables -A OUTPUT -p udp -m udp --dport 53 -m conntrack --ctstate NEW,RELATED,ESTABLISHED -j ACCEPT\niptables -A INPUT -p udp -m udp --sport 53 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT\n\n# NTP (123)\niptables -A INPUT -p udp --sport 123 -j ACCEPT\niptables -A OUTPUT -p udp --dport 123 -j ACCEPT\n\n# HTTP (80)\niptables -A INPUT -p tcp --dport 80 -j ACCEPT\niptables -A OUTPUT -p tcp --dport 80 -j ACCEPT\n\n# HTTPS (443)\niptables -A INPUT -p tcp --dport 443 -j ACCEPT\niptables -A OUTPUT -p tcp --dport 443 -j ACCEPT\n\n# HTTP (81 - PHPMyAdmin)\niptables -A INPUT -s 192.168.0.1\/24 -p tcp --dport 81 -j ACCEPT\niptables -A OUTPUT -s 192.168.0.1\/24 -p tcp --dport 81 -j ACCEPT\n\n# HTTP (8200 - MiniDLNA)\niptables -A INPUT -s 192.168.0.1\/24 -p tcp --dport 8200 -j ACCEPT\niptables -A OUTPUT -s 192.168.0.1\/24 -p tcp --dport 8200 -j ACCEPT\n\n# MiniDLNA (1900)\niptables -A INPUT -s 192.168.0.1\/24 -p tcp -m tcp --dport 1900 -j ACCEPT\niptables -A INPUT -s 192.168.0.1\/24 -p udp -m udp --dport 1900 -j ACCEPT\niptables -A OUTPUT -s 192.168.0.1\/24 -p udp -m udp --dport 1900 -j ACCEPT\n\n# HTTP (9091 - Transmission-Daemon WebInterface - Direct Access)\niptables -A INPUT -s 192.168.0.1\/24 -p tcp --dport 9091 -j ACCEPT\niptables -A OUTPUT -s 192.168.0.1\/24 -p tcp --dport 9091 -j ACCEPT\n\n# SSH (22)\niptables -A INPUT -p tcp --dport 22 -j ACCEPT\niptables -A OUTPUT -p tcp --dport 22 -j ACCEPT\n\n# VNC (5900:5910)\niptables -A INPUT -p tcp --dport 5900:5910 -j ACCEPT\niptables -A OUTPUT -p tcp --dport 5900:5910 -j ACCEPT\n\n# Transmission (51413)\niptables -A INPUT -p tcp -m tcp --dport 51413 -j ACCEPT\niptables -A INPUT -p udp -m udp --dport 51413 -j ACCEPT\niptables -A OUTPUT -p tcp -m tcp --dport 51413 -j ACCEPT\niptables -A OUTPUT -p udp -m udp --dport 51413 -j ACCEPT\n\n# Announces trackers (9200)\niptables -A OUTPUT -p tcp --dport 9200 -j ACCEPT\n\n# Ports Torrents (49152:65535)\niptables -A INPUT -p tcp --dport 49152:65535 -j ACCEPT\niptables -A INPUT -p udp --dport 49152:65535 -j ACCEPT\niptables -A OUTPUT -p tcp --dport 49152:65535 -j ACCEPT\niptables -A OUTPUT -p udp --dport 49152:65535 -j ACCEPT\n\n# ICMP (Ping)\niptables -A INPUT -p icmp -j ACCEPT\niptables -A OUTPUT -p icmp -j ACCEPT\n\n# Parer les attaques de type D\u00e9ni de Service\niptables -A FORWARD -p tcp --syn -m limit --limit 1\/second -j ACCEPT\niptables -A FORWARD -p udp -m limit --limit 1\/second -j ACCEPT\niptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1\/second -j ACCEPT\n\n# Parer les scans de ports\niptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1\/s -j ACCEPT<\/pre>\n<p>Ci-dessus le SSH est ouvert depuis n&rsquo;importe quelle adresse sur le net, ce qui va nous permettre de nous connecter depuis n&rsquo;importe o\u00f9 dans le monde.<br \/>\n<strong>Si vous modifiez cette r\u00e8gle, vous risquez de perdre l&rsquo;acc\u00e8s \u00e0 votre RPi en SSH.<\/strong><\/p>\n<p>On va maintenant rendre le script ex\u00e9cutable :<\/p>\n<pre>$ sudo chmod +x \/etc\/init.d\/firewall<\/pre>\n<p>Puis, l&rsquo;ex\u00e9cuter manuellement :<\/p>\n<pre>$ sudo \/etc\/init.d\/firewall<\/pre>\n<p>Pour l&rsquo;ex\u00e9cuter \u00e0 chaque d\u00e9marrage, on va l&rsquo;inclure dans la liste des scripts qui s&rsquo;ex\u00e9cutent au boot :<\/p>\n<pre>$ sudo update-rc.d firewall defaults<\/pre>\n<p>Voil\u00e0, une partie des ports sont bloqu\u00e9s, mais ceux qui sont rest\u00e9s ouverts (principalement pour les torrents) courent un risque.<br \/>\nPour compl\u00e9ter la s\u00e9curit\u00e9, on va installer Fail2Ban. Mais \u00e7a, c&rsquo;est une autre histoire&#8230; \ud83d\ude09<\/p>\n<hr \/>\n<p><strong>Edit &#8211; 16 juillet 2014 :<\/strong><\/p>\n<p>J&rsquo;ai remarqu\u00e9 que les logs de Fail2Ban comportaient r\u00e9guli\u00e8rement des attaques depuis des adresses IP situ\u00e9es dans les m\u00eames tranches.<\/p>\n<pre>2014-07-16 17:27:29,371 fail2ban.actions: WARNING [ssh] Ban <span style=\"color: #ff0000;\">116.10.191.223<\/span>\n2014-07-16 17:27:29,549 fail2ban.actions: WARNING [ssh] Ban <span style=\"color: #ff0000;\">116.10.191.212<\/span>\n2014-07-16 17:27:29,709 fail2ban.actions: WARNING [ssh] Ban 120.33.29.226\n2014-07-16 17:27:29,889 fail2ban.actions: WARNING [ssh] Ban <span style=\"color: #ff00ff;\">61.174.51.224<\/span>\n2014-07-16 17:27:30,079 fail2ban.actions: WARNING [ssh] Ban 109.75.160.67\n2014-07-16 17:27:30,238 fail2ban.actions: WARNING [ssh] Ban 202.137.9.53\n2014-07-16 17:27:30,422 fail2ban.actions: WARNING [ssh] Ban <span style=\"color: #ff00ff;\">61.174.51.214<\/span>\n2014-07-16 17:27:30,587 fail2ban.actions: WARNING [ssh] Ban <span style=\"color: #ff0000;\">116.10.191.163<\/span>\n2014-07-16 17:27:30,759 fail2ban.actions: WARNING [ssh] Ban <span style=\"color: #ff00ff;\">61.174.51.215<\/span>\n2014-07-16 17:27:30,948 fail2ban.actions: WARNING [ssh] Ban <span style=\"color: #ff0000;\">116.10.191.234<\/span>\n2014-07-16 17:27:31,126 fail2ban.actions: WARNING [ssh] Ban <span style=\"color: #ff0000;\">116.10.191.179<\/span>\n2014-07-16 17:27:31,305 fail2ban.actions: WARNING [ssh] Ban <span style=\"color: #ff0000;\">116.10.191.231<\/span>\n2014-07-16 17:27:31,491 fail2ban.actions: WARNING [ssh] Ban <span style=\"color: #ff00ff;\">61.174.50.235<\/span><\/pre>\n<p><strong>NB.<\/strong>: Toutes les heures sont identiques car j&rsquo;ai reload\u00e9 Fail2Ban apr\u00e8s avoir modifi\u00e9 les r\u00e8gles. Il a alors re-banni toutes les attaques trouv\u00e9es dans la p\u00e9riode d\u00e9crite dans le <code>findtime = 86400<\/code> (1 jour).<\/p>\n<p>J&rsquo;ai alors d\u00e9cid\u00e9 d&rsquo;ajouter quelques lignes dans la partie <code>DROP<\/code> d&rsquo;IPtables, dans le fichier\u00a0<code>\/etc\/init.d\/firewall<\/code> :<\/p>\n<pre># Bloquer certaines IP connues pour les attaques\n# De 116.10.191.1 =&gt; 116.10.191.254\niptables -A INPUT -s 116.10.191.0\/24 -j DROP\n# De 61.174.50.1 =&gt; 61.174.51.254\niptables -A INPUT -s 61.174.50.0\/23 -j DROP<\/pre>\n<p>Un calculateur de masque IPv4 pourra vous \u00eatre utile :<br \/>\n<a title=\"Calculateur de masque IPv4\" href=\"http:\/\/cric.grenoble.cnrs.fr\/Administrateurs\/Outils\/CalculMasque\/\" target=\"_blank\" rel=\"noopener\">http:\/\/cric.grenoble.cnrs.fr\/Administrateurs\/Outils\/CalculMasque\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p><a href=\"https:\/\/www.fanjoe.be\/wp-content\/uploads\/2014\/07\/IPtables-01.jpg\"><\/a><\/p>\n<p>Je me suis r\u00e9cemment rendu compte des dangers auxquels mon Raspberry Pi \u00e9tait expos\u00e9.<\/p>\n<p>Bien qu&rsquo;il soit plac\u00e9&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[10,3,12],"tags":[93,92,90,91,65],"class_list":["post-1003","post","type-post","status-publish","format-standard","hentry","category-geek","category-informatique","category-raspberrypi","tag-attaque","tag-firewall","tag-iptables","tag-pare-feu","tag-port","end"],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/www.fanjoe.be\/index.php?rest_route=\/wp\/v2\/posts\/1003","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=1003"}],"version-history":[{"count":0,"href":"https:\/\/www.fanjoe.be\/index.php?rest_route=\/wp\/v2\/posts\/1003\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.fanjoe.be\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1003"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.fanjoe.be\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1003"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.fanjoe.be\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1003"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}