Dies ist das von uns
erarbeitete Script für unsere Firewall:
#!/bin/bash
# Zensur-Hinweis
# Da dieses Script von der LUG Krefeld erstellt worden ist, soll es auch
# innerhalb und ausserhalb dieser Gruppe veroeffentlicht werden duerfen.
# Da es jedoch teilweise sicherheitsrelevante interne Daten wie z.B.
# interne IP-Adressen enthaelt, sind einige Zeilen mit "### ZENSUR"
# gekennzeichnet. Diese Zeilen muessen vor der Veroeffentlichung entfernt
# werden. Dies kann z.B. erfolgen mit:
DEV_INET=ppp0
DEV_BAYENNET=eth0
DEV_LUGNET=eth1
# Beispiel:
# LOCALNET=192.168.1.0/24
# Die Maske fuer Server im Internet. Sie wird fuer smtp, news etc. benutzt.
# Im Zweifelsfalle kann hier ! $LOCALNET eingetragen werden.
# Die hier angegebene scheint fuer T-Online zu taugen.
PROVIDERSERVER=194.25.134.0/24
# Wenn ich komplexe Dienste habe, die mehr als einen Port haben und diese nicht
# global, sondern nur bestimmten Rechnern freigeben will, ist es sinnvoll, hierfuer
# eigene chains zu erzeugen. Dies geschieht in den folgenden Routinen.
makechain_tonline(){
# Wenn auf einem Rechner die T-Online 3.0-Software laufen darf,
# kommen seine Pakete in diese Chain:
# Es ist vorher sichergestellt, dass nur ausgehende Verb. hierhergelangen
TONLINESERVER=194.25.134.0/24
iptables -N tonline
# Beim Verbindungsaufbau geht ein einzelnes Paket an diesen Port:
iptables -A tonline -j ACCEPT -s $LOCALNET -d $TONLINESERVER -p udp --dport 811
iptables -A tonline -j ACCEPT -d $LOCALNET -s $TONLINESERVER -p udp --sport 811
# Das ist die eigentliche T-Online-Classic-Verbindung
iptables -A tonline -j ACCEPT -s $LOCALNET -d $TONLINESERVER -p tcp --dport 866
iptables -A tonline -j ACCEPT -d $LOCALNET -s $TONLINESERVER -p tcp --sport 866
}
makechain_email(){
# Wenn ein Rechner einen eigenen EMail-Client haben darf,
# kommen seine Pakete in diese Chain:
# Es ist vorher sichergestellt, dass nur ausgehende Verb. hierhergelangen
iptables -N email
iptables -A email -j ACCEPT -s $LOCALNET -d ! $LOCALNET -p tcp --dport pop3
iptables -A email -j ACCEPT -d $LOCALNET -s ! $LOCALNET -p tcp --sport pop3
iptables -A email -j ACCEPT -s $LOCALNET -d $PROVIDERSERVER -p tcp --dport smtp
iptables -A email -j ACCEPT -d $LOCALNET -s $PROVIDERSERVER -p tcp --sport smtp
}
makechain_laestig(){
# Hier werden Pakete, die ab und zu vorkommen, die nervig sind, die aber nicht
# ins logfile sollen, weil sie bekannt und unvermeidbar sind, verworfen.
iptables -N laestig
iptables -A laestig -j DROP -p udp --sport netbios-dgm --dport netbios-dgm \
-m limit --limit 10/minute --limit-burst 10
iptables -A laestig -j DROP -p udp --sport netbios-ns --dport netbios-ns \
-m limit --limit 10/minute --limit-burst 10
}
makechains(){
makechain_tonline
makechain_email
makechain_laestig
}
deletechains(){
iptables -X tonline >/dev/null 2>&1
iptables -X email >/dev/null 2>&1
iptables -X laestig >/dev/null 2>&1
}
flush(){
iptables -P INPUT $1
iptables -P OUTPUT $1
iptables -P FORWARD $1
iptables -F
iptables -F INPUT
iptables -F OUTPUT
iptables -F FORWARD
iptables -X in_private >/dev/null 2>&1
iptables -X papierkorb >/dev/null 2>&1
iptables -X netzeingang >/dev/null 2>&1
iptables -X netzausgang >/dev/null 2>&1
iptables -X fweingang >/dev/null 2>&1
iptables -X fwausgang >/dev/null 2>&1
deletechains
# Masquerading und Routing abschalten
iptables -t nat -F POSTROUTING
echo 0 >/proc/sys/net/ipv4/ip_forward
}
stop() {
flush ACCEPT
}
close() {
flush DROP
}
start() {
# Erstmal ein Unterprogramm aufrufen, um alles zu sperren
flush DROP
# Kette papierkorb
# hier landen alle Pakete, die geloggt und weggeschmissen werden
iptables -N papierkorb
iptables -A papierkorb -j LOG --log-level notice \
-m limit --limit 60/minute --limit-burst 20
iptables -A papierkorb -j DROP
# Verhindern, dass Pakete mit privaten Adressen von draussen hereinkommen
iptables -N in_private
iptables -F in_private
iptables -A in_private -j papierkorb -s 127.0.0.0/8
iptables -A in_private -j papierkorb -s 10.0.0.0/8
iptables -A in_private -j papierkorb -s 172.16.0.0/12
iptables -A in_private -j papierkorb -s 192.168.0.0/16
iptables -A in_private -j papierkorb -s 224.0.0.0/4
iptables -A in_private -j papierkorb -s 240.0.0.0/4
# INPUT und FORWARD auf solche privaten Adressen ueberpruefen
iptables -A INPUT -j in_private -i $DEV_INET
iptables -A FORWARD -j in_private -i $DEV_INET
# Sachen, die der Nameserver selber im Internet darf:
iptables -A OUTPUT -j ACCEPT -o $DEV_INET -p tcp --sport 1024: --dport domain \
-m state --state ESTABLISHED,NEW
iptables -A OUTPUT -j ACCEPT -o $DEV_INET -p udp --sport 1024: --dport domain \
-m state --state ESTABLISHED,NEW
iptables -A INPUT -j ACCEPT -i $DEV_INET -p tcp --sport domain --dport 1024: \
-m state --state ESTABLISHED
iptables -A INPUT -j ACCEPT -i $DEV_INET -p udp --sport domain --dport 1024: \
-m state --state ESTABLISHED
# Spezialchains erzeugen
makechains
# Eingang in die Firewall selber:
############################################################################
iptables -N fweingang
iptables -A INPUT -j fweingang -i $DEV_BAYENNET
iptables -A INPUT -j fweingang -i $DEV_LUGNET
iptables -N fwausgang
iptables -A OUTPUT -j fwausgang -o $DEV_BAYENNET
iptables -A OUTPUT -j fwausgang -o $DEV_LUGNET
# Grundvoraussetzungen fuer geroutete Pakete:
iptables -A fweingang -j papierkorb -s ! $LOCALNET
iptables -A fweingang -j papierkorb -m state --state INVALID
iptables -A fwausgang -j papierkorb -d ! $LOCALNET
iptables -A fwausgang -j papierkorb -m state --state INVALID,NEW
# Windows-Broadcasts wegfiltern:
iptables -A fweingang -j laestig
# ICMP-Pakete freigeben.
# Typ 3/Code 4 "fragmentation needed" kommt oft vor. Darueber sollte ich
# interne Clients informieren.
iptables -A fwausgang -j ACCEPT -p icmp --icmp-type fragmentation-needed
# und jetzt werden die eigentlichen Protokolle freigegeben
iptables -A fweingang -j ACCEPT -p tcp --dport ssh
iptables -A fwausgang -j ACCEPT -p tcp --sport ssh
# iptables -A fweingang -j ACCEPT -p tcp --dport telnet
# iptables -A fwausgang -j ACCEPT -p tcp --sport telnet
iptables -A fweingang -j ACCEPT -p tcp --dport domain
iptables -A fwausgang -j ACCEPT -p tcp --sport domain
iptables -A fweingang -j ACCEPT -p udp --dport domain
iptables -A fwausgang -j ACCEPT -p udp --sport domain
# Vorschlag:
# (Das wuenscht sich Kai)
#tcp fweingang,telnet
# Ein- und Ausgangspakete fuer die beiden lokalen Netze in gemeinsame Chains
############################################################################
iptables -N netzeingang
iptables -A FORWARD -j netzeingang -i $DEV_INET -o $DEV_BAYENNET
iptables -A FORWARD -j netzeingang -i $DEV_INET -o $DEV_LUGNET
iptables -N netzausgang
iptables -A FORWARD -j netzausgang -o $DEV_INET -i $DEV_BAYENNET
iptables -A FORWARD -j netzausgang -o $DEV_INET -i $DEV_LUGNET
# Grundvoraussetzungen fuer geroutete Pakete:
iptables -A netzeingang -j papierkorb -d ! $LOCALNET
iptables -A netzeingang -j papierkorb -m state --state INVALID,NEW
iptables -A netzausgang -j papierkorb -s ! $LOCALNET
iptables -A netzausgang -j papierkorb -m state --state INVALID
# und jetzt werden die eigentlichen Protokolle freigegeben
iptables -A netzeingang -j ACCEPT -p tcp --sport www
iptables -A netzausgang -j ACCEPT -p tcp --dport www
iptables -A netzeingang -j ACCEPT -p tcp --sport https
iptables -A netzausgang -j ACCEPT -p tcp --dport https
iptables -A netzeingang -j ACCEPT -p tcp --sport nntp
iptables -A netzausgang -j ACCEPT -p tcp --dport nntp
# Jetzt backe ich eine Extrawurst fuer den Rechner in der Wohnung
# Er darf selber EMail machen und Classic T-Online benutzen
iptables -A netzeingang -j tonline -d $EXTRAWURST
iptables -A netzausgang -j tonline -s $EXTRAWURST
iptables -A netzeingang -j email -d $EXTRAWURST
iptables -A netzausgang -j email -s $EXTRAWURST
iptables -A netzeingang -j email -d $LUGEXTRAWURST
iptables -A netzausgang -j email -s $LUGEXTRAWURST
# ssh-Ausgang z.B. fuer Sourceforge
iptables -A netzeingang -j ACCEPT -p tcp --sport ssh -d $TESTEXTRAWURST
iptables -A netzausgang -j ACCEPT -p tcp --dport ssh -s $TESTEXTRAWURST
iptables -A netzeingang -j ACCEPT -p tcp --sport ssh -d $LUGEXTRAWURST
iptables -A netzausgang -j ACCEPT -p tcp --dport ssh -s $LUGEXTRAWURST
# Der Rest kommt in den Muell
############################################################################
iptables -A INPUT -j papierkorb
iptables -A OUTPUT -j papierkorb
iptables -A FORWARD -j papierkorb
# Fuer ins Internet gehende Pakete Masquerading einschalten
iptables -t nat -A POSTROUTING -o $DEV_INET -j MASQUERADE
echo 1 >/proc/sys/net/ipv4/ip_forward
}
case $1 in
start)
echo -n "Starting IP filtering... "
start
echo "done"
;;
restart)
echo -n "Re-Starting IP filtering... "
stop
start
echo "done"
;;
stop)
echo -n "Stopping IP filtering... "
stop
echo "done"
;;
close)
echo -n "Closing IP interfaces... "
stop
echo "done"
;;
*)
echo "Usage: $0 start | restart | stop | close"
exit 1
esac
exit 0
in meinem Script sind ein paar denkanstöße zur nutzung von squit, das laden von iptables modulen und ein paar wenige dienste. File --> fw.sh Input Output und forward wird gefiltert! es geht eventuell so einiges nicht mehr durch den router!
Links#
- http://electron.mit.edu/~gsteele/firewall/
- Simple Linux Firewall
Add new attachment
Only authorized users are allowed to upload new attachments.
List of attachments
| Kind | Attachment Name | Size | Version | Date Modified | Author | Change note |
|---|---|---|---|---|---|---|
sh |
fw.sh | 3.7 kB | 1 | 12-Jun-2008 21:46 | JensKapitza |