Tym-Project

From: SUPINFO
To: Tous
Subject: IT

Mon Script De Configuration Iptables

Pour ceux qui ne connaitraient pas, iptables est une interface de gestion du module netfilter du noyau Linux. En termes clairs : c’est un pare-feu. Iptables est donc un ensemble de commandes permettant de créer des règles, je ne vais pas rentrer dans les détails, vous trouverez plus d’infos sur cette page par exemple. Dans cet article il sera question de comment je gère ma configuration de pare-feu à travers un script d’init.

init.d, t’es initié ?

Le but de ce script est qu’il se lance au démarrage de mon poste, et en bonus que je puisse couper/relancer mon pare-feu à loisir : c’est là le rôle d’un script “init.d”. Commençons donc par la fin, avec les différents arguments que peut prendre le script :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
case $1 in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        restart
        ;;
    *)
        echo "usage: iptables {start|stop|restart}"
        exit 1
        ;;
esac

Logiquement on retrouve les fonction start, stop et restart avec une explication des arguments pour toute valeur en dehors de ce choix.

En fonction des fonctions…

la fonction restart est très simple :

function restart {
    stop start
}

la fonction stop est un peu plus complexe et est chargée de vider les règles iptable, de changer la politique par défaut et de restarter [man]fail2ban[/man] si besoin :

1
2
3
4
5
6
7
8
9
10
11
12
function stop {
    for IPTABLES in iptables ip6tables;do
        $IPTABLES -P INPUT ACCEPT
        $IPTABLES -P FORWARD ACCEPT
        $IPTABLES -P OUTPUT ACCEPT
        $IPTABLES -F $IPTABLES -X
    done

    if [ -e /etc/init.d/fail2ban ]; then
        /etc/init.d/fail2ban restart
    fi
}

L’utilisation de for IPTABLES in iptables ip6tables permet de configurer à la fois pour ipv4 et ipv6.

La fonction start utilise une variable $TCP_PORTS (qui contient les port TCP à ouvrir) définie ainsi :

TCP_PORTS="80 443"

Et la fonction en elle-même :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function start {
    for IPTABLES in iptables ip6tables;do
        $IPTABLES -F $IPTABLES -P INPUT DROP
        $IPTABLES -P FORWARD DROP
        $IPTABLES -P OUTPUT DROP

        $IPTABLES -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
        for port in $TCP_PORTS;do
            $IPTABLES -A INPUT -p tcp --dport $port -j ACCEPT
        done

        $IPTABLES -A OUTPUT -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
        $IPTABLES -A INPUT -i lo -j ACCEPT $IPTABLES -A OUTPUT -o lo -j ACCEPT
        # ICMP (Ping)
        #$IPTABLES -A INPUT -p icmp -j ACCEPT
    done
if [ -e /etc/init.d/fail2ban ];then
    /etc/init.d/fail2ban restart
fi
}

Configuration et installation

Pour placer le script dans /etc/init.d/ deux solutions sont possibles :

  • le copier dans le répertoire
  • faire un lien symbolique avec ln -s /emplacement/script/iptables /etc/init.d/iptables

Si vous mettez ce script en place sur serveur sans accès physique, je vous conseille formetment de le tester avant de le mettre au démarrage de la machine…c’est trop bête de se faire enfermer dehors :)

La mise en place du scritpt au démarrage peut se faire manuellement en mettant en place des liens symboliques dans /etc/rc*.d/, mais il est plus simple de passer par update-rc.d :

sudo update-rc.d iptables defaults
update-rc.d: warning: /etc/init.d/iptables missing LSB information
update-rc.d: see <http://wiki.debian.org/LSBInitScripts>

Suite aux erreurs du LSB j’ai ajouté cela au début du script :

### BEGIN INIT INFO
# Provides: iptables
# Required-Start: $local_fs $remote_fs $network $syslog
# Required-Stop: $local_fs $remote_fs $network $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Set up iptables at boot time
# Description: Enable service provided by iptables.
### END INIT INFO

Voici donc le fichier dans son intégralité :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#!/bin/bash
# iptables-default
# www.tym-project.fr/blog
# tym@tym-project.fr
### BEGIN INIT INFO
# Provides:          iptables
# Required-Start:    $local_fs $remote_fs $network $syslog
# Required-Stop:     $local_fs $remote_fs $network $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Set up iptables at boot time
# Description:       Enable service provided by iptables.
### END INIT INFO
PATH="/sbin"
TCP_PORTS="80 443"
function stop {
    for IPTABLES in iptables ip6tables;do
        $IPTABLES -P INPUT ACCEPT
        $IPTABLES -P FORWARD ACCEPT
        $IPTABLES -P OUTPUT ACCEPT
        $IPTABLES -F
        $IPTABLES -X
    done
    if [ -e /etc/init.d/fail2ban ]; then
        /etc/init.d/fail2ban restart
    fi
}
function start {
    for IPTABLES in iptables ip6tables;do
        $IPTABLES -F
        $IPTABLES -P INPUT DROP
        $IPTABLES -P FORWARD DROP
        $IPTABLES -P OUTPUT DROP
        $IPTABLES -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
    for port in $TCP_PORTS;do
        $IPTABLES -A INPUT -p tcp --dport $port -j ACCEPT
    done
    $IPTABLES -A OUTPUT -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
    $IPTABLES -A INPUT -i lo -j ACCEPT
    $IPTABLES -A OUTPUT -o lo -j ACCEPT
    # ICMP (Ping)
    #$IPTABLES -A INPUT -p icmp -j ACCEPT
    done
    if [ -e /etc/init.d/fail2ban ];then
        /etc/init.d/fail2ban restart
    fi
}
function restart {
    stop
    start
}
case $1 in
    start)
    start
    ;;
    stop)
    stop
    ;;
    restart)
    restart
    ;;
    *)
    echo "usage: iptables {start|stop|restart}"
    exit 1
    ;;
esac

Bon firewalling ;-)

Comments