#!/bin/tcsh # # Firewall Script by Sven Alisch # (c) 2003 # # ====================================================================== # Teil 1: Variablendeklaration # ====================================================================== set IPTABLES = /sbin/iptables # ---------------------------------------------------------------------- # spezielle Ports set p_high = 1024:65535 # unprivilegierte Ports set p_ssh = 500:1023 # gemeinsame SSH Quell Ports # ---------------------------------------------------------------------- # Interfaces set EXT = ppp0 # Hier DSL durch pppd erzeugtes Geraet set INT = eth0 set IF = ( $EXT $INT ) # ---------------------------------------------------------------------- # IP Hosts set NS = ( 192.168.0.1 ) set loghost = 192.168.0.1 set INTERN = 192.168.0.0/255.255.255.0 # Internes Netzwerk set FIREWALL = 192.168.0.1 # ====================================================================== # Teil 2: Grundkonfiguration absichern # ====================================================================== # dynamische Kernelparameter setzen echo "0" > /proc/sys/net/ipv4/ip_forward # erstmal abschalten echo "1" > /proc/sys/net/ipv4/tcp_syncookies echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts echo "1" > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses #echo "5" > /proc/sys/net/ipv4/icmp_destunreach_rate #echo "5" > /proc/sys/net/ipv4/icmp_echoreply_rate #echo "5" > /proc/sys/net/ipv4/icmp_paramprob_rate #echo "10" > /proc/sys/net/ipv4/icmp_timeexceed_rate foreach if ( $IF ) echo "1" > /proc/sys/net/ipv4/conf/$if/rp_filter echo "0" > /proc/sys/net/ipv4/conf/$if/accept_redirects echo "0" > /proc/sys/net/ipv4/conf/$if/accept_source_route echo "0" > /proc/sys/net/ipv4/conf/$if/bootp_relay echo "1" > /proc/sys/net/ipv4/conf/$if/log_martians end # ----------------------------------------------------------------------- # Default Policy und flush $IPTABLES -P INPUT DROP $IPTABLES -P FORWARD DROP $IPTABLES -P OUTPUT DROP $IPTABLES -F # flush aller chains (Tabelle filter) $IPTABLES -t nat -F # flush aller chains (Tabelle nat) $IPTABLES -X # delete all userdefined chains # (Tabelle filter) # ---------------------------------------------------------------------- # lokale Prozesse $IPTABLES -A OUTPUT -o lo -j ACCEPT $IPTABLES -A INPUT -i lo -j ACCEPT # ---------------------------------------------------------------------- # ssh fuer die Fernwartung $IPTABLES -A INPUT -i $INT -s $INTERN \ -p TCP --sport $p_high --dport ssh \ -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT $IPTABLES -A OUTPUT -o $INT -d $INTERN \ -p TCP --dport $p_high --sport ssh \ -m state --state ESTABLISHED,RELATED -j ACCEPT $IPTABLES -A INPUT -i $INT -s $INTERN \ -p UDP --sport $p_high --dport ssh \ -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT $IPTABLES -A OUTPUT -o $INT -d $INTERN \ -p UDP --dport $p_high --sport ssh \ -m state --state ESTABLISHED,RELATED -j ACCEPT $IPTABLES -A INPUT -i $INT -s $INTERN \ -p TCP --sport $p_ssh --dport ssh \ -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT $IPTABLES -A OUTPUT -o $INT -d $INTERN \ -p TCP --dport $p_ssh --sport ssh \ -m state --state ESTABLISHED,RELATED -j ACCEPT $IPTABLES -A INPUT -i $INT -s $INTERN \ -p UDP --sport $p_ssh --dport ssh \ -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT $IPTABLES -A OUTPUT -o $INT -d $INTERN \ -p UDP --dport $p_ssh --sport ssh \ -m state --state ESTABLISHED,RELATED -j ACCEPT # ====================================================================== # Userdefinierte Regelketten # ====================================================================== # ---------------------------------------------------------------------- # DROP & LOG Chain $IPTABLES -N my_drop $IPTABLES -A my_drop -p ICMP -j LOG --log-prefix "DROP-ICMP " $IPTABLES -A my_drop -p UDP -j LOG --log-prefix "DROP-UDP " $IPTABLES -A my_drop -p TCP -j LOG --log-prefix "DROP-TCP " $IPTABLES -A my_drop -j DROP # ====================================================================== # Teil 4: Masquerading, genrell bestehende Verbindungen # ====================================================================== # ---------------------------------------------------------------------- # MASQUERADING $IPTABLES -t nat -A POSTROUTING -o $EXT -j MASQUERADE echo "1" > /proc/sys/net/ipv4/ip_forward # wieder einschalten echo "1" > /proc/sys/net/ipv4/ip_dynaddr # ---------------------------------------------------------------------- # ausgehende Pakete bei bereits aufgebauter Verbindung # # Damit BIND nicht aufzuloesende Pakete weiterleiten kann muss noch ein NEW # bei der OUTPUT Chain bei state hinzugefuegt werden. $IPTABLES -A OUTPUT \ -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT $IPTABLES -A FORWARD -i $INT -o $EXT \ -m state --state ESTABLISHED,RELATED -j ACCEPT # ---------------------------------------------------------------------- # Rueckkanal: eingehende Pakete zu einer bestehenden Verbindung # # Hinweis: der sichere Eintrag ist: # # $IPTABLES -A INPUT -m state --state NEW,INVALID -j my_drop # # Da aber DNS-Anfragen von Clients bei state ein NEW benoetigen, muessen # wir das NEW entfernen! - damit der hier lokal installierte BIND-Server # funktioniert! Des Weiteren geht auch ssh schneller, da die NEW Anfragen # nicht mehr gedropt werden $IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT $IPTABLES -A INPUT -m state --state INVALID -j my_drop # Um diese eben erwaehnte Sicherheit wiederherzustellen entweder: $IPTABLES -A INPUT -i $EXT -m state --state NEW,INVALID -j my_drop $IPTABLES -A FORWARD -i $EXT -o $INT \ -m state --state ESTABLISHED,RELATED -j ACCEPT $IPTABLES -A FORWARD -i $EXT -o $INT \ -m state --state NEW,INVALID -j my_drop # ====================================================================== # Teil 5: Filterregeln fuer lokale Dienste # ====================================================================== # ---------------------------------------------------------------------- # ICMP $IPTABLES -A OUTPUT -p ICMP --icmp-type echo-request -j ACCEPT # ---------------------------------------------------------------------- # SYSLOG $IPTABLES -A OUTPUT -o $INT -m state --state NEW \ -p UDP --sport syslog -d $loghost --dport syslog \ -j ACCEPT # ====================================================================== # Teil 6: Filterregeln fuer Forwarding # ====================================================================== # ---------------------------------------------------------------------- # ICMP $IPTABLES -A FORWARD -o $EXT -p ICMP --icmp-type echo-request \ -j ACCEPT # ---------------------------------------------------------------------- # DNS #foreach ns ( $NS ) # $IPTABLES -A FORWARD -o $EXT -m state --state NEW \ # -p UDP --sport $p_high --dport domain \ # -j ACCEPT # # $IPTABLES -A FORWARD -o $EXT -m state --state NEW \ # -p TCP --sport $p_high --dport domain \ # -j ACCEPT #end $IPTABLES -A INPUT -i $INT -s $INTERN \ -m state --state NEW \ -p UDP --sport $p_high -d $NS --dport domain \ -j ACCEPT $IPTABLES -A INPUT -i $INT -s $INTERN \ -m state --state NEW \ -p TCP --sport $p_high -d $NS --dport domain \ -j ACCEPT $IPTABLES -A OUTPUT -o $EXT -s $FIREWALL \ -m state --state NEW,ESTABLISHED,RELATED \ -p UDP --sport domain --dport domain \ -j ACCEPT $IPTABLES -A OUTPUT -o $EXT -s $FIREWALL \ -m state --state NEW,ESTABLISHED,RELATED \ -p TCP --sport domain --dport domain \ -j ACCEPT # ---------------------------------------------------------------------- # SMTP, POP3 $IPTABLES -A FORWARD -o $EXT -m state --state NEW \ -p TCP --sport $p_high --dport smtp \ -j ACCEPT $IPTABLES -A FORWARD -o $EXT -m state --state NEW \ -p TCP --sport $p_high --dport pop3 \ -j ACCEPT # --------------------------------------------------------------------- # HTTP $IPTABLES -A FORWARD -o $EXT -m state --state NEW \ -p TCP --sport $p_high --dport http \ -j ACCEPT # --------------------------------------------------------------------- # HTTP via SSL $IPTABLES -A FORWARD -o $EXT -m state --state NEW \ -p TCP --sport $p_high --dport https \ -j ACCEPT # --------------------------------------------------------------------- # ident: reject $IPTABLES -A FORWARD -i $EXT \ -p TCP --dport auth --syn -j REJECT # --------------------------------------------------------------------- # ftp, out, control connection $IPTABLES -A FORWARD -o $EXT -m state --state NEW \ -p TCP --sport $p_high --dport ftp \ -j ACCEPT # ftp, out, passive data connection $IPTABLES -A FORWARD -o $EXT -m state --state NEW \ -p TCP --sport $p_high --dport $p_high \ -j ACCEPT # -------------------------------------------------------------------- # Ausputzer: Rest sperren, loggen $IPTABLES -A INPUT -j my_drop $IPTABLES -A FORWARD -j my_drop $IPTABLES -A OUTPUT -j my_dropDiese Datei erstellen und am besten unter /etc/firewall abspeichern. Das Verzeichnis natürlich vorher anlegen.