Comment définir ces règles iptables pour qu'elles s'exécutent au démarrage

20

J'exécute généralement mes règles iptables chaque fois que je me connecte. Depuis le terminal, je tape;

sudo sh firewall.sh

En installant l'ordinateur de ma sœur, je veux lui donner une protection de base du pare-feu. Elle ne se connectera pas en tant qu'administrateur, juste un compte standard. Comment puis-je exécuter un script de pare-feu à chaque fois qu'elle se connecte sans qu'elle ait à taper un mot de passe?

Le script que j'ai écrit pour l'ordinateur de ma sœur contient;

#!/bin/sh

modprobe ip_conntrack
iptables -F
iptables -X
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

iptables -I OUTPUT -p tcp --dport 80 --sport 32768:61000 -j ACCEPT
iptables -I OUTPUT -p udp --dport 53 --sport 32768:61000 -j ACCEPT
iptables -I OUTPUT -p tcp --dport 443 --sport 32768:61000 -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -I OUTPUT -p icmp -j DROP

iptables -I INPUT -p icmp -j DROP
iptables -I INPUT -p udp -j DROP
iptables -I INPUT -p tcp -m tcp --syn -j DROP
iptables -I INPUT -i lo -j ACCEPT
iptables -I INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

Je l'ai placé dans son dossier personnel sous le nom firewall.sh et l'ai défini comme exécutable (cliquez avec le bouton droit sur le fichier et cochez l'option "autoriser l'exécution du fichier en tant que programme" dans l'onglet autorisations).

L'exécution de ce script à partir du terminal en tant que root fonctionne correctement.

Après avoir tapé;

sudo sh firewall.sh

J'ai tapé dans le terminal

sudo iptables -L -v

et je reçois

Chain INPUT (policy DROP 0 packets, 0 bytes)  pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     all  --  any    any     anywhere             anywhere             ctstate RELATED,ESTABLISHED
    0     0 ACCEPT     all  --  lo     any     anywhere             anywhere            
    0     0 DROP       tcp  --  any    any     anywhere             anywhere             tcpflags: FIN,SYN,RST,ACK/SYN
    0     0 DROP       udp  --  any    any     anywhere             anywhere            
    0     0 DROP       icmp --  any    any     anywhere             anywhere            

Chain FORWARD (policy DROP 0 packets, 0 bytes)  pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy DROP 0 packets, 0 bytes)  pkts bytes target     prot opt in     out     source               destination         
    0     0 DROP       icmp --  any    any     anywhere             anywhere            
    0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere             tcp spts:32768:61000 dpt:https
    0     0 ACCEPT     udp  --  any    any     anywhere             anywhere             udp spts:32768:61000 dpt:domain
    0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere             tcp spts:32768:61000 dpt:http
    0     0 ACCEPT     all  --  any    lo      anywhere             anywhere

Comment puis-je exécuter ce script automatiquement lors de la connexion, ou éventuellement enregistrer ces règles de façon permanente pour l'ordinateur de mes sœurs? Pourriez-vous s'il vous plaît fournir un code détaillé, car mes premières tentatives de méthode rc.local et d'iptables-save n'ont pas été très réussies. À chaque redémarrage, toutes les chaînes INPUT, OUTPUT et FORWARD sont réinitialisées sur ACCEPT, sans aucune politique répertoriée lorsque je tapesudo iptables -L -v

Mikelane
la source
Presque deux ans plus tard, mais un commentaire important: assurez-vous d'avoir des ip6tablesrègles si vous obtenez un jour la connectivité v6, car IPv6 est géré par ip6tableset non iptables.
Thomas Ward

Réponses:

38

Vous voudrez peut-être utiliser le iptables-persistentpackage plutôt que de jouer avec vos scripts de démarrage. Tout d'abord, exécutez votre script pour configurer les règles de pare-feu. Deuxièmement, exécutez sudo apt-get install iptables-persistentet suivez les invites. Lorsqu'il demande d'enregistrer les règles actuelles, appuyez sur "Oui" aux deux invites. Maintenant, lors des redémarrages, vos règles iptables seront restaurées.


REMARQUE: si vous modifiez vos règles après cela, vous devrez effectuer les commandes suivantes après les modifications:

Pour enregistrer vos règles IPv4 iptables: sudo su -c 'iptables-save > /etc/iptables/rules.v4'

Pour enregistrer vos règles ipvtables IPv6: sudo su -c 'ip6tables-save > /etc/iptables/rules.v6'

Thomas Ward
la source
Merci, cela a fonctionné. Si je veux changer temporairement les règles, je peux simplement exécuter un script à partir du terminal oui?
Mikelane
Oui, ou vous pouvez directement manipuler directement le système iptables. TOUTEFOIS, si vous prévoyez d'utiliser la règle temporaire de manière persistante, la ou les nouvelles règles ne sont pas garanties d'être enregistrées à moins que vous ne fassiez les commandes que j'énonce dans ma réponse.
Thomas Ward
Est-ce une mauvaise idée de courir sudo dpkg-reconfigure iptables-persistentaprès avoir changé une règle.
souravc
@souravc la question qui répond à cette question est "Pourquoi en auriez-vous besoin ou voudriez-vous?" L'idée est que vous ne devez et pouvez simplement réécrire (ou écraser (le rules.v4ou rules.v6au prochain démarrage des fichiers manuellement afin qu'ils sont indexés, ou immédiatement si vous exécutez iptables-restore < /etc/iptables/rules.v4ouip6tables-restore < /etc/iptables/rules.v6
Ward Thomas
2

En supposant que vous disposez des règles de pare-feu dans:

/etc/iptables.up.rules

La réponse la plus évidente sera peut-être de créer un fichier appelé iptables dans:

/etc/network/if-pre-up.d

avec le contenu:

#!/bin/bash
/sbin/iptables-restore < /etc/iptables.up.rules

et le rendre exécutable en utilisant

sudo chmod +x /etc/network/if-pre-up.d/iptables

De cette façon, avant que votre interface réseau ne soit activée, vos règles seront chargées.

Antonio J. de Oliveira
la source
Merci, cela lance-t-il un journal n'importe où? Cela ne fonctionne pas et je pense que cela est dû au fait que mon serveur DNS utilise un résolveur non encore démarré lorsque mon hôte démarre.
Dimitri Kopriwa