[Résolu] Script firewall au démarrage

Bonsoir,

J’ai configuré mes règles iptables grâce à la configuration du fichier /etc/init.d/firewall avec :

#!/bin/sh

touch /home/pi/tata

# Vider les tables actuelles
iptables -t filter -F

# Vider les règles personnelles
iptables -t filter -X

# Interdire toute connexion entrante et sortante
iptables -t filter -P INPUT DROP
iptables -t filter -P FORWARD DROP
iptables -t filter -P OUTPUT DROP

# ---

# Ne pas casser les connexions etablies
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

# Autoriser loopback
iptables -t filter -A INPUT -i lo -j ACCEPT
iptables -t filter -A OUTPUT -o lo -j ACCEPT

# ICMP (Ping)
iptables -t filter -A INPUT -p icmp -j ACCEPT
iptables -t filter -A OUTPUT -p icmp -j ACCEPT

# ---

# SSH In
iptables -t filter -A INPUT -p tcp --dport 2222 -j ACCEPT

# SSH Out
iptables -t filter -A OUTPUT -p tcp --dport 2222 -j ACCEPT

# DNS In/Out
iptables -t filter -A OUTPUT -p tcp --dport 53 -j ACCEPT
iptables -t filter -A OUTPUT -p udp --dport 53 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 53 -j ACCEPT
iptables -t filter -A INPUT -p udp --dport 53 -j ACCEPT

# NTP Out
iptables -t filter -A OUTPUT -p udp --dport 123 -j ACCEPT

# HTTP + HTTPS Out
iptables -t filter -A OUTPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 443 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 8000 -j ACCEPT

# HTTP + HTTPS In
iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 8443 -j ACCEPT

# Transmission +  Out
iptables -t filter -A OUTPUT -p tcp --dport 9091 -j ACCEPT

# Transmission + In
iptables -t filter -A INPUT -p tcp --dport 9091 -j ACCEPT

# SMTP
iptables -t filter -A INPUT -p tcp --dport 587 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 587 -j ACCEPT

touch /home/pi/toto

Les lignes « touch » en début et fin sont là pour tester que le script fonctionne.
J’ai ensuite rendu ce fichier exécutable :

chmod a+x /etc/init.d/firewall

Si j’exécute le script, tout se passe bien. Mes règles iptables sont créées et les fichiers toto et tata sont bien créés.
J’ai ensuite rendu le script exécutable au démarrage grâce à la commande :

sudo update-rc.d firewall defaults

Pas d’erreur, tout va bien. Mais quand je redémarre mon RPI, le script ne s’exécute pas… Les règles iptables ne sont pas mises et mes fichiers ne sont pas créés…

Savez-vous d’où ça peut venir ?

Merci.

Bonjour,

Déjà vérifier si le fichier firewall est présent dans /etc/rc?.d/

# ls /etc/rc?.d/*firewall*

Si c’est le cas dans dmesg il devrait y avoir des trace de la tentative de démarrage.

A+

Merci jelopo pour ta réponse.
Non quand je fais cette commande, il n’y a rien…

Essaie d’ajouter un entête dans ton fichier

 #!/bin/sh
### BEGIN INIT INFO
# Provides:          firewall rules
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Firewall deamon
# Description:       Enable service provided by daemon.
### END INIT INFO

Puis relance
sudo update-rc.d firewall defaults

A+

1 « J'aime »

Super ça fonctionne !!
Je suis allé sur plusieurs sites « tuto » pour mettre en place le firewall avec iptables et update-rc, aucun ne mettait cet entête dans le fichier…

Merci beaucoup jelopo :slight_smile:

Peut être qu’il vérifient jamais si leur firewall fonctionne :rofl:
Non en fait j’en sais rien…

Par contre pour aller plus loin, je te conseille d’ajouter aussi les fonctions start, stop restart, status comme sur un vrai script d’init de deamon. Ceci te permettra d’administrer le firewall et de prendre la main en local pour le couper en cas de problème.

Pour cela, déjà crée une copie de ton fichier qui marche, puis ajoute le début de fonction start juste après l’entête

# fonction qui démarre le firewall
do_start() {

Ensuite tu colle tous le contenu de ton fichier…

Pour finir tu colles l’accolade sortante pour fermer la fonction start, la fonction stop, la fonction status et la gestion de l’appel à ces fonctions

}

# fonction qui arrête le firewall
do_stop() {

    # Efface toutes les règles
    iptables -t filter -F
    iptables -t filter -X
    iptables -t nat -F
    iptables -t nat -X
    iptables -t mangle -F
    iptables -t mangle -X
    #
    ip6tables -t filter -F
    ip6tables -t filter -X
    #ip6tables -t nat -F
    #ip6tables -t nat -X
    ip6tables -t mangle -F
    ip6tables -t mangle -X

    # remet la stratégie
    iptables -t filter -P INPUT ACCEPT
    iptables -t filter -P OUTPUT ACCEPT
    iptables -t filter -P FORWARD ACCEPT
    #
    ip6tables -t filter -P INPUT ACCEPT
    ip6tables -t filter -P OUTPUT ACCEPT
    ip6tables -t filter -P FORWARD ACCEPT

    #
    echo "firewall stopped [OK]"
}

# fonction status firewall
do_status() {

    # affiche les règles en cours
    clear
    echo Status IPV4
    echo -----------------------------------------------
    iptables -L -n -v
    echo
    echo -----------------------------------------------
    echo
    echo status IPV6
    echo -----------------------------------------------
    ip6tables -L -n -v
    echo
}

case "$1" in
    start)
        do_start
        # quitte sans erreur
        exit 0
    ;;

    stop)
        do_stop
        # quitte sans erreur
        exit 0
    ;;

    restart)
        do_stop
        do_start
        # quitte sans erreur
        exit 0

Là ça fait beaucoup plus poilu, non ?

A+

1 « J'aime »

Cool, merci pour tout ça :slight_smile:
Je teste de suite ! Et je vais cette page en favori :stuck_out_tongue:

Pour finir, les commandes pour gérer ce service firewall,

sudo service firewall [start|stop|restart|status]

Si tu n’as la main qu’en distant, ce mode en service te permet de modifier les règles puis, de relancer le service dans la même fenêtre ssh (Attention à ne pas se déconnecter). Et de tester si les règles fonctionnent à partir d’une autre fenêtre. En cas de problème d’accès SSH sur la seconde fenêtre, à partir de la première fenêtre active, lancer une commande de stop. Et hop.

A+

1 « J'aime »