Linux:Iptables

Aus Alexander's Wiki

Standardregeln

FTP-Server

-A INPUT -p tcp -m state --state NEW -m tcp --dport 21 -j ACCEPT

Samba Server

-A INPUT -p udp -m state --state NEW -m udp --dport 137 -j ACCEPT
-A INPUT -p udp -m state --state NEW -m udp --dport 138 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 139 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 445 -j ACCEPT

Webserver

-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT

Mailserver

-A INPUT -p tcp -m state --state NEW -m tcp --dport 25 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 110 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 995 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 143 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 993 -j ACCEPT

DNS Server

-A INPUT -p tcp -m state --state NEW -m tcp --dport 53 -j ACCEPT
-A INPUT -p udp -m state --state NEW -m udp --dport 53 -j ACCEPT

DHCP-Server

-A INPUT -p tcp -m state --state NEW -m tcp --dport 68 -j ACCEPT

TFTP-Server

-A INPUT -p udp -m state --state NEW -m udp --dport 69 -j ACCEPT

NTP-Server

-A INPUT -p udp -m state --state NEW -m udp --dport 123 -j ACCEPT

Druckserver

-A INPUT -p tcp -m tcp --dport 631 -j ACCEPT
-A INPUT -p udp -m udp --dport 631 -j ACCEPT

Rsync-Server

-A INPUT -p tcp -m state --state NEW -m tcp --dport 873 -j ACCEPT

OpenVPN-Server

-A INPUT -p udp -m state --state NEW -m udp --dport 1194 -j ACCEPT #Konfiguration OpenVPN beachten!

TightVNC-Server

-A INPUT -p tcp -m state --state NEW -m tcp --dport 5901 -j ACCEPT #jeder Desktop erhöht die Portnummer!

Raspberry Pi

Standardmäßig gibt es im aktuellen Raspbian Image noch keine Konfigurationsdatei für die Firewall-Regeln. Daher erstellen einer Datei /etc/network/iptables mit einem Editor.

sudo nano /etc/network/iptables

Nun werden die Regeln eingefügt (ohne die Zeilennummern):

*filter
:INPUT DROP [159:12505]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [140:13492]
-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT
  • Zeile 5: erlaubt alle Zugriffe über die Loopback-Schnittstelle lo. Dies können nur Zugriffe vom eigenen Linux-System sein.
  • Zeile 6: erlaubt ICMP-Anfragen (z.B. ping)
  • Zeile 7: erlaubt bereits aufgebaute eingehende Verbindungen generell
  • Zeile 8: erlaubt Zugriffe auf den TCP-Port 22 (ssh-Daemon)
  • Zeile 9: alles verwerfen, was bis hierher gekommen ist (also die vorherigen Regeln nicht gegriffen haben)

Die Regeln laden und anzeigen:

sudo iptables-restore /etc/network/iptables
sudo iptables -L

Die Anzeige dürfte dann so aussehen:

Chain INPUT (policy DROP)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere
ACCEPT     icmp --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
ACCEPT     tcp  --  anywhere             anywhere             state NEW tcp dpt:ssh
REJECT     all  --  anywhere             anywhere             reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Damit die Firewall-Regeln bei einem Neustart des Systems oder des Netzwerkdienstes automatisch geladen werden, muss noch ein Pre-Up Skript erstellen.

sudo vi /etc/network/if-pre-up.d/iptables

In der Datei /etc/network/if-pre-up.d/iptables die folgenden Zeilen einfügen:

#!/bin/sh
/sbin/iptables-restore /etc/network/iptables

Damit das Skript ausgeführt werden kann müssen die Zugriffsrechte entsprechend anpassen werden:

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

Informationen

-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -s 192.168.10.0/24 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -i eth0 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT

Zeile 1: Der "Originalebefehl" Zeile 2: Begrenzung auf ein Netzwerk Zeile 3: Begrenzung auf eine Schnittstelle (z.B. LAN und WLAN)

SSH Brute Force reglementieren

 -A INPUT -i eth0 -p tcp -m tcp --dport 22 -m state --state NEW -m recent --set --name SSH --rsource
 -A INPUT -i eth0 -p tcp -m tcp --dport 22 -m recent --rcheck --seconds 30 --hitcount 4 --rttl --name SSH --rsource -j REJECT --reject-with tcp-reset
 -A INPUT -i eth0 -p tcp -m tcp --dport 22 -m recent --rcheck --seconds 30 --hitcount 3 --rttl --name SSH --rsource -j LOG --log-prefix "SSH brute force "
 -A INPUT -i eth0 -p tcp -m tcp --dport 22 -m recent --update --seconds 30 --hitcount 3 --rttl --name SSH --rsource -j REJECT --reject-with tcp-reset
 -A INPUT -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT
Regel Nummer 1: Pakete, die eine SSH-Verbindung öffnen wollen, sollen als SSH markiert werden.
Regel Nummer 2: Das 4. Eröffnunspaket von einer Quelle innerhalb von 30 Sekunden soll verworfen werden (Verhindert Mehrfacheinträge in der Logdatei).
Regel Nummer 3: Das 3. Eröffnunspaket von einer Quelle innerhalb von 30 Sekunden soll gelogt werden.
Regel Nummer 4: Das 3. Eröffnunspaket von einer Quelle innerhalb von 30 Sekunden soll verworfen werden.
Regel Nummer 5: Was bis hierher gekommen ist (SSH), soll akzeptiert werden.