Netfiler-rules

Toutes nos machines son connectées à Internet avec tous les dangers que cela comprend : scan de ports, scan de failles, tentative de brute force SSH… Et avec IPv6, en particulier, par définition vos ordinateurs possèdent une adresse publique donc vous êtes directement sur internet sans filtrage sauf si votre firewall/box est correctement configuré et s’en occupe.

La première chose à faire consiste à filtrer un minimum nos machines avec Iptables.

Configuration du noyau

Genkernel

Si votre noyau est compilé avec genkernel vous pouvez aller directement aux parties iptables et ip6tables.

Manuelle

Dans un premier temps, il vous faudra modifier la configuration du noyau afin d’y activer les supports nécéssaires au bon fonctionement iptables.

IPv4

Networking  --->
  [*] Networking support
    Networking options  --->
      <*> Packet socket
      [*]   Packet socket: mmapped IO
      [*]   IP: multicasting
        QoS and/or fair queueing  --->
          [*] QoS and/or fair queueing
          <M>   Hierarchical Token Bucket (HTB)
          <M>   Ingress Qdisc
       [*] Network packet filtering framework (Netfilter)  --->
          Core Netfilter Configuration  --->
           <*> Netfilter netlink interface
           <*> Netfilter NFQUEUE over NFNETLINK interface
           <*> Netfilter LOG over NFNETLINK interface
           <*> Netfilter connection tracking support
          Netfilter connection tracking support (Layer 3 Independent Connection tracking)  --->
           [*] Connection tracking flow accounting
           [*] Connection mark tracking support
           [*] Connection tracking events (EXPERIMENTAL)
           <M> FTP protocol support
           <M> IRC protocol support
           <*> Connection tracking netlink interface (EXPERIMENTAL)
           --- Netfilter Xtables support (required for ip_tables)
           <M>   Multiple port match support
           <M>   "state" match support
        IP: Netfilter Configuration  --->
          <*> Connection tracking (required for masq/NAT)
          [*]   Connection tracking flow accounting
          [*]   Connection mark tracking support
          <*> IPv4 connection tracking support (required for NAT)
          [*]   proc/sysctl compatibility with old connection tracking
          <*> IP tables support (required for filtering/masq/NAT)
          <M>   IP range match support
          <M>   Owner match support
          <M>   address type match support
          <*>   Packet filtering
          <M>     REJECT target support
          <M>   LOG target support
          <*>   Full NAT
          <M>     MASQUERADE target support
          <M>     REDIRECT target support
          <*>   Packet mangling

IPv6

[*] Networking support  --->
  Networking options  --->
    [*] Network packet filtering framework (Netfilter)  --->
      IPv6: Netfilter Configuration  --->
        <*> IPv6 connection tracking support
        <*> IP6 tables support (required for filtering)
        <M>   "ipv6header" IPv6 Extension Headers Match
        <M>   "rt" Routing header match support
        <M>   LOG target support
        <*>   Packet filtering
        <M>     REJECT target support
        <*>   Packet mangling

Recompilez et installez ce noyau et redemarez le système.

Iptables

Tout d’abord, installons le paquet net-firewall/iptables:

emerge -av net-firewall/iptables

Je vous propose une gestion simplifiée iptables avec :

un script netfilter-rules et un fichier de configuration netfilter-rules.conf.

cp netfilter-rules /etc/init.d
chmod +x /etc/init.dnetfilter-rules
cp netfilter-rules.conf /etc

Editez le fichier de configuration /etc/netfilter-rules.conf:

### configuration generale
# on autorise tout sur ces interfaces
# (laissez toujours la boucle locale)
all="lo"
# on autorise le ping sur ces interfaces
ping="eth0 eth1"
# mais plus specifiquement par protocole, par interface et par port
interfaces_TCP="eth0+21+22+25+53+80+443+873+993+4080 eth1+22+25+873+993"
interfaces_UDP="eth0+53+68"
# a l'exception de tout ce qui vient de ces reseaux
exceptions="192.168.0.0/24"
# log t'on les packets droppés ?
logdrop="false"


### configuration passerelle
gateway="true"
# interface externe 
extif="eth1"
# interface interne 
intif="eth0"

### Dr : exemples interdictions specifiques par IP source (a destination du port 25)
#iptables -A INPUT -p tcp --dport 25 -j LOGDROP -s x.x.x.x
#iptables -A INPUT -p tcp --dport 25 -j LOGDROP -s x.x.x.x/x

Ce dernier me parait suffisament bien renseigné pour ne rien avoir à y ajouter… Une fois les modifications faites selon vos besoins, éxecutez le script:

/etc/init.d/netfilter-rules restart

S’il n’y a aucun message, c’est que le script s’est bien déroulé.

Démarrez le firewall:

/etc/init.d/iptables save 
/etc/init.d/iptables start
rc-update add iptables default

Vérifiez que vos règles ont bien été appliquées:

iptables -L -v -n

Après chaque modification dans le fichier /etc/netfilter-rules.conf, n’oubliez pas de relancer le script netfilter-rules

Il ne reste plus qu’à s’assurer que le script se lance automatiquement au démarrage du système. Pour ce faire, éditez le fichier /etc/conf.d/local.start et mettez la ligne correspondante au chemin du script netfilter-rules, ex:

/etc/init.d/netfilter-rules start

Ip6tables

Récupérez le script net6filter-rules et le fichier de configuration net6filter-rules.conf.

Ensuite toutes les manipulations sont rigoureusement les mêmes que pour le script IPv4 hormis ip6tables et net6filter-rules…

Options

Fail2ban

Cette partie est optionnelle.

dim. juin 5 20:30:30 CEST 2011 : Fail2ban ne supporte pas IPv6.

Si comme moi vous aimez pouvoir vous connecter sur votre passerelle depuis n’importe où, vous laisserez probablement l’accés SSH ouvert. Dans ce cas, vous vous retrouverez vite avec des logs pleins de tentatives de connexion d’utilisateurs pour le moins farfelus… Alors, fail2ban va ajouter une chaine dans iptables afin de bloquer une adresse IP après 5 tentavives ratées et ce pendant 600 secondes. Bien sûr, ces valeurs sont paramétrables.

echo "net-analyzer/fail2ban" >> /etc/portage/package.keywords
emerge -av net-analyzer/fail2ban

Editez le fichier de configuration /etc/fail2ban/jail.conf en modifiant le chemin de vos fichiers de logs:

[sshd]
enabled = true
logfile = /var/log/auth.log
[...]

Lancez le service:

/etc/init.d/fail2ban start
rc-update add fail2ban default

Remerciements

Je remercie en particulier Didier Rebeix pour le script de gestion simplifiée d’ iptables fort pratique, et qui m’a permis de comprendre le fonctionement d’ iptables

Liens