• Aucun résultat trouvé

Paquets NEW non-SYN

Dans le document Iptables Tutorial 1.2.2 (Page 148-176)

B. Problèmes et questions courants

B.2. Paquets NEW non-SYN

seront autorisés dans certaines circonstances mais dans 99% des cas nous n'en aurons pas besoin. Nous pouvons les journaliser et ensuite les supprimer.

La raison pour laquelle nous rejetons les paquets SYN/ACK qui sont considérés comme NEW est très simple. C'est décrit en détail dans la section SYN/ACK et les paquets NEW de l'annexe Annexe B, Problèmes et questions courants.

13.2.6.2. La chaîne allowed

Si un paquet de type TCP arrive sur l'interface $INET_IFACE, il traverse la chaîne tcp_packets et si la connexion est sur un port sur lequel nous voulons autoriser le trafic, nous ferons certaines vérifications finales sur ce port pour savoir s'il est actuellement autorisé ou non. Toutes ces vérifications finales sont faites dans la chaîne allowed.

En premier, nous vérifions si le paquet est un paquet SYN. Si c'est le cas, il y a de fortes chances pour que ce soit le premier paquet d'une nouvelle connexion, nous l'autorisons. Ensuite nous vérifions si le paquet provient d'une connexion ESTABLISHED ou RELATED, et si c'est encore le cas nous l'autorisons aussi. Une connexion ESTABLISHED est une connexion qui a observé le trafic dans les deux sens, et donc nous avons un paquet SYN, cette connexion doit être dans l'état ESTABLISHED, selon la machine d'état. La dernière règle dans cette chaîne DROP tout le reste. Dans ce cas ceci indique que tout le trafic n'a pas été forcément observé dans les deux directions, i.e., nous n'avons pas répondu au paquet SYN, ou qu'il y a eu une tentative de connexion sans paquet SYN. Il n'y a pas, dans la pratique, de démarrage de connexion sans paquet SYN, sauf dans le cas où des personnes font du balayage de port. Actuellement, il n'y a pas d'implémentation TCP/IP qui supporte l'ouverture d'une connexion TCP avec autre chose qu'un paquet SYN à ma connaissance, donc nous faisons un DROP car nous sommes à 99% sûrs qu'il s'agit alors d'un scan de port.

Note

La chaîne concernant les paquets ESTABLISHED,RELATED est actuellement redondante dans ce script et ne sera pas utilisée, mais elle a été inclue pour que l'exemple soit complet. La règle qui sera utilisée est placée au début de la chaîne INPUT, et contient ESTABLISHED,RELATED.

13.2.6.3. La chaîne TCP

La chaîne tcp_packets spécifie quels ports provenant de l'Internet sont autorisés dans le pare-feu. Il y a cependant, quelques vérifications supplémentaires à faire, ainsi nous envoyons chaque paquet vers la chaîne autorisée, comme décrit précédemment.

-A tcp_packets indique à iptables dans quelle chaîne ajouter la nouvelle règle, celle-ci étant ajoutée à la fin de la chaîne. -p TCP indique d'examiner les paquets TCP et -s 0/0 examine toutes les adresses source provenant de 0.0.0.0 avec un masque de réseau de 0.0.0.0, en d'autres termes toutes les adresses source. C'est le comportement par défaut mais je l'utilise ici pour rendre les choses les plus claires possibles. --dport 21 indique le port de destination 21, si le paquet est destiné au port 21 il est aussi vérifié. Si tous les critères correspondent, le paquet sera dirigé vers la chaîne

Fichier rc.firewall

autorisée. S'ils ne correspondent à aucune des règles, ils seront renvoyés à la chaîne qui a expédié le paquet vers la chaîne tcp_packets.

Comme cela maintenant, il autorise le port TCP 21, ou le port de contrôle FTP, qui sert à contrôler les connexions FTP et plus tard les connexions RELATED, ainsi nous autorisons les connexions PASSIVE et ACTIVE car le module ip_conntrack_ftp est chargé. Si nous ne voulons pas du tout autoriser le FTP, nous pouvons décharger le module ip_conntrack_ftp et supprimer la ligne $IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 21 -j allowed du fichier rc.firewall.txt.

Le port 22 est le port SSH, il est beaucoup mieux de l'utiliser que de permettre le telnet sur le port 23 si vous voulez autoriser quelqu'un de l'extérieur à utiliser un shell sur votre machine. Notez que c'est toujours une mauvaise idée de permettre à quelqu'un d'autre que vous même d'avoir accès à une machine pare-feu.

Le port 80 est le port HTTP, en d'autres termes votre serveur web, supprimez le si vous ne voulez pas exécuter un serveur web directement sur votre pare-feu.

Enfin, nous autorisons le port 113, qui est le IDENTD et peut être nécessaire pour certains protocoles comme IRC, etc. Notez qu'il peut être intéressant d'utiliser le paquetage oidentd si vous faites du NAT sur plusieurs hôtes de votre réseau local. oidentd possède un support pour faire du relais des requêtes IDENTD vers les bonnes machines de votre réseau local.

Si vous voulez ajouter d'autres ports dans ce script, c'est le moment. Simplement, copiez et collez une des autres lignes de la chaîne tcp_packets et modifiez la en fonction des ports que vous voulez ouvrir.

13.2.6.4. La chaîne UDP

Si nous obtenons un paquet UDP dans la chaîne INPUT, nous l'envoyons alors vers udp_packets où il sera de nouveau sélectionné pour le protocole UDP avec -p UDP et ensuite examiné avec l'adresse source 0.0.0.0 et le masque de réseau 0.0.0.0. Sauf que cette fois, nous n'acceptons que les ports UDP spécifiques que nous voulons ouvrir pour les hôtes de l'Internet. Notez que nous ne créons pas de trous sur le port source des hôtes expéditeurs, car il en sera pris soin par la machine d'état. Nous n'avons besoin d'ouvrir des ports sur notre hôte que si nous devons faire tourner un serveur sur un port UDP, comme le DNS, etc. Les paquets entrants dans le pare-feu et qui font partie d'une connexion déjà établie (par notre réseau local) seront automatiquement acceptés par les règles --state ESTABLISHED,RELATED au début de la chaîne INPUT.

Ainsi, nous ne plaçons pas le ACCEPT sur les paquets UDP entrants provenant du port 53, celui qui est utilisé pour le DNS. La règle existe mais elle est commentée par défaut. Si vous voulez que votre pare-feu agisse comme serveur DNS, décommentez la.

J'ai personnellement autorisé le port 123, port NTP ou network Time Protocol. Ce protocole est utilisé pour synchroniser l'horloge de votre machine avec des serveurs de temps qui sont très précis. La plupart d'entre vous n'utilise sans doute pas ce protocole et je ne l'ai donc pas autorisé par défaut. Il suffit aussi de décommenter la règle pour l'activer.

Nous n'autorisons pas le port 2074, utilisé par certains programmes multimedia comme speak freely qui servent à parler avec d'autres personnes en temps réel en utilisant des haut-parleurs et des microphones, ou même un casque d'écoute. Si vous voulez vous en servir décommentez simplement la ligne.

Le port 4000 est celui du protocole ICQ. C'est un protocole très bien connu qui est utilisé par le programme Mirabilis nommé ICQ. Il existe au moins 2 ou 3 clones de ICQ pour Linux et c'est un des programmes de chat les plus utilisés dans le monde. Je doute qu'il soit besoin d'en expliquer d'avantage.

À ce point, deux règles supplémentaires sont disponibles si vous avez fait l'expérience de certaines entrées de journaux dans certaines circonstances. La première règle bloque la diffusion des paquets vers les ports de destination 135 à 139.

Ils sont utilisés par NETBIOS, ou SMB pour les utilisateurs de Microsoft. Ceci bloque toutes les entrées de journaux provenant de iptables qui journalise l'activité de réseaux Microsoft à l'extérieur de notre pare-feu. La seconde règle a été créée pour prévenir les problèmes de journalisation excessive, et prend soin des requêtes DHCP provenant de l'extérieur. Ceci est particulièrement vrai si votre réseau extérieur est de type Ethernet non-commuté, dans lequel les clients obtiennent leur adresses IP par DHCP. Dans ces circonstances vous pouvez avoir beaucoup d'entrées de journal juste pour ça.

Fichier rc.firewall Note

Notez que ces deux dernières règles sont désactivées car certaines personnes peuvent être intéressées par ce genre de logs. Si vous rencontrez des problèmes avec une journalisation excessive, essayez de supprimer ce type de paquetages à ce niveau. Il y a aussi beaucoup de règles de ce type juste avant les règles de log dans la chaîne INPUT.

13.2.6.5. La chaîne ICMP

C'est là que nous décidons quels types ICMP autoriser. Si un paquet de type ICMP arrive sur eth0 dans la chaîne INPUT, nous le redirigeons vers la chaîne icmp_packets comme expliqué plus haut. Ici nous consignons quels types ICMP autoriser. Pour le moment, j'autorise seulement les requêtes écho ICMP entrantes, TTL égale 0 pendant le transit et TTL égale 0 pendant le réassemblage. La raison pour laquelle nous n'autorisons aucun autre type ICMP par défaut, est que la plupart des autres types ICMP seront pris en charge par les règles d'état RELATED.

Note

Si un paquet ICMP est envoyé en réponse à un paquet déjà existant il est considéré comme RELATED par rapport au flux d'origine. Pour plus d'information sur les états, voir le chapitre La machine d'état.

La raison pour laquelle j'autorise ces paquets ICMP est la suivante, les Requêtes Écho servent aux réponses écho, utilisées principalement pour "pinguer" d'autres hôtes, pour voir s'ils sont disponibles sur les réseaux. Sans cette règle, d'autres hôtes ne pourraient pas nous "pinguer" pour vérifier que nous sommes présent dans une connexion réseau. Notez que certaines personnes ont tendance à supprimer cette règle, car ils ne veulent pas être vus sur Internet.

Supprimer cette règle rend effectivement inefficace tous les pings vers notre pare-feu depuis l'Internet car le pare-feu ne répondra tout simplement pas.

Time Exceeded (i.e., TTL égale 0 pendant le transit et TTL égale 0 pendant le réassemblage), est autorisé dans le cas où nous voulons faire du traçage de route sur certains hôtes ou si un paquet a un TTL placé à 0, nous obtiendrons une réponse en retour. Par exemple, quand vous faites un traceroute sur quelqu'un, vous commencez avec un TTL = 1, et il obtient en retour un 0 au premier saut de son chemin, et un Time Exceeded est envoyé depuis la première passerelle de la route vers l'hôte que vous voulez tracer, ensuite le TTL = 2 et la seconde passerelle envoie un Time Exceeded, et ainsi de suite jusqu'à ce que vous obteniez une réponse de l'hôte que vous vouliez joindre. De cette façon nous obtenons une réponse de chaque hôte sur notre chemin, et pouvons voir quel hôte ne répond pas.

Pour une liste complète de tous les types ICMP, voir l'annexe Types ICMP. Pour plus d'information sur ICMP lisez les documents et rapports :

• RFC 792 - Internet Control Message Protocol par J. Postel.

Note

Une erreur peut apparaître chez vous quand vous bloquez certains types ICMP, mais dans mon cas tout fonctionne parfaitement quand je bloque tous les types ICMP non autorisés.

13.2.7. Chaîne INPUT

La chaîne INPUT, utilise la plupart du temps les autres chaînes pour faire le plus gros du travail. De cette façon nous n'avons pas trop de charge provenant d'iptables, qui fonctionnera mieux sur les machines lentes. Ceci se fait en vérifiant les détails spécifiques qui peuvent être identiques pour beaucoup de paquets différents, et ensuite en envoyant ces paquets dans les chaînes spécifiées par l'utilisateur. En faisant ça, nous réduisons notre table de règles qui ne contient que le nécessaire pour le transit des paquets, et donc le pare-feu aura moins de charge pour filtrer les paquets.

En premier nous vérifions les mauvais paquets. Ceci est réalisé en envoyant tous les paquets TCP vers la chaîne bad_packets. Cette chaîne contient des règles qui examinent les paquets mal formés ou d'autres anomalies. Pour une explication complète sur la chaîne bad_tcp_packets, regardez dans La chaîne bad_tcp_packets de ce chapitre.

Fichier rc.firewall

À ce niveau nous recherchons le trafic généré par les réseaux de confiance. Ce qui inclut l'adaptateur réseau et tout le trafic provenant de celui-ci, ainsi que le trafic entrant et sortant de la boucle locale (loopback), avec toutes les adresses IP assignées (toutes les adresses y compris notre adresse IP Internet). Ainsi, nous avons choisi de placer la règle qui autorise l'activité du LAN vers le pare-feu en premier, car notre réseau local génère plus de trafic que la connexion Internet. Ceci permet d'avoir moins de charge système pour examiner chaque paquet avec chaque règle, et c'est toujours une bonne idée de regarder quel type de trafic traverse principalement le pare-feu. En faisant cela nous rendons les règles plus efficaces, avec moins de charge sur le pare-feu et moins de congestion sur notre réseau.

Avant de nous attaquer aux règles "réelles" dans lesquelles nous déciderons quoi autoriser depuis l'Internet, nous avons placé une règle pour réduire la charge système. C'est une règle d'état qui autorise tous les paquets d'un flux ESTABLISHED ou RELATED vers l'adresse IP Internet. Cette règle a une équivalence dans la chaîne autorisée, qui est redondante à celle-ci. Cependant, la règle --state ESTABLISHED,RELATED dans la chaîne autorisée a été conservée pour plusieurs raisons, vous pouvez donc copier-coller cette fonction.

Après ça, nous sélectionnons tous les paquets TCP de la chaîne INPUT qui arrivent dans l'interface $INET_IFACE, et les envoyons vers tcp_packets, comme précédemment décrit. Nous faisons maintenant la même chose pour les paquets UDP sur l'interface $INET_IFACE et les envoyons vers la chaîne udp_packets, ensuite tous les paquets ICMP sont envoyés vers la chaîne icmp_packets. Normalement, un pare-feu devrait être plus difficile à attaquer par des paquets TCP, que par des paquets UDP et ICMP. C'est le cas normal, mais souvenez vous, ça peut être différent pour vous. La même chose peut être observée ici, comme avec les règles réseau spécifiques. Lesquelles génèrent le plus de trafic ? Sur les réseaux générant un important volume de données, c'est une absolue nécessité de vérifier cela, car une machine de type Pentium III peut être saturée par une simple table de règles contenant 100 règles avec une carte réseau ethernet 100 Mbit fonctionnant à sa pleine capacité, si la table de règles est mal écrite. Il est important de regarder ça de près.

Ici nous avons une règle supplémentaire, qui est par défaut désactivée, et qui peut être utilisée pour évitez une journalisation excessive dans le cas où nous avons un réseau Microsoft à l'extérieur de notre pare-feu Linux. Les clients Microsoft ont la mauvaise habitude d'envoyer des tonnes de packets multicast vers la plage 224.0.0.0/8, donc nous avons la possibilité de bloquer ces paquets ici. Il existe deux autres règles faisant à peu près la même chose sur la chaîne udp_packets décrite dans La chaîne UDP.

Avant de tester la stratégie par défaut de la chaîne INPUT, nous la journalisons pour savoir s'il existe des problèmes/

bugs. Ce peut être soit un paquet que nous ne voulons pas autoriser, soit une chose qui peut se révéler néfaste pour nous, ou finalement un problème dans notre pare-feu qui n'autorise pas le trafic qui devrait être autorisé. Nous ne journalisons pas plus de 3 paquets par minute car nous ne voulons pas surcharger nos journaux, ainsi nous plaçons un préfixe pour toutes les entrées de journalisation et savons donc d'où ils proviennent.

Tout ce qui n'a pas été capturé sera DROPé par la stratégie par défaut de la chaîne INPUT. Voir la section Mise en place des actions par défaut dans ce chapitre.

13.2.8. Chaîne FORWARD

La chaîne FORWARD contient quelques règles dans notre scenario. Nous avons une seule règle qui envoie tous les paquets vers la chaîne bad_tcp_packets, laquelle est également utilisée dans la chaîne INPUT comme décrit précédemment. La chaîne bad_tcp_packets est construite de façon qu'elle puisse être utilisée dans plusieurs chaînes, sans regarder quel paquet la traverse.

Après cette vérification des mauvais paquets TCP, nous avons les règles principales dans la chaîne FORWARD. La première règle autorise tout le trafic depuis notre $LAN_IFACE vers n'importe quelle autre interface librement, sans restrictions. En d'autres termes, cette règle autorise tout le trafic depuis le LAN vers l'Internet. La seconde règle autorise le trafic en retour ESTABLISHED et RELATED à travers le pare-feu. Ce qui veut dire qu'elle autorise les connexions initiées par notre réseau local à circuler librement dans le LAN. Ces règles sont nécessaires pour que notre réseau local puisse accéder à l'Internet, car la stratégie par défaut de la chaîne FORWARD est placée à DROP. C'est adroit, car elle autorise les hôtes de notre réseau local à se connecter à des hôtes sur Internet, mais en même temps elle bloque les hôtes depuis Internet leur interdisant de se connecter aux hôtes de notre réseau interne.

Enfin, nous avons également une chaîne de journalisation pour tous les paquets qui ne sont pas autorisés dans un sens ou dans l'autre à traverser la chaîne FORWARD. Ceci concerne principalement les paquets mal formés ou autre

Fichier rc.firewall

problème. Une cause peut être une attaque de cracker, et une autre des paquets mal formés. C'est exactement la même règle que celle utilisée dans la chaîne INPUT sauf pour le préfixe de journalisation, "IPT FORWARD packet died:

". Le préfixe de journalisation est principalement utilisé pour séparer les entrées de journaux, et peut être utilisé pour savoir d'où les paquets ont été journalisés et connaître certaines options d'en-tête.

13.2.9. Chaîne OUTPUT

Comme nous utilisons notre machine en partie comme pare-feu et en partie comme station de travail, nous autorisons tout ce qui sort de cette machine qui a une adresse source $LOCALHOST_IP, $LAN_IP ou $STATIC_IP. Enfin nous journalisons tout ce qui est DROPé. S'il y a des paquets DROPés, nous voulons savoir quelle action entreprendre contre ce problème. Soit c'est une erreur, soit c'est un paquet mystérieux qui peut être usurpé. Enfin nous DROPons le paquet dans la stratégie par défaut.

13.2.10. Chaîne PREROUTING de la table nat

La chaîne PREROUTING fait à peu près ce qu'elle indique, elle traduit les adresses réseau sur les paquets avant la décision de routage qui les envoie vers les chaînes INPUT ou FORWARD dans la table de filtrage. La seule raison que nous avons de parler de cette chaîne ici est que nous ne faisons aucun filtrage dans celle-ci. La chaîne PREROUTING est traversée seulement par le premier paquet d'un flux, ce qui veut dire que tous les autres paquets ne seront pas examinés dans cette chaîne. Dans ce script, nous n'utilisons pas du tout la chaîne PREROUTING, cependant, c'est le bon endroit si nous voulons faire du DNAT sur des paquets spécifiques, par exemple si nous voulons héberger notre serveur web dans notre réseau local. Pour plus d'information sur la chaîne PREROUTING, lire le chapitre Traversée des tables et des chaînes.

Attention

La chaîne PREROUTING ne doit pas être utilisée pour quelque filtrage que ce soit, car parmi d'autres choses, elle n'est traversée que par le premier paquet d'un flux. Elle devrait être utilisée uniquement pour

La chaîne PREROUTING ne doit pas être utilisée pour quelque filtrage que ce soit, car parmi d'autres choses, elle n'est traversée que par le premier paquet d'un flux. Elle devrait être utilisée uniquement pour

Dans le document Iptables Tutorial 1.2.2 (Page 148-176)