iptables personal firewall

Personal Firewall einrichten

Die angegebenen Werte sind nur Beispiel-Werte und müssen natürlich angepasst werden.

Hier mal eine Beispiel-Konfiguration:

#!/bin/sh
# Variablen
LAN_IFACE="eth0"
LAN_IP="192.168.XXX.XXX"
LAN_NET="192.168.XXX.0/24"
 
# Setzen von Kernelparametern
for i in /proc/sys/net/ipv4/conf/*/{accept_source_route,accept_redirects,send_redirects}; do
    echo 0 > $i
done
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
 
### Firewall initialisieren ###
echo "Initialisiere Firewall ..."
iptables -F                                  # Regeln aller Chains löschen
iptables -X                                  # Alle selbst erstellten Chains löschen
iptables -P INPUT DROP                       # Alles was nicht explizit erlaubt ist ...
iptables -P OUTPUT DROP                      # ... wird gedroppt.
iptables -P FORWARD DROP                     #
iptables -Z                                  # Zähler zurücksetzen
iptables -N OWNDROP                          # Eigene Chain für separate Verarbeitung erstellen
iptables -N OWNACCEPT                        # ...
iptables -N SYN-FLOOD                        # DoS-Attacken eingrenzen
 
### Lokale Kommunikation ###
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
 
### Stateful Inspection Regeln ###
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state --state INVALID -j OWNDROP
iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
 
### Eigene Chains OWNDROP und OWNACCEPT konfigurieren (Logging) ###
iptables -A OWNDROP -j LOG --log-prefix "FW-DROP: "
iptables -A OWNDROP -j DROP
iptables -A OWNACCEPT -j LOG --log-prefix "FW-ACCEPT: "
iptables -A OWNACCEPT -j ACCEPT
 
### Schutz vor Syn-Flooding ###
# limits incoming packets
iptables -A SYN-FLOOD -m limit --limit 10/second --limit-burst 50 -j RETURN
# log attacks
iptables -A SYN-FLOOD -j LOG --log-prefix "SYN flood: "
# silently drop the rest
iptables -A SYN-FLOOD -j DROP
 
### Ports und Dienste nach aussen freischalten ###
# Eingehende SSH-Verbindungen
iptables -A INPUT -p tcp --dport 22 -j OWNACCEPT
# Ausgehende SSH-Verbindungen
iptables -A OUTPUT -p tcp --dport 22 -j OWNACCEPT
# PING
iptables -A INPUT -p icmp -j ACCEPT
iptables -A OUTPUT -p icmp -j ACCEPT
# ausgehende DNS-Anfragen
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
# WWW
iptables -A INPUT -p tcp --dport 80 -j OWNACCEPT
iptables -A OUTPUT -p tcp --dport 80 -j OWNACCEPT
iptables -A INPUT -p tcp --dport 443 -j OWNACCEPT
iptables -A OUTPUT -p tcp --dport 443 -j OWNACCEPT
# Mails
iptables -A OUTPUT -p tcp --dport 25 -j OWNACCEPT
iptables -A OUTPUT -p tcp --dport 110 -j OWNACCEPT
iptables -A OUTPUT -p tcp --dport 143 -j OWNACCEPT
# Samba
iptables -A INPUT -p udp -m multiport --destination-port 137,138 -s $LAN_NET -j ACCEPT
iptables -A INPUT -p tcp -m multiport --destination-port 139,445 -s $LAN_NET -j ACCEPT
iptables -A OUTPUT -p udp -m multiport --destination-port 137,138 -d $LAN_NET -j ACCEPT
iptables -A OUTPUT -p tcp -m multiport --destination-port 139,445 -d $LAN_NET -j ACCEPT
iptables -A INPUT -p udp --sport 137 -s $LAN_NET -j OWNACCEPT
# NTP
iptables -A INPUT -p udp --dport 123 -s $LAN_NET -j ACCEPT
iptables -A OUTPUT -p udp --dport 123 -j ACCEPT
# SNMP
iptables -A INPUT -p udp --dport 161 -s $LAN_NET -j ACCEPT
iptables -A INPUT -p tcp --dport 161 -s $LAN_NET -j ACCEPT
iptables -A OUTPUT -p udp --dport 161 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 161 -j ACCEPT
 
# Protokollierung aller übriggebliebenen Pakete, die verworfen werden
iptables -A INPUT -j LOG --log-prefix "FW-LAST-DROP: "
 
### Fertig ###
echo "Firewall ist konfiguriert und aktiv"

Eigene Logdateien

Log-Präfix einstellen

Damit man die Logs, die iptables erzeugt, vom normalen syslog trennen kann, muss man die Logging-Einträge erst einmal eindeutig kennzeichnen. Dazu am besten eigene Ketten erstellen:

# Eigene Chains MYDROP und MYACCEPT konfigurieren (Logging)
iptables -A OWNDROP -j LOG --log-prefix "FW-DROP: "
iptables -A OWNDROP -j DROP
iptables -A OWNACCEPT -j LOG --log-prefix "FW-ACCEPT: "
iptables -A OWNACCEPT -j ACCEPT

oder die vorhandenen anpassen:

iptables -A DROP -j LOG --log-prefix "FW-DROP: "
iptables -A DROP -j DROP
iptables -A ACCEPT -j LOG --log-prefix "FW-ACCEPT: "
iptables -A ACCEPT -j ACCEPT

Der entsprechende Präfix ist natürlich frei wählbar.

rsyslogd konfigurieren

Jetzt muss man nur noch eine entsprechende Konfigurations-Datei unter /etc/rsyslog.d/iptables.conf anlegen und folgende Zeilen einfügen:

:msg, contains, "FW-ACCEPT: " /var/log/iptables/accept.log
& ~
:msg, contains, "FW-DROP: " /var/log/iptables/drop.log
:msg, contains, "FW-LAST-DROP: " /var/log/iptables/drop.log
& ~

Damit werden alle Einträge die „FW-ACCEPT: „, „FW-DROP: “ oder „FW-LAST-DROP: “ enthalten in separate Logdateien geschrieben. Man muss sich auch keine Gedanken um das Anlegen der Dateien machen. Das erledigt der RSyslog-Daemon bei dem obligatorischen Neustart von alleine:

/etc/init.d/rsyslogd restart

Die letzte Zeile mit dem Inhalt „& ~“ bedeutet, dass diese Nachrichten nicht mehr in das Standard-Log geschrieben werden.

In neueren rsyslog-Versionen ist die Tilde „~“ deprecated, weshalb man sie ersetzen sollte. Die neue Schreibweise sieht so aus:

:msg, contains, "FW-ACCEPT: " /var/log/iptables/accept.log
& stop
:msg, contains, "FW-DROP: " /var/log/iptables/drop.log
:msg, contains, "FW-LAST-DROP: " /var/log/iptables/drop.log
& stop

Logs rotieren

Damit die Logdateien nicht irgendwann die Festplatte zulaufen lassen, sollte auch eine entsprechende logrotate-Konfiguration nicht fehlen. Siehe Logrotate/iptables.