Forum Linux.debian/ubuntu Iptables - Ip6tables - avis

Posté par  . Licence CC By‑SA.
Étiquettes :
0
1
mai
2019

Bonjour bonjour !

Après avoir créé un thread pour la configuration, je me permet d'en créer un nouveau pour recueillir vos avis et optimisations, vu que l'on commençait à s'y perdre avec la tonne de message du premier thread.

Alors, vos avis ? Merci d'avance !

Voilà donc à quoi ressemble la configuration :

#!/bin/bash
#iptables-restore < /etc/iptables.test.rules

iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP 

# Autorise les connexions déjà établies et localhost       
iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT    
iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT   
iptables -A INPUT -i lo -j ACCEPT


#TOR
iptables -A OUTPUT -p tcp -m tcp --dport 9050 -m state --state NEW -j ACCEPT

# ICMP (Ping)                   
iptables -A INPUT -p icmp -j DROP           
iptables -A OUTPUT -p icmp -j DROP

# DNS                     
iptables -A OUTPUT -p tcp --dport 53 -m state --state NEW -j ACCEPT         
iptables -A OUTPUT -p udp --dport 53 -m state --state NEW -j ACCEPT           

# HTTP                      
iptables -A OUTPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT

# HTTPS
iptables -A OUTPUT -p tcp --dport 443 -m state --state NEW -j ACCEPT          

# Mail SMTP 
iptables -A OUTPUT -p tcp --dport 25 -m state --state NEW -j ACCEPT  

#Transmission
iptables -A INPUT -p udp --dport 51413 -m state --state NEW -j ACCEPT
iptables -A OUTPUT -p udp --sport 51413 -m state --state NEW -j ACCEPT

# NTP (horloge du serveur) 
iptables -A OUTPUT -p udp --dport 123 -m state --state NEW -j ACCEPT  

# On log les paquets en entrée.
iptables -A INPUT -j LOG

# On log les paquets en sortie.
iptables -A OUTPUT -j LOG

# On log les paquets forward.
iptables -A FORWARD -j LOG 


ip6tables -F
ip6tables -X
ip6tables -t nat -F
ip6tables -t nat -X
ip6tables -t mangle -F
ip6tables -t mangle -X
ip6tables -P INPUT DROP
ip6tables -P FORWARD DROP
ip6tables -P OUTPUT DROP 


# Autorise les connexions déjà établies et localhost       
ip6tables -A INPUT -m state --state ESTABLISHED -j ACCEPT   
ip6tables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT  
ip6tables -A INPUT -i lo -j ACCEPT


ip6tables -A INPUT -p icmpv6 --icmpv6-type router-advertisement -m state --state UNTRACKED -m hl --hl-eq 255 -j ACCEPT
ip6tables -A INPUT -p icmpv6 --icmpv6-type neighbour-advertisement -m state --state UNTRACKED -m hl --hl-eq 255 -j ACCEPT
ip6tables -A INPUT -p icmpv6 --icmpv6-type neighbour-solicitation -m state --state UNTRACKED -m hl --hl-eq 255 -j ACCEPT
ip6tables -A OUTPUT -p icmpv6 --icmpv6-type router-solicitation -m state --state UNTRACKED -m hl --hl-eq 255 -j ACCEPT
ip6tables -A OUTPUT -p icmpv6 --icmpv6-type neighbour-advertisement -m state --state UNTRACKED -m hl --hl-eq 255 -j ACCEPT
ip6tables -A OUTPUT -p icmpv6 --icmpv6-type neighbour-solicitation -m state --state UNTRACKED -m hl --hl-eq 255 -j ACCEPT
ip6tables -A INPUT -p icmpv6 -j DROP
ip6tables -A OUTPUT -p icmpv6 -j DROP

#TOR
ip6tables -A OUTPUT -p tcp -m tcp --dport 9050 -m state --state NEW -j ACCEPT

# DNS                     
ip6tables -A OUTPUT -p tcp --dport 53  -m state --state NEW -j ACCEPT         
ip6tables -A OUTPUT -p udp --dport 53  -m state --state NEW -j ACCEPT           

# HTTP                      
ip6tables -A OUTPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT        

# HTTPS
ip6tables -A OUTPUT -p tcp --dport 443 -m state --state NEW -j ACCEPT         

# Mail SMTP 
ip6tables -A OUTPUT -p tcp --dport 587 -m state --state NEW -j ACCEPT

#Transmission
ip6tables -A INPUT -p udp --dport 51413 -m state --state NEW -j ACCEPT
ip6tables -A OUTPUT -p udp --sport 51413 -m state --state NEW -j ACCEPT

# NTP (horloge du serveur) 
ip6tables -A OUTPUT -p udp --dport 123 -m state --state NEW -j ACCEPT 

# On log les paquets en entrée.
ip6tables -A INPUT -j LOG

# On log les paquets en sortie.
ip6tables -A OUTPUT -j LOG

# On log les paquets forward.
ip6tables -A FORWARD -j LOG 

exit 0
  • # mettre la bonne syntaxe quand on colle du code sur linuxfr

    Posté par  . Évalué à 3.

    si le code est en python, mettre
    ```python
    [… le code …]
    ```

    si c'est du code C
    ```C
    [… le code …]
    ```

    si c'est du shell

    ```sh
    [… le code …]
    ```

  • # Bash

    Posté par  . Évalué à 1. Dernière modification le 03 mai 2019 à 12:27.

    Par les devs de netfilter : https://gist.github.com/Thermi/70c9d77dc96523885e81e3f86f59f587

    Pour faire un script bash c'est mieux de faire comme ça : http://sfvlug.editthis.info/wiki/Things_You_Should_Know_About_Netfilter#Use_iptables-save_and_iptables-restore

    D'ailleurs en regardant le script, il vaut mieux faire un ruleset car tu n'utilise pas bash et ça peut exploser.

    et d'utiliser iptables-apply parce qu'on est pas kamikaze. Et pour reset : https://github.com/QueuingKoala/netfilter-samples/tree/master/reset-rules

    • [^] # Re: Bash

      Posté par  . Évalué à 1.

      • [^] # Re: Bash

        Posté par  . Évalué à 1.

        Je suis perdu. Mes règles sont pourtant bien appliquées ! Mais il y a une période de latence, si je comprend bien, où la machine est connectée au réseau sans que les règles soient appliquées ?

        Je ne comprend juste pas. Configuré comme il est, mon script s'applique avant la connexion en network, non ?

        Et je vois deux manière d'utiliser save et restore :

        Entrer ses règles, faire un iptables-save > /etc/iptables.rules.
        Puis iptables-restore < /etc/iptables_rules en haut du script, à placer soit dans /etc/network/if-pre-up.d/iptables, soit directement dans /etc/network.

        Selon la doc officielle debian.

        Ou faire un script avec les * et commit comme indiqué dans ton lien, mais comment faire pour qu'il soit appliqué au bon moment au démarrage ?

        Je suis perdu.

  • # Mon opinion

    Posté par  . Évalué à 2.

    Ce n'est forcément pas exhaustif mais quelques remarques en vrac :

    • Bloquer tout l'icmp va t'empêcher d'avoir des détections d'erreurs bien utiles en IPv4 (host unreachable par exemple) (vu que tu n'autorises par les connexions en state RELATED).
    • En IPv6, autoriser les RA et les NS est un bon début. Mais tu dois récupérer au minimum également les erreurs de paquets "too big", sous peine de casser pas mal de trucs si ta MTU n'est pas la même que le destinataire
    • Les règles de log me semblent un poil absurdes, n'importe qui pourrait mettre la machine à genoux en visant des ports non-autorisés. Autant en OUTPUT en mode "parano" ça peut se comprendre, autant en INPUT c'est prendre des risques
    • Tu peux aussi utiliser l'option multiport pour réduire le nombre de règles parfois
    • [^] # Re: Mon opinion

      Posté par  . Évalué à 1. Dernière modification le 03 mai 2019 à 16:54.

      Tout fonctionne sans, donc je garde ces règles pour mon usage de base. J'ai un autre set de règles autorisant :

      ip6tables -A INPUT -p icmpv6 --icmpv6-type destination-unreachable -m state --state RELATED -j ACCEPT
      ip6tables -A INPUT -p icmpv6 --icmpv6-type packet-too-big -m state --state RELATED -j ACCEPT
      ip6tables -A INPUT -p icmpv6 --icmpv6-type time-exceeded -m state --state RELATED -j ACCEPT 
      ip6tables -A INPUT -p icmpv6 --icmpv6-type parameter-problem -m state --state RELATED -j ACCEPT
      
      ip6tables -A OUTPUT -p icmpv6 --icmpv6-type destination-unreachable -m state --state RELATED -j ACCEPT
      ip6tables -A OUTPUT -p icmpv6 --icmpv6-type packet-too-big -m state --state RELATED -j ACCEPT
      ip6tables -A OUTPUT -p icmpv6 --icmpv6-type time-exceeded -m state --state RELATED -j ACCEPT
      ip6tables -A OUTPUT -p icmpv6 --icmpv6-type parameter-problem -m state --state RELATED -j ACCEPT
      
      ip6tables -A INPUT -p icmpv6 --icmpv6-type router-advertisement -m state --state UNTRACKED -m hl --hl-eq 255 -j ACCEPT
      ip6tables -A INPUT -p icmpv6 --icmpv6-type neighbour-advertisement -m state --state UNTRACKED -m hl --hl-eq 255 -j ACCEPT
      ip6tables -A INPUT -p icmpv6 --icmpv6-type neighbour-solicitation -m state --state UNTRACKED -m hl --hl-eq 255 -j ACCEPT
      ip6tables -A OUTPUT -p icmpv6 --icmpv6-type router-solicitation -m state --state UNTRACKED -m hl --hl-eq 255 -j ACCEPT
      ip6tables -A OUTPUT -p icmpv6 --icmpv6-type neighbour-advertisement -m state --state UNTRACKED -m hl --hl-eq 255 -j ACCEPT
      ip6tables -A OUTPUT -p icmpv6 --icmpv6-type neighbour-solicitation -m state --state UNTRACKED -m hl --hl-eq 255 -j ACCEPT
      
      ip6tables -A INPUT -p icmpv6 -j DROP
      ip6tables -A OUTPUT -p icmpv6 -j DROP
      
    • [^] # Re: Mon opinion

      Posté par  . Évalué à 1.

      Et en quoi mes règles de log peuvent mettre ma machine à genoux ?!

      • [^] # Re: Mon opinion

        Posté par  . Évalué à 1.

        Question bête, oui je comprend bien le pourquoi. Seul souci j'utilise PSAD, qui nécessite le log des INPUT. J'impose une limite à LOG ? Je me passe de PSAD ?

  • # Petit up et petite question

    Posté par  . Évalué à 1.

    Merci encore pour vos réponses.

    Du coup, j'ai fais un iptables-save une fois mon script appliqué, puis automatisé le restore au démarrage. Tout semble fonctionner.

    Pour les logs, dans la mesure ou Psad ne me donne plus d'alerte en input depuis qu'iptables est bien configuré, j'ai supprimé INPUT -j LOG.

    Les questions qui me reste sont :
    1) est-il possible d'encore rendre plus sécurisé iptables, ou je suis arrivé au bout des conseils et de mes lectures, et on ne peut guère faire mieux ?

    2) comment appliquer les règles avant la connexion à internet via le network manager ? si la solution /etc/network/if-pre-up.d/iptables n'est pas adéquate, quelle est à la bonne.

    Tout ce que je vois comme tutos, docs etc. c'est ou dans /etc/network/if-pre-up.d/iptables ou dans init.d.

    Merci d'avance !

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.