Benutzer-Werkzeuge

Webseiten-Werkzeuge


linux:security:iptables_skript

iptables Skript

Unter Linux ist iptables die am weitesten verbreitete Firewall.
In diesem How To wird drauf eingegangen, wie man die Firewall bei jedem Start über ein kofigurierbares Skript anschaltet.
Anschließend wird mit Hilfe eines cronjobs alle 10 Minuten die Firewall neu geladen, falls man vergisst sie wieder zu aktivieren
nachdem man sie deaktiviert hat. Alle geblockten Frames werden mit syslog nach /var/log/firewall geloggt.
Und damit uns nicht irgendwann der Speicher voll läuft und die Datei zu groß wird, wird logrotation konfiguriert.
Die hier erklärte Vorgehensweise ist für Debian 6 und Debian 7 getestet.
SLES muss eventuell anders gehandhabt werden!

Installation

nano /etc/init.d/firewall

Es muss das Device und unter den Service Definitionen müssen die Services für eingehende Verbindungen pro Server angepasst werden!
Das Skript erlaubt standardmässig an eingehenden Verbindungen nur https, ssh und snmp und alle ausgehenden Verbindungen.

#!/bin/bash
# ---------------------------------------------------------------------
# Linux-iptables-Firewallskript, Copyright (c) 2009 under the GPL
# Autogenerated by iptables Generator v1.22 (c) 2002-2009 by Harald Bertram
# Please visit http://harry.homelinux.org for new versions of
# the iptables Generator (c).
#
# This Script was generated by request from:
# ralph@globe.lu on: 2009-7-10 15:53.3 MET.
#
# If you have questions about the iptables Generator or about
# your Firewall-Skript feel free to take a look at out website or
# send me an E-Mail to webmaster@harry.homelinux.org.
#
# My special thanks are going to Lutz Heinrich (trinitywork at hotmail dot c$
# who made lots of Beta-Testing and gave me lots of well qualified
# Feedback that made me able to improve the iptables Generator.
# --------------------------------------------------------------------
### BEGIN INIT INFO
# Provides:          firewall
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start daemon at boot time
# Description:       Enable service provided by daemon.
### END INIT INFO
 
# iptables suchen
PATH=$PATH:/sbin
iptables=`which iptables`
 
# Device festlegen
device="eth0"
 
# wenn iptables nicht installiert abbrechen
test -f $iptables || exit 0
 
case "$1" in
  start)
    echo "Starte IP-Paketfilter"
 
    # Tabelle flushen
    iptables -F
    iptables -t nat -F
    iptables -t mangle -F
    iptables -X
    iptables -t nat -X
    iptables -t mangle -X
 
    # Default-Policies setzen
    iptables -P INPUT DROP
    iptables -P OUTPUT DROP
    iptables -P FORWARD DROP
 
    # MY_REJECT-Chain
    iptables -N MY_REJECT
 
    # MY_REJECT fuellen
    iptables -A MY_REJECT -p tcp -m limit --limit 7200/h -j LOG --log-prefix "IPTABLES: REJECT TCP "
    iptables -A MY_REJECT -p tcp -j REJECT --reject-with tcp-reset
    iptables -A MY_REJECT -p udp -m limit --limit 7200/h -j LOG --log-prefix "IPTABLES: REJECT UDP "
    iptables -A MY_REJECT -p udp -j REJECT --reject-with icmp-port-unreachable
    iptables -A MY_REJECT -p icmp -m limit --limit 7200/h -j LOG --log-prefix "IPTABLES: DROP ICMP "
    iptables -A MY_REJECT -p icmp -j DROP
    iptables -A MY_REJECT -m limit --limit 7200/h -j LOG --log-prefix "IPTABLES: REJECT OTHER "
    iptables -A MY_REJECT -j REJECT --reject-with icmp-proto-unreachable
 
    # MY_DROP-Chain
    iptables -N MY_DROP
    iptables -A MY_DROP -m limit --limit 7200/h -j LOG --log-prefix "IPTABLES: PORTSCAN DROP "
    iptables -A MY_DROP -j DROP
 
    # Alle verworfenen Pakete protokollieren
    iptables -A INPUT -m state --state INVALID -m limit --limit 7200/h -j LOG --log-prefix "IPTABLES: INPUT INVALID "
    iptables -A OUTPUT -m state --state INVALID -m limit --limit 7200/h -j LOG --log-prefix "IPTABLES: OUTPUT INVALID "
 
    # Korrupte Pakete zurueckweisen
    iptables -A INPUT -m state --state INVALID -j DROP
    iptables -A OUTPUT -m state --state INVALID -j DROP
 
    # Stealth Scans etc. DROPpen
    # Keine Flags gesetzt
    iptables -A INPUT -p tcp --tcp-flags ALL NONE -j MY_DROP
 
    # SYN und FIN gesetzt
    iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j MY_DROP
 
    # SYN und RST gleichzeitig gesetzt
    iptables -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j MY_DROP
 
    # FIN und RST gleichzeitig gesetzt
    iptables -A INPUT -p tcp --tcp-flags FIN,RST FIN,RST -j MY_DROP
 
    # FIN ohne ACK
    iptables -A INPUT -p tcp --tcp-flags ACK,FIN FIN -j MY_DROP
 
    # PSH ohne ACK
    iptables -A INPUT -p tcp --tcp-flags ACK,PSH PSH -j MY_DROP
 
    # URG ohne ACK
    iptables -A INPUT -p tcp --tcp-flags ACK,URG URG -j MY_DROP
 
    # Loopback-Netzwerk-Kommunikation zulassen
    iptables -A INPUT -i lo -j ACCEPT
    iptables -A OUTPUT -o lo -j ACCEPT
 
    # Connection-Tracking aktivieren
    iptables -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
    iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
 
    # ICMP Ping erlauben
    iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
    iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
    iptables -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
    iptables -A OUTPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
    iptables -A INPUT -p icmp --icmp-type source-quench -j ACCEPT
    iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
    iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
    iptables -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT
    iptables -A INPUT -p icmp --icmp-type parameter-problem -j ACCEPT
 
    ### SERVICE DEFINITIONEN ANFANG ###
 
    # HTTP
    #iptables -A INPUT -i $device -m state --state NEW -p tcp --dport 80 -j ACCEPT -m comment --comment "HTTP"
 
    # HTTPS
    iptables -A INPUT -i $device -m state --state NEW -p tcp --dport 443 -j ACCEPT -m comment --comment "HTTPS"
 
    # SNMP
    # iptables -A INPUT -i $device -m state --state NEW -p udp -s 172.17.193.94 --dport 161 -j ACCEPT -m comment --comment "SNMP"
 
    # SMTP
    # iptables -A INPUT -i $device -m state --state NEW -p tcp --dport 25 -j ACCEPT -m comment --comment "SMTP"
 
    # SMTPS
    # iptables -A INPUT -i $device -m state --state NEW -p tcp --dport 465 -j ACCEPT -m comment --comment "SMTPS"
 
    # SSH
    iptables -A INPUT -i $device -m state --state NEW -p tcp --dport 22 -j ACCEPT -m comment --comment "SSH"
 
    # MYSQL
    # iptables -A INPUT -i $device -m state --state NEW -p tcp --dport 3306 -j ACCEPT -m comment --comment "MySQL"
 
    # NTP
    # iptables -A INPUT -i $device -m state --state NEW -p udp --dport 123 -j ACCEPT -m comment --comment "NTP"
 
    # rsyslog
    # iptables -A INPUT -i $device -m state --state NEW -p udp --dport 514 -j ACCEPT -m comment --comment "Syslog"
    # iptables -A INPUT -i $device -m state --state NEW -p tcp --dport 514 -j ACCEPT -m comment --comment "Syslog"
 
    # FTP
    # iptables -A INPUT -i $device -m state --state NEW -p udp --dport 21 -j ACCEPT -m comment --comment "FTP"
    # iptables -A INPUT -i $device -m state --state NEW -p tcp --dport 21 -j ACCEPT -m comment --comment "FTP"
 
    ### SERVICE DEFINITIONEN ENDE ###
 
    # Default-Policies mit REJECT
    iptables -A INPUT -j MY_REJECT
    iptables -A OUTPUT -j MY_REJECT
    ;;
 
  stop)
    echo "Stoppe IP-Paketfilter"
    # Tabelle flushen
    iptables -F
    iptables -t nat -F
    iptables -t mangle -F
    iptables -X
    iptables -t nat -X
    iptables -t mangle -X
    # Default-Policies setzen
    iptables -P INPUT ACCEPT
    iptables -P OUTPUT ACCEPT
    iptables -P FORWARD ACCEPT
    ;;
 
  restart)
    echo "Restarte IP-Paketfilter"
    $0 stop
    $0 start
    ;;
 
  status)
    echo "Tabelle filter"
    iptables -L -vn
    echo "Tabelle nat"
    iptables -t nat -L -vn
    echo "Tabelle mangle"
    iptables -t mangle -L -vn
    ;;
 
  *)
    echo "Fehlerhafter Aufruf"
    echo "Syntax: $0 {start|stop|restart|status}"
    exit 1
    ;;
 
esac
exit 0
chmod +x /etc/init.d/firewall
nano /etc/network/if-pre-up.d/iptables
#!/bin/sh
/etc/init.d/firewall start
chmod +x /etc/network/if-pre-up.d/iptables

crontab job

crontab -e
# Reset firewall every hour in case someone forgot
10   *  *   *   *   /etc/network/if-pre-up.d/iptables >/dev/null 2>&1

Filter

Das iptables Skript logt alle verworfenen Pakete nach /var/log/messages.
Um für eine bessere Übersichtlichkeit die Logs in eine eigene Datei zu schreiben, müssen die syslog Daemons angepasst werden.

syslog-ng Filter

nano /etc/syslog-ng/syslog-ng.conf

Wenn nicht in der Datei vorhanden unter die @version Zeile folgende Zeile einfügen:

include "/etc/syslog-ng/conf.d/";

Sollte die Zeile schon vorhanden sein, muss sie unter die @version Zeile verschoben werden!

mkdir -p /etc/syslog-ng/conf.d/
nano /etc/syslog-ng/conf.d/00-firewall.conf
destination d_firewall { file("/var/log/firewall.log"); };
filter f_firewall { match(".*IPTABLES:.*" value(MESSAGE)); };
log { source(s_src); filter(f_firewall); destination(d_firewall); flags(final);};
touch /var/log/firewall.log
/etc/init.d/syslog-ng reload

rsyslog Filter

nano /etc/rsyslog.d/00-firewall.conf
# sort iptables Logs
:msg, contains, "IPTABLES:" /var/log/firewall.log
:msg, contains, "IPTABLES:" ~
touch /var/log/firewall.log
/etc/init.d/rsyslog restart

Logrotation

Da die Logs auf Dauer viel Platz einnehmen, sollten wir Logrotation konfigurieren.

nano /etc/logrotate.d/firewall
/var/log/firewall.log {
# rotate log files daily
daily
# keep 7 revisions of logfiles
rotate 7
# create new (empty) log files after rotating old ones
create
# compress logfiles
compress
missingok
notifempty
}

Die schon vorkonfigurierten Cronjobs rotieren ab jetzt die Firewalllogs.

linux/security/iptables_skript.txt · Zuletzt geändert: 2014/09/09 13:31 von Madic