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.