Ingrédients :
- IpTables
- DynDns
- Firewall Builder
Je souhaite pouvoir me logguer en SSH sur mon serveur dédié via mes machines personnelles or mon adresse ip change au gré de mon fournisseur d’accès. J’ai donc souscrit un dynamic Dns pour identifier de manière unique et en permanence sur la toile ma machine personnelle.
Le problème est que IpTables évalue l’adresse ip des hosts au moment où la règle est créée et donc dés que celle ci change, elle permet à la machine qui a hérité de mon ancienne adresse ip de se connecter en ssh sur mon serveur et moi même, je suis dans l’incapacité d’accéder à mon serveur avec ma nouvelle adresse ip.
Voilà un moment que je cherchais une solution, et voilà comment je l’ai implémentée :
J’utilises Firewall Builder pour générer mon firewall dans /etc/fb/myfirewall.fw
- Un shell script qui va détecter le changement d’ip et décider quoi faire :
#!/bin/bash # filename: firewall-dynhosts.sh # # A script to reload a firewall each time dynamic dns host ip moves. # Written by: Sébastien Pérès-Labourdette (http://itworks.blogdns.net) # Released into public domain. # HOST=$1 HOSTFILE="/etc/dyndns/host-$HOST" FIREWALLSCRIPT="/etc/fb/myfirewall.fw" # check to make sure we have enough args passed. if [ "${#@}" -ne "1" ]; then echo "$0 hostname" echo "You must supply a hostname to update in iptables." exit fi # lookup host name IP=`/usr/bin/dig +short $HOST | /usr/bin/tail -n 1` if [ "${#IP}" = "0" ]; then echo "Couldn't lookup hostname for $HOST, failed." exit fi OLDIP="" if [ -a $HOSTFILE ]; then OLDIP=`cat $HOSTFILE` else echo "Creating entry for $HOST" echo $IP>$HOSTFILE exit fi if [ "$IP" == "$OLDIP" ]; then echo "ip of $HOST did not change" exit fi echo "Ip has changed from #$OLDIP# to #$IP#" ESC_OLDIP=`sed -e 's/\./\\\\./g' $HOSTFILE` echo "Back up new ip." echo $IP>$HOSTFILE echo "Renewing firewall ..." sed -i "s/$ESC_OLDIP/$IP/g" $FIREWALLSCRIPT /bin/bash $FIREWALLSCRIPT
- Un second script (/etc/dyndns/dynamic-firewall) qui va exécuter le premier pour tout les dynhosts
#!/bin/bash /etc/dyndns/firewall-dynhosts.sh spl01.dyndns.net /etc/dyndns/firewall-dynhosts.sh spl02.dyndns.net /etc/dyndns/firewall-dynhosts.sh spl03.dyndns.net
- NB : Ne pas oublier de chmoder nos 2 scripts
chmod +x /etc/dyndns/dynamic-firewall chmod +x /etc/dyndns/firewall-dynhosts.sh
- Et finalement une entrée cron (/etc/cron.d/dynamic-firewall) qui va assurer l’exécution toutes les 5 minutes du deuxième script
*/5 * * * * root /etc/dyndns/dynamic-firewall > /dev/null 2>&1
Me voilà tranquille.