Script iptable ne s'éxécute pas au boot

Bonjour à tous,

En ce moment même, j’expérimente sur un VM Debian, la configuration d’iptables pour après, configurer le pare-feu sur mes serveurs virtuels.

Je me suis pas mal documenté depuis hier, en essayant de bien comprendre les commandes. Ca commence à rentrer, et j’ai fait un script avec l’aide de la doc ubuntu.

Mon fichier s’éxécute bien en faisant “sudo /etc/init.d/firewall”.
puis “sudo iptables -L” m’affiche bien toutes les règles.

Mais quand je reboot, je relance un “sudo iptables -L” et j’ai aucune règle. Mon script ne doit pas se lancer au démarrage.

Les droits de mon script :
-rwxr-xr-x 1 root root 1301 avril 4 22:15 /etc/init.d/firewall

Et j’ai bien fait “sudo update-rc.d firewall default”.

Je pensais que c’était lié au fait qu’on doit lancer le script et les commandes en root (ou sudo) donc j’ai mis root en propriétaire du fichier, mais sans succès …

Tu peux regarder ce fil, pour essayer de comparer et trouver ce qui ne va pas de ton côté ;-).

Tu es sous jessie ?
Tu utilises quel système d’init : systemd ?
C’est peut-être simplement ça le problème ?

Bonjour,

Oui je suis sous jessie et j’ai pris l’habitude d’utiliser systemd. C’est vrai que finalement, il faudrait que je vois pour faire un script systemd qui lance mon script iptables. Merci :slight_smile:

Par contre, j’ai suivi le tuto que m’a indiqué seb-ksl, et je me suis rendu compte qu’au final, mon fichier était vraiment light. J’ai utiliser la méthode utilisée dans le tuto (le script init et le script iptables) mais quand je lance sudo service init_firewall start, j’ai l’erreur Failed to start init_firewall.service. No such file or directory

Pourtant, si je fais sudo iptables, iptables est bien reconnu. Mais dans le script on met juste “iptables”, ça peut être lié ? Et j’ai pas trop envie d’autoriser iptables à un user non ‘su’

De plus, quand je veux exécuter le script qui écrit les règles, ça me met `sudo : enable to execute /usr/local/sbin/config_firewall : No such file or directory

Si je me log en su rootet que je relance le script, j’ai bin/sh : Mauvais interpréteur: aucun fichier ou dossier de ce type

J’ai un peu de mal à comprendre il ne veut pas m’exécuter les scripts …

C’est possible (étonnant mais possible) que tu n’aies pas l’interpréteur dash (qui fournit la commande sh). Il suffit d’installer le paquet dash.

J’ai vérifié et dash est bien installé.

Voici mes deux fichiers :
/etc/init.d/init_firewall

http://pastebin.com/FkrTXPFc

/usr/local/sbin/config_firewall :
http://pastebin.com/w7eufKCS

Bon, et si tu changes #!bin/sh par #!bin/bash en début des scripts ?
Que donne le retour de which sh ?

Bonjour,

Il me semble plus judicieux de lié le script à l’interface avec un “up: …” ou un “pre-up: …” dans le fichier /etc/network/interfaces
Perso, j’utilise “iptables-restaure < mes-règles” sachant que “iptables-save > mes-règles” après le lancement de mon script de commandes iptables.

Il manque un / devant bin/sh dans le shebang du script /usr/local/sbin/config_firewall qui devrait être #!/bin/sh et non #!bin/sh.

Pour le reste, je n’ai pas accès à pastebin en ce moment pour voir la suite des scripts. Il n’était pas possible de les coller en entier ici ?

T’as d’bons yeux tu sais !

Édit : je me rends compte que j’ai copié/collé la connerie en plus :-/

La systaxe correcte est defaults au pluriel, pas default.
Faute de frappe lors de la rédaction du message ou lors de l’exécution de la commande (qui aurait donné lieu à une erreur) ?

Il y a d’autres points à éclaircir.

  1. Dans ton message initial, tu écris que le script d’init est /etc/init.d/firewall mais dans les suivants le script est nommé init_firewall.
    Qu’en est-il ?

Aucun rapport. L’erreur ne porte pas sur iptables mais sur ton script.

Pour faire le point, qu’affiche la commande suivante ?
ls -l /etc/*.d/*firewall*

  1. D’après le contenu du script init_firewallpublié sur pastebin, le fichier /usr/local/sbin/config_firewall ne devrait pas être un script exécutable mais un fichier de règles iptables au format utilisé par iptables-save et iptables-restore, qui n’a donc rien à faire dans /usr/local/sbin. Or le contenu du fichier config_firewallpublié sur pastebin est un script shell classique.

A noter qu’il y a une erreur dans le script init_firewall : la redirection dans les commandes ip{6}tables-restoredevrait être faite sur l’entrée standard avec “<” et non sur la sortie standard avec “>” puisque le contenu du fichier config_firewall doit être lu par iptables-restore et non écrit.

Autre erreur dans ce script : tu spécifies le même fichier de règles /usr/local/sbin/config_firewall pour iptables et ip6tables. C’est acceptable seulement si les deux n’utilisent que des éléments communs entre IPv4 et IPv6 (donc pas d’icmp, icmpv6, hl, ttl…) contrairement à tes règles. Et dans ce cas, il est inutile d’enregistrer deux fois les règles pour IPv4 et IPv6 dans stop) puisque la seconde fois va écraser la première.

La systaxe correcte est defaults au pluriel, pas default.
Faute de frappe lors de la rédaction du message ou lors de l’exécution de la commande (qui aurait donné lieu à une erreur) ?

Oui c’était bien une erreur de frappe lors de la saisie du topic ;).

En fait, comme expliqué dans mon premier message, j’avais prit des exemples à plusieurs endroits et principalement sur le doc ubuntu.
Puis lorsque seb_ksl m’a indiqué le lien du “tuto” pour configurer iptables, je suis reparti de 0 et je l’ai suivi.
D’où le changement de nom du fichier.

Elle m’affiche : -rwxr-xr-x 1 root root 1645 avril 5 05:05 /etc/init.d/init_firewall

Pour le reste, je vais refaire un script au format iptables-save et essayer de résoudre ou améliorer les scripts de moi même :).

Edit :
J’ai donc fait 2 scripts différents (init_firewall_ipv4 et init_firewall_ipv6), après pas mal de corrections, les scripts fonctionnent.
Je voudrais maintenant mettre au démarrage init_firewall_ipv4, mais quand je tape update-rc.d /etc/init_firewall_ipv4 defaults, j’ai insserv : init_firewall_ipv6: service init_firewall_ipv6 already provided.

Serait-ce parce que j’ai copié le script original, je l’ai modifié et enregistrer sous un nouveau nom ?

Probablement. Vérifie les en-têtes LSB des deux scripts, la valeur du champ Provides: de l’un des deux doit être erronée.

Effectivement, c’était vraiment tout bête. Le Provides : ne comportait pas le même nom que le script.
Sur mon linux test, ça a l’air de bien fonctionner.

Je vous remercie beaucoup pour votre aide :smiley:

La valeur du champ Provides: ne doit pas forcément être identique au nom du script, mais il faut qu’elle soit unique parmi tous les scripts d’init.

Ah je comprend mieux alors. Mais pourquoi j’avais cette erreur, alors que j’avais supprimé l’ancien script ? Il y a un moyen pour voir si j’ai des résidus (liens cassés ou autre) de l’ancien script ?

Tu peux regarder s’il reste des anciens liens dans /etc/rc[S0-6].d/.

Bonjour,

Après plusieurs jours d’arrêt sur ce script, je viens de m’y remettre pour le perfectionner. Sur un de mes serveurs il fonctionne bien, j’ai donc récupéré les fichiers (fichier de conf + script) pour les mettre sur mon deuxième serveur. Et là, quand je lance le script j’ai :
`● init_firewall_ipv4.service - LSB: iptables based firewall
Loaded: loaded (/etc/init.d/init_firewall_ipv4)
Active: failed (Result: exit-code) since ven. 2016-04-29 10:11:38 CEST; 13min ago
Process: 1768 ExecStart=/etc/init.d/init_firewall_ipv4 start (code=exited, status=203/EXEC)

avril 29 10:11:38 Timide systemd[1]: init_firewall_ipv4.service: control process exited, code=exited status=203
avril 29 10:11:38 Timide systemd[1]: Failed to start LSB: iptables based firewall.
avril 29 10:11:38 Timide systemd[1]: Unit init_firewall_ipv4.service entered failed state.
`

Les droits sont identiques sur les deux serveurs, et les deux sont sous Debian 8. J’ai beau vérifier mon script, je vois pas d’où vient le problème …

Essaie d’exécuter le script manuellement pour voir ce qui se passe.
/etc/init.d/init_firewall_ipv4 start

Ca me renvoi :

bash: /etc/init.d/init_firewall_ipv4 : /bin/sh^M : mauvais interpréteur: Aucun fichier ou dossier de ce type

Avec #!/bin/bash c’est pareil. Mais qu’est ce qu’il bien faire là ce ^M ? Il y est pas dans mon script