Code:
#!/bin/bash
echo "executing script:"
# Folgend alle Variablen die irgendwelche Ports öffnen, das
# bedeutet, das diese Firewall erst mal alles dicht macht,
# eine sogenannte restriktive Firewall
NET2SERVER=""
LAN2SERVER="ssh domain http sunrpc hostname rpc2portmap
webcache https ipp mysql 10000 32768"
SERVER2LAN="ssh domain hostname rpc2portmap ipp 32768"
SERVER2NET="ftp ftp-data http https"
NET2LAN=""
LAN2NET="ftp ftp-data http https pop3s cvspserver 5190
8000 8030 8032 8400 8780"
PORTS2REJECT="auth 4661 4662 4663 4664 4665 4666"
NIC2NET="ppp0"
NICs2LAN="eth1 eth2"
allowedICMP="echo-request destination-unreachable
source-quench time-exceeded parameter-problem"
## Module laden ##
#############################################
modprobe -v ip_tables
modprobe -v ip_conntrack
modprobe -v iptable_filter
modprobe -v iptable_mangle
modprobe -v iptable_nat
modprobe -v ipt_LOG
modprobe -v ipt_limit
modprobe -v ipt_state
modprobe -v ipt_owner
modprobe -v ipt_REJECT
modprobe -v ipt_MASQUERADE
modprobe -v ip_conntrack_ftp
modprobe -v ip_nat_ftp
## Kernelparameter setzen ##
#############################################
# accept_source_route: Dies würde erlauben, das fremde Rechner
# den Weg definieren dürfen, den Packete nehmen. Weg.
# accept_redirects: Dies würde fremden Rechnern das
# Manipulieren der Routing-Tabelle erlauben. Weg.
# *_redirects: Dies würde fremden Rechnern das Manipulieren
# der Routing-Tabelle erlauben. Weg.
for i in /proc/sys/net/ipv4/conf/*/{accept_source_route,
accept_redirects,send_redirects}
do
echo 0 >$i
done
# Pakete sollen auch weitergeleitet werden "(--> LAN)"
echo 1 >/proc/sys/net/ipv4/ip_FORWARD
# SynCookie-Schutz aktivieren
echo 1 >/proc/sys/net/ipv4/tcp_syncookies
## alle Regeln zurücksetzen ##
#############################################
# Folgende Tabellen gibt es unter Linux, jede enthält chains, welche
# die eigentlichen Regeln sind:
# filter: Enthält alle filternden Regeln
# nat: Enthält Regeln, welche Ziele verdeckt weiterleiten
# (z.B. Server im LAN von außen erreichen)
# mangle: Hier können Pakete gemangled werden, also manipuliert.
# Zuallererst wir alles zurückgesetzt, das heißt alle Regeln gelöscht
# und alle Tabellen auf drop gesetzt.
# -F steht für flush, also leeren. -X steht für erase, also löschen.
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X
iptables -t nat -X
iptables -t mangle -X
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
echo "All Rules deleted."
## neue Regeln ##
#############################################
# INPUT kommt von draußen, # OUTPUT geht rauswärts. Da viele Sachen
# über höhere Ports ( >=1024 ) abgehandelt werden, nachdem
# auf einem Standard-port die Verbindung verhandelt wurde, lassen
# wir alle eingehenden TCP-Verbindungen zu, die NICHT das erste
# Paket einer Übertragung sind. ESTABLISHED steht für verbunden,
# d.h. zugehörig zu einer bestehenden Verbindung. RELATED sind
# Verbindungen, welche vermutlicht ebenfalls zu einer bestehenden
# dazugehören.
iptables -A INPUT -p ALL -m state --state ESTABLISHED,RELATED -j ACCEPT
echo "INPUT-states defined!!"
iptables -A OUTPUT -p ALL -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
echo "OUTPUT-states defined!!"
# Lokale (-i[nterface] lo) Kommunikation soll natürlich frei verlaufen.
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# Nun lasse ich den Kontakt zu meinem Server zu. Ähnlich
# verfährt man mit allen anderen Servern. dport steht für
# d[estination]port und sport für s[ource]port.
for port in $SERVER2NET; do
iptables -A OUTPUT -p tcp --sport $port -j ACCEPT
iptables -A OUTPUT -p udp --sport $port -j ACCEPT
echo "srv2net: Port $port allowed"
done
for port in $NET2SERVER; do
iptables -A INPUT -p tcp --dport $port -j ACCEPT
iptables -A INPUT -p udp --dport $port -j ACCEPT
echo "net2srv: Port $port allowed"
done
# Nun den Kontakt zwischen LAN und SERVER
for port in $SERVER2LAN; do
for NIC in $NICs2LAN; do
iptables -A OUTPUT -o $NIC -p tcp --sport $port -j ACCEPT
iptables -A OUTPUT -o $NIC -p udp --sport $port -j ACCEPT
echo "srv2lan: Port $port on $NIC allowed"
done
done
for port in $LAN2SERVER; do
for NIC in $NICs2LAN; do
iptables -A INPUT -i $NIC -p tcp --dport $port -j ACCEPT
iptables -A INPUT -i $NIC -p udp --dport $port -j ACCEPT
echo "lan2srv: Port $port on $NIC allowed"
done
done
# Nun folgen Regeln um das LAN ins internet zu bringen. Dies geschiet
# AUSSCHLIEßLICH über die FORWARD-chain. -o Gerät definiert,
# ob es rauswärts oder reinwärts geht.
iptables -A FORWARD -o $NIC2NET -p ALL -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
for NIC in $NICs2LAN; do
iptables -A FORWARD -o $NIC -p ALL -m state --state ESTABLISHED,RELATED -j ACCEPT
echo "nics2lan: $NIC opened"
done
for port in $LAN2NET; do
iptables -A FORWARD -o $NIC2NET -p tcp --sport $port -j ACCEPT
iptables -A FORWARD -o $NIC2NET -p udp --sport $port -j ACCEPT
echo "lan2net: Port $port on $NIC2NET allowed"
done
for port in $NET2LAN; do
for NIC in $NICs2LAN; do
iptables -A FORWARD -o $NIC -p tcp --sport $port -j ACCEPT
iptables -A FORWARD -o $NIC -p udp --sport $port -j ACCEPT
echo "net2lan: Port $port on $NIC allowed"
done
done
# Zuletzt aktivieren wir die NAT, somit werden die LAN-Clients auf die
# Internetseitige IP gefälscht, um von außen den Eindruck eines einzigen
# Rechners zu erzeugen.
iptables -t nat -A POSTROUTING -o $NIC2NET -j MASQUERADE
# Nun öffnen wir die Kommunikation zur Namensauflösung "(DNS: port 53)".
# Zuerst die ANfrage an einen DNS. Dieses läuft erst über UDP, wenns
# nicht klappt über TCP. Die Antwort ist schwieriger, da die Antwort
# über UDP läuft und die firewall somit nicht erkennen kann, ob es eine
# bestehende oder neue Verbindung sein soll. Daher geben wir explizit
# den DNS-Server an.
iptables -A OUTPUT -p udp --sport 1024: --dport 53 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 1024: --dport 53 -j ACCEPT
for DNS in $(cut -d ' ' -f 2 /etc/resolv.conf)
do
iptables -A INPUT -p udp -s $DNS --sport 53 -j ACCEPT
iptables -A INPUT -p tcp -s $DNS --sport 53 -j ACCEPT
echo "DNS $DNS opened."
done
# Jetzt kümmern wir uns, um bestimmte ICMP-Packete, welche
# nicht Port, sondern Inhalt-abhängig sind (Fehlermeldungen).
# Da wir zur Fehlersuche nicht auf PING in jede Richtung
# verzichten möchten, lassen wir alles durch.
for type in $allowedICMP; do
for NIC in $NICs2LAN; do
iptables -A INPUT -i $NIC -p icmp --icmp-type $type -j ACCEPT
iptables -A OUTPUT -o $NIC -p icmp --icmp-type $type -j ACCEPT
echo "ICMP: $type on $NIC allowed."
done
done
#**Und zuletzt erlauben wir jedwegen Traffic INNERHALB des LAN
iptables -A FORWARD -i eth1 -o eth2 -j ACCEPT
iptables -A FORWARD -i eth2 -o eth1 -j ACCEPT
echo "LAN2LAN enabled!"
#**
## Logging ##
#############################################
# Wir lassen die restlichen Pakete durchlaufen, aber ignorieren sie,
# denn wir wollen es einem Eindringling nicht gönnen, herauszufinden,
# was wir so blocken. Einige Ports blocken wir offen, um endlose
# Wartevorgänge auf der anderen Seite zu verhindern.
for PORT in $PORTS2REJECT; do
iptables -A INPUT -p tcp --dport $PORT -j REJECT --reject-with tcp-reset
iptables -A FORWARD -i $NIC2NET -p tcp --dport $PORT -j REJECT --reject-with tcp-reset
echo "$PORT will be rejected."
done
iptables -A INPUT -j DROP
# NETBIOS und CUPS droppen wir Kommentarlos, alles andere zeichnen wir auf.
iptables -A INPUT -p tcp --dport netbios-ns -j DROP
iptables -A INPUT -p tcp --dport netbios-dgm -j DROP
iptables -A INPUT -p tcp --dport netbios-ssn -j DROP
iptables -A INPUT -p udp --dport netbios-ns -j DROP
iptables -A INPUT -p udp --dport netbios-dgm -j DROP
iptables -A INPUT -p udp --dport netbios-ssn -j DROP
iptables -A INPUT -p tcp --dport 631 -j DROP
iptables -A INPUT -p udp --dport 631 -j DROP
iptables -A INPUT -j LOG
iptables -A OUTPUT -j LOG
iptables -A FORWARD -j LOG
# Außerdem wollen wir die Welt um uns nicht mit ungewollten
# Paketen belästigen, daher werden diese zurückgewiesen.
iptables -A OUTPUT -p tcp -j REJECT --reject-with tcp-reset
iptables -A OUTPUT -p udp -j REJECT
iptables -A OUTPUT -j DROP
echo "Finished!"
Nicht über die Unterschiede zur Anlage wundern, sind nur "kosmetischer" Natur...
Lesezeichen