Das vollständige Firewall-Skript

#!/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_drop
Diese Datei erstellen und am besten unter /etc/firewall abspeichern. Das Verzeichnis natürlich vorher anlegen.



Sven Alisch 2005-08-28