Gestion des adresses Ip dynamiques avec Iptables

Pour être honnête avec vous, j’avais pensé intitulé ce billet « Ouvrez, ouvrez la cage aux oiseaux… ».

Mais après avoir osé « PKI, PKI, oh ! PKI, PKI, ah! » sur l’air de « Rosalie », je me se suis dit que vous alliez sûrement vous poser de sérieuses questions sur ma santé mentale et surtout sur mes goûts musicaux :mrgreen: (bien que je n’ai rien de personnel contre Carlos et Pierre Perret)

Bref, donc le but de ce billet est de résoudre un problème fréquent.

Vous avez un beau serveur dédié Linux (ou un pote vous en prête un) et vous contrôler bien entendu dessus les accès réseau via Iptables.

D’ailleurs, vous utilisez peut-être même un superbe script déjà tout fait dans le genre de KHARON (comment cela je fais de la pub ???)

Vous disposez a votre domicile d’une adresse IP dynamique et bien entendu, pour fixer cela en dur dans Iptables, bah c’est la cata…

Vous jonglez donc avec Fail2ban et/ou des règles du style :


Iptables -I INPUT -p tcp --dport 22 -i eth0 -m state --state NEW -m recent --update --seconds 60
--hitcount 4 -j DROP

Voici donc une petite bidouille bien proprette pour insérer votre ip dynamique dans iptables (oublier les résolutions DNS en règles Iptables, cela ne marche pas…) et autoriser l’accès en SSH depuis votre ip dynamique.

Je suppose bien évidemment que vous utilisez déja un service comme DYNDNS ou une entrée de type DYNHOST chez OVH par exemple (ou autre hein, je suis pas sectaire).

Bref, un service permettant d’avoir un nom d’hôte pour votre ip dynamique et qui est mis à jour à intervalle régulier.

Tout d’abord, il faut créer une chaine que nous appelerons « mon_ip_maison » par exemple et l’insérer au début de la chaine INPUT d’iptables.

A rajouter donc dans votre script Iptables ou à la main comme ceci :

iptables -N mon_ip_maison
iptables -I INPUT 1 -j mon_ip_maison

Reste à écrire le joli script de mise à jour que j’appellerais ici : Wesh_Gros_C_est_moi.sh

(euh vous pouvez changer le nom hein…)

#!/bin/bash
#
# variables generales
dyndns=guiguiabloc.dyndns.com
ipfile=/root/ipfile
 
# Recuperation de l'ip
IP=`/usr/bin/dig +short $dyndns | /usr/bin/tail -n 1`
if [ "${#IP}" = "0" ]; then
    echo "Echec de la recuperation de l'ip"
    exit
fi
 
ANCIENNEIP=""
if [ -a $ipfile ]; then
    ANCIENNEIP=`cat $ipfile`
fi
 
# on enregistrer la nouvelle ip
echo $IP>$ipfile
 
echo "Mise a jour d'iptables"
if [ "${#ANCIENNEIP}" != "0" ]; then
    echo "Suppression de l'ancienne règle ($ANCIENNEIP)"
    /sbin/iptables -D mon_ip_maison -s $ANCIENNEIP/32 --dport 22 -j ACCEPT
fi
echo "Insertion de la nouvelle règle ($IP)"
/sbin/iptables -A mon_ip_maison -s $IP/32 --dport 22 -j ACCEPT

Ne reste qu’a le lancer toutes les 10 minutes via la crontab :

*/10 * * * * /root/Wesh_Gros_C_est_moi.sh   2>&1

Magique :-D

Vous trouverez le script de Dave Horner ICI

Ce billet a été posté dans linux, réseau, sécurité et taggé , , . Bookmark ce permalink.

5 commentaires sur “Gestion des adresses Ip dynamiques avec Iptables

  1. juste une petite erreur apres le /32 il faut ajouter « -p tcp » :

    echo « Mise a jour d’iptables »
    if [ "${#ANCIENNEIP}" != "0" ]; then
    echo « Suppression de l’ancienne règle ($ANCIENNEIP) »
    /sbin/iptables -D mon_ip_maison -s $ANCIENNEIP/32 -p tcp –dport 22 -j ACCEPT
    fi
    echo « Insertion de la nouvelle règle ($IP) »
    /sbin/iptables -A mon_ip_maison -s $IP/32 -p tcp –dport 22 -j ACCEPT

    sinon merci pour le script

  2. Pingback: GuiguiAbloc, un blog qui merite d'être connu, technique, reseau, linux, système - linux - geek

  3. Bien l’astuce :)

    Par contre c’est peut être une réflexion de parano mais si le serveur effectue une résolution de l’IP (dig) tous les x temps. Un pirate peut voir ça en écoutant le port DNS (je crois) et donc connaître le Dynhost de l’admin du serveur ?

    Alors que si il écoute le port 22 je ne crois pas qu’il puisse connaitre l’IP de l’admin du serveur puisque la communication est crypté ?

    Il vaut peut être mieux utiliser ta règle :
    Iptables -I INPUT -p tcp –dport 22 -i eth0 -m state –state NEW -m recent –update –seconds 60
    –hitcount 4 -j DROP

    et couplé à du port knocking ?

  4. Que ce soit en sniffant les requètes DNS en provenance du serveur ou en sniffant le port 22, le « pirate » connaitra de toutes facons l’ip de l’admin du serveur. (c’est la communication qui est cryptée, l’échange tcp au début est en clair, regarde un tcpdump).
    La technique de ce billet n’est pas fait pour être une solution de protection du port ssh mais uniquement pour mettre a jour une entrée dynamique. Bien évidemment le reste des options iptables doivent être appliquer comme dans toutes protection du service 22.