Iptables

je te remercie je corrige ca.

Du coup là ou je me perds un peu c’est que forcément une connexion sortante demandera de recevoir des paquets et qu’une connexion entrante demandera d’envoyer des paquets, du coup je me suis dit qu’il fallait que ce soit un peu symétrique entre input output?

D’ailleurs si on prend l’exemple du ssl, a chaque tentative de connection à un serveur ssl il doit y avoir discussion (j’ai du voir un schéma regroupant au moins 5 étapes pour l’établissement de la connexion ssl, entre le ping et les échanges des clés…) et donc finalement pour qu’il y ait discussion comment est ce qu’une connexion peut se mettre en place si je ne fais pas d’output ssl?
c’est simplifié par iptables déjà ou je me trompe quelquepart?

j’ai essayé de lire la doc mais je n’ai pas encore tout lu et surtout, j’essais d’attaquer les problèmes dans l’ordre et de pas mettre tout mon temps dans un seul des pans de l’administration système (le but étant de mettre en ligne mon site)

edit : je précise que sans le --dport http(s) même avec l’autorisation du port 53 je n’arrive pas à utiliser apt-get

C’est exact, et tu mets le doigt sur un point important : nous raisonnons plus volontiers en termes de connexions, alors que les règles iptables s’appliquent à des paquets. La difficulté consiste souvent à faire le lien entre les connexions et les paquets. C’est pourquoi les gestionnaires de pare-feu, surcouches à iptables, permettent de manipuler des abstractions que sont les connexions en cachant le traitement des paquets individuels.

Exact encore, la symétrie que tu évoques existe bien entre les paquets émis et reçus d’une même connexion. Mais tes paires de règles INPUT et OUTPUT n’étaient pas symétriques puisque les deux se basaient sur la condition --dport donc le port destination. La symétrie aurait voulu qu’une se base sur --dport et l’autre sur --sport.

Un paquet TCP a deux ports, source et destination. En effet une connexion TCP met en oeuvre deux ports : un côté client et un côté serveur. Généralement, le port côté serveur est fixe (80 pour HTTP, 25 pour SMTP…) et le port côté client est variable (c’est pourquoi généralement les règles iptables ne s’en occupent pas). Les paquets émis par le client (reçus par le serveur) ont pour port source le port client et pour port destination le port serveur. Symétriquement, les paquets émis par le serveur (reçus par le client) ont pour port source le port serveur et pour port destination le port client. Le même raisonnement s’applique aux adresses source et destination.

Pour autoriser une connexion HTTPS, il faut accepter les paquets dans la direction initiale (INPUT ou OUTPUT selon que la connexion est entrante ou sortante) qui ont le port destination (–dport) 443. Cela est généralement bien compris. Il faut aussi accepter les paquets de réponse dans la direction opposée, qui ont le port source (–sport) 443. Mais rien ne garantit qu’un paquet ayant le port source 443 est une réponse légitime à un paquet ayant le port destination 443. C’est pourquoi on utilise l’état de suivi de connexion (-m conntrack ou -m state) ESTABLISHED qui vérifie cela automatiquement en surveillant tous les paquets émis et reçus. Au lieu de créer une règle symétrique distincte pour les paquets retour de chaque type de connexion, il est plus simple de créer une seule règle globale dans chaque direction qui accepte tous les paquets dans l’état ESTABLISHED. On en profite pour accepter aussi les paquets dans l’état RELATED, ce qui est souhaitable (à quelques exceptions près mais je ne souhaite pas entrer dans des détails compliqués).

En procédant ainsi, on se retrouve avec des règles génériques autorisant les paquets des connexions existantes dans chaque direction, et on n’a plus qu’à ajouter des règles spécifiques autorisant le premier paquet de chaque type de connexion voulu. Au final, c’est un peu comme si on n’avait à s’occuper que des connexions et pas des paquets individuels. Je suppose que c’est la simplification que tu évoquais.

Mais il reste encore une tâche non négligeable : déterminer de quelles connexions on a besoin dans chaque direction. Si on pense facilement aux protocoles applicatifs comme HTTP, on oublie plus souvent les protocoles “utilitaires” comme DNS. Dans l’absolu HTTP n’a pas besoin de DNS, mais on en besoin si les noms des sites sont résolus par DNS ; on n’en a pas besoin si on accède uniquement à des sites par adresse IP ou si tous les noms sont connus en local dans /etc/hosts.

je te remercie, je comprends beaucoup mieux le fonctionnement du parefeu.

et donc vu que la requête DNS se lance de serveur à serveur, le sport et le dport est le même c’est pour ca que dans la règle je peux aussi bien mettre --sport que --dport !

Est ce que quelqu’un sait comment récupérer la liste d’ip necessaire à l’apt-get? histoire de filtrer les connexion sortante sur le port 80?
voici mons sources.list

C’est ce que j’ai cherché hier pendant une heure ! Plus moyen de mettre la main dessus(du coup je t’avais posté les autres liens d’aide), mais la liste existe il me semble. Sinon, en attendant, tu coupes Iptables, tu lances un terminal root, et tu tapes :

Tu le laisses défiler, une fois fini tu fais celle-ci :

Tu regardes quelles sont les ip des deux connexions en [mono]TIME_WAIT[/mono], tu auras donc deux adresses ip à autoriser via le port 80. À noter que pour n’avoir que ces deux seules adresses IP avec [mono]netstat[/mono], tu coupes ton navigateur plusieurs secondes, pour que les autres IP s’effacent de [mono]netstat[/mono] et ne viennent pas encombrer tes résultats [mono]TIME_WAIT[/mono], à plus.

Non, non. Double erreur.

  1. Les termes de “client” et “serveur” ne font pas référence à la fonction générale d’une machine mais à leur rôle vis-à-vis d’une connexion donnée. Le client est la machine qui initie la connexion, et le serveur est la machine qui écoute et reçoit la connexion. Quand ta machine fait une requête DNS, elle a un rôle de client pour cette connexion DNS qu’elle initie et n’utilise pas le port source 53 mais un port quelconque. Quand elle se connecte à un miroir Debian pour télécharger des paquets, elle a un rôle de client pour cette connexion HTTP qu’elle initie et n’utilise pas le port source 80 mais un port quelconque.

  2. On n’a quasiment jamais besoin d’utiliser --sport dans les règles de filtrage. En tout cas pas dans la règle qui autorise le premier paquet d’une connexion, dont le port source est par nature variable. Une règle avec le port source comme seul critère est généralement une faille de sécurité, surtout en entrée (INPUT).

Il y a deux moyens, à appliquer pour chaque miroir présent dans le sources.list. A noter qu’un nom de serveur peut avoir plusieurs adresses IP.

  1. Utiliser le nom d’hôte du miroir Debian dans la règle iptables au lieu de l’adresse IP. Cela donnera lieu à une résolution de nom qui créera une règle pour chaque adresse IP retournée.

  2. Faire une résolution du nom d’hôte du miroir Debian par tout moyen (host, dig, nslookup, getent…) et créer une règle pour chaque adresse retournée.