Wie können diese iptables-Regeln so eingestellt werden, dass sie beim Start ausgeführt werden?

20

Normalerweise führe ich meine iptables-Regeln bei jedem Login aus. Vom Terminal tippe ich;

sudo sh firewall.sh

Ich richte den Computer meiner Schwester ein und möchte ihr einen grundlegenden Firewall-Schutz bieten. Sie wird sich nicht als Administrator anmelden, nur als Standardkonto. Wie kann ich ein Firewall-Skript jedes Mal ausführen, wenn sie sich anmeldet, ohne dass sie ein Kennwort eingeben muss?

Das Skript, das ich für den Computer meiner Schwester geschrieben habe, enthält:

#!/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

Ich habe es als firewall.sh in ihrem Ausgangsordner abgelegt und als ausführbar festgelegt (Rechtsklick auf die Datei und Aktivieren der Option "Datei als Programm ausführen lassen" auf der Registerkarte "Berechtigungen").

Das Ausführen dieses Skripts vom Terminal aus als root funktioniert einwandfrei.

Nach dem Tippen;

sudo sh firewall.sh

Ich habe in das Terminal getippt

sudo iptables -L -v

und ich verstehe

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

Wie kann ich dieses Skript bei der Anmeldung automatisch ausführen lassen oder diese Regeln möglicherweise dauerhaft für den Computer meiner Schwester speichern? Könnten Sie bitte etwas detaillierten Code bereitstellen, da meine ersten Versuche mit rc.local und iptables-save nicht sehr erfolgreich waren. Bei jedem Neustart werden alle INPUT-, OUTPUT- und FORWARD-Ketten auf ACCEPT zurückgesetzt, und bei der Eingabe werden keine Richtlinien aufgeführtsudo iptables -L -v

Mikelane
quelle
Fast zwei Jahre später, aber ein wichtiger Hinweis: Stellen Sie sicher, dass Sie ip6tablesRegeln haben , wenn Sie eines Tages eine v6-Konnektivität erhalten, da IPv6 von verwaltet wird ip6tablesund nicht iptables.
Thomas Ward

Antworten:

38

Möglicherweise möchten Sie das iptables-persistentPaket verwenden, anstatt mit Ihren Boot-Skripten herumzuspielen. Führen Sie zuerst Ihr Skript aus, um die Firewall-Regeln einzurichten. Führen Sie sudo apt-get install iptables-persistentanschließend die Anweisungen aus und befolgen Sie sie. Wenn Sie aufgefordert werden, die aktuellen Regeln zu speichern, klicken Sie bei beiden Eingabeaufforderungen auf "Ja". Jetzt werden beim Neustart Ihre Iptables-Regeln wiederhergestellt.


HINWEIS: Wenn Sie Ihre Regeln danach ändern, müssen Sie nach den Änderungen die folgenden Befehle ausführen:

So speichern Sie Ihre IPv4-Iptables-Regeln: sudo su -c 'iptables-save > /etc/iptables/rules.v4'

So speichern Sie Ihre IPv6-Regeln für ip6tables: sudo su -c 'ip6tables-save > /etc/iptables/rules.v6'

Thomas Ward
quelle
Danke, das hat funktioniert. Wenn ich die Regeln vorübergehend ändern möchte, kann ich ja einfach ein Skript vom Terminal ausführen?
Mikelane
Ja, oder Sie können das iptables-System direkt manipulieren. Wenn Sie jedoch die temporäre Regel dauerhaft verwenden möchten, kann nicht garantiert werden, dass die neue (n) Regel (n) gespeichert wird (werden), es sei denn, Sie führen die in meiner Antwort angegebenen Befehle aus.
Thomas Ward
Ist es eine schlechte Idee, sudo dpkg-reconfigure iptables-persistentnach dem Ändern einer Regel zu laufen ?
Souravc
@souravc die Frage, die darauf antwortet, ist "Warum sollten Sie brauchen oder wollen?" Die Idee ist, dass Sie die rules.v4oder rules.v6Dateien nicht neu schreiben (oder überschreiben (müssen und können), damit sie beim nächsten Start indiziert werden, oder sofort, wenn Sie ausführen iptables-restore < /etc/iptables/rules.v4oderip6tables-restore < /etc/iptables/rules.v6
Thomas Ward
2

Vorausgesetzt, Sie haben die Firewall-Regeln in:

/etc/iptables.up.rules

Vielleicht ist die naheliegendste Antwort die Erstellung einer Datei mit dem Namen iptables in:

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

mit dem Inhalt:

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

und mache es ausführbar mit

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

Auf diese Weise werden Ihre Regeln geladen, bevor Ihre Netzwerkschnittstelle aktiviert wird.

Antonio J. de Oliveira
quelle
Danke, wirft es irgendwo Log? Dies funktioniert nicht und ich vermute, dies liegt daran, dass auf meinem verwendeten DNS-Server ein Resolver noch nicht gestartet ist, als mein Host hochfährt.
Dimitri Kopriwa