PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : FW für Debian 3.0



tantalus
17.11.02, 09:17
Hallo!
Lacht mich jetzt bitte nicht aus, aber ich suche ein Programm mit dem ich sehr einfach eine Firewall konfigurieren kann(frei nach dem SuSE vorbild in der Bedinung).
Mein Rechner ist über Kabelmodem ans Internet angebunden und versorgt auch noch die Rechner meiner Tochter und Meiner Frau. Bisher bin ich überwigend SuSE nutzer gewesen und habe mich jetzt in Debian soweit eingearbeitet das ich möglichst bald auf das suse system verzichten möchte. Allerdings bekomme ich es zur zeit nicht hin mir eine Firewall zu konfigurieren. Da ich mit Englischsprchigen Documentationen nicht allzuviel anfangen kann habe ich mir das Firewallbuch von Markt und Technik zugelegt. Leider scheine ich das ganze nicht verstanden zu haben denn das script welches ich mir gebaut habe Blockt zwar alles ab und meine DHCP-Client läßt er auch durch aber das wars dann auch schon. sonst funktioniert garnichts (loopback funktioniert natürlich). Ich sitze jetzt schon ca. 3 wochen darüber und bin solangsam am aufgeben.

Meine Rechner Konfiguration:
Eth0 = DHCP-client
Eth1 = Private adresse (10.0.1.10) Zugang zu meinem Home-Netz.

Serverdienste:
Cups Squid Apache(um internet zu nutzen ich stelle keine Sites ins netz) und sonst so das übliche
mein Rechner ist also Server und Multimedia-Workstation alles in einem. Ich weis keine sonderlich guten Vorraussetzungen für eine firewall aber ich habe dafür nur den einen Rechner zur verfügung.

Da ich mittlerweile sogar den überblick uber meine scripte verloren habe poste ich hier einfach mal eines:

#!/bin/sh
################################################## #######################
##################Hier Beginnt die Firewall##############################
################################################## #######################
#Iptables-module
modprobe ip_conntrack_ftp

#Aktivierung von Kerneldiensten
#Source-Routing deaktivieren

for f in /proc/sys/net/ipv4/conf/*/accept_source_route; do
echo 0 > $f
done

#TCP-SYN-COOKIES einschalten

echo 1 > /proc/sys/net/ipv4/tcp_syncookies

#log_martians
#siehe RFC 1812
#protokolliert pakete mit unmöglichen Adressen

for f in /proc/sys/net/ipv4/conf/*/log_martians; do
echo 1 > $f
done

#Löschen alter Regeln
#anschließend funktionert nichts mehr, da keine Verbindung zu Nirgends erlaubt ist

iptables --flush
iptables -t nat --flush
iptables -t mangle --flush

#Das Loopback-device ist nur lokal und Intern vorhanden.

iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

#Einstellen der Policy`s

iptables --policy INPUT DROP
iptables --policy OUTPUT DROP
iptables --policy FORWARD DROP

iptables -t nat --policy PREROUTING DROP
iptables -t nat --policy OUTPUT DROP
iptables -t nat --policy POSTROUTING DROP

iptables -t mangle --policy PREROUTING DROP
iptables -t mangle --policy OUTPUT DROP

#Variablen definieren wenn sie das erste mal gebraucht werden
INTERNET='eth0' #ans Internet angeschlossenes Interface (gerät)
#LAN_NETZ='eth1' #ans eigene Netzangeschlossenes Interface (gerät)
#MASQUERADE
iptables -t nat -A POSTROUTING -o $INTERNET -j MASQUERADE

iptables -A FORWARD -o $INTERNET -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

#iptables -A FORWARD -o $LAN_NETZ -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

#Verhindern von Geheimer Spionage "Stealthscans"
#Es handelt sich dabei um Pakete mit illegal gesetztem Flag
#für den Verbindungszustand

#alle Bits gelöscht
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP

#SYN und FIN flags gleichzeitig gesetzt
iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP

#SYN und RST flags gleichzeitig gesetzt
iptables -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP

#FIN UND RST flags gleichzeitig gesetzt
iptables -A INPUT -p tcp --tcp-flags FIN,RST FIN,RST -j DROP

#FIN ohne ein zugehöriges ACK-flag gesetzt
iptables -A INPUT -p tcp --tcp-flags ACK,FIN FIN -j DROP

#PSH ist ohne zugehöriges ACK-flag gesetzt
iptables -A INPUT -p tcp --tcp-flags ACK,PSH PSH -j DROP

#URG ist ohne zugehöriges ACK-flag gesetzt
iptables -A INPUT -p tcp --tcp-flags ACK,URG URG -j DROP

#Variablen für benutzerketten anlegen
CONNECTION_TRACKING='1'
#USER_CHAINS='EXT-input EXT-output \
# tcp-state-flags connection-tracking \
# source-address-check destination-address-check \
# local-dns-server-query remote-dns-server-response \
# local-tcp-client-request remote-tcp-server-response \
# remote-tcp-client-request local-tcp-server-response \
# local-udp-client-request remote-udp-server-response \
# local-dhcp-client-query remote-dhcp-server-response \
# EXT-icmp-out EXT-icmp-in \
# EXT-log-in EXT-log-out \
# log-tcp-state'

#Benutzer definierte Ketten anlegen
#for i in $USER_CHAINS;
# do
# iptables -N $i
#done

#TCP: typische zustandsmuster für Stealth-Scans herausfiltern
#FW-Buch Seite 228

iptables -A INPUT -p tcp -j tcp-state-flags
iptables -A OUTPUT -p tcp -j tcp-state-flags

if [ "$CONNECTION_TRACKING" = "1" ];
then
iptables -A INPUT -j connection-tracking
iptables -A OUTPUT -j connection-tracking
fi

#Umgehung der Regeln durch kontrolle des Verbindungszustandes
#Beschreibung:
#Um resourcen zu sparen kann man statische oder Dynamische filterregeln einsetzen.
#Wenn man eine Erlaubte Verbindung hat dann muss diese nicht mehr alle regeln der Fir ewall
#durchlaufen, stattdessen wird nur noch kontrolliert ob die Verbindung erlaubt ist.

if [ "$CONNECTION_TRACKING" = "1" ];
then
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -A INPUT -m state --state INVALID -j LOG --log-prefix "INVALID input:"
iptables -A INPUT -m state --state INVALID -j DROP

iptables -A OUTPUT -m state --state INVALID -j LOG --log-prefix "INVALID output:"
iptables -A OUTPUT -m state --state INVALID -j DROP
fi

#Variablen definieren wenn sie das erste mal gebraucht werden
DHCP_CLIENT='1'

#DHCP erlauben
#In der Benutzerkette User_chains
if [ "$DHCP_CLIENT" = "1" ];
then
iptables -A INPUT -i $INTERNET -p udp \
--sport 67 --dport 68 -j remote-dhcp-server-response
iptables -A OUTPUT -o $INTERNET -p udp \
--sport 68 --dport 67 -j local-dhcp-client-query
fi

#Variablen definieren wenn sie das erste mal gebraucht werden
IPADDR='192.168.120.107' #eigene Ip-Addresse

#Gefälschte IP-adressen
#Ankommende Pakete ablehnen, die vorgeben sie seien die eigene IP welche auf dem Interface
#ankommen an dem das Internet angeschloßen ist.

iptables -A INPUT -i $INTERNET -s $IPADDR -j DROP

#IP-ADRESSEN aus dem bereich der Privaten Ip-adressen, welch im Internet ja nicht geroutet
#werden dürfen, ablehnen.

#Variablen definieren wenn sie das erste mal gebraucht werden
CLASS_A='10.0.0.0/8' #Klasse A: private Netze
CLASS_B='172.16.0.0/12' #Klasse B: private Netze
CLASS_C='192.168.0.0/16' #Klasse C: private Netze

iptables -A INPUT -i $INTERNET -s $CLASS_A -j DROP
iptables -A INPUT -i $INTERNET -s $CLASS_B -j DROP
iptables -A INPUT -i $INTERNET -s $CLASS_C -j DROP

#Variablen definieren wenn sie das erste mal gebraucht werden
LOOPBACK='127.0.0.0/8' #loopback-Addressbereich

#Pakete aus dem Internet verbieten welch die absendeadresse im Loopbackbereich haben

iptables -A INPUT -i $INTERNET -s $LOOPBACK -j DROP

#Variablen definieren wenn sie das erste mal gebraucht werden
BROADCAST_SRC='0.0.0.0' #Broatcast-Absender
BROADCAST_DEST='255.255.255.255' #Broadcast-Empfänger

#Fehlerhafte Broadcast-Pakete verwerfen und mit schreiben

iptables -A INPUT -i $INTERNET -s $BROADCAST_DEST -j LOG
iptables -A INPUT -i $INTERNET -s $BROADCAST_DEST -j DROP

iptables -A INPUT -i $INTERNET -s $BROADCAST_SRC -j LOG
iptables -A INPUT -i $INTERNET -s $BROADCAST_SRC -j DROP

#Variablen definieren wenn sie das erste mal gebraucht werden
SUBNET_BASE='192.168.120.0' #eigene Netzwerk-Adresse
SUBNET_BROADCAST='192.168.120.255' #eigene Broadcast-Adresse

#Zielgerichtete Broadcast suche sperren
#wird zum Herausfinden von Netzwerktopologien verwendet um DOS-Angriffe zu starten

iptables -A INPUT -i $INTERNET -d $SUBNET_BASE -j DROP
iptables -A INPUT -i $INTERNET -d $SUBNET_BROADCAST -j DROP

#Eingeschränkte Broadcast sperren
#Achtung bei verwendung von DHCP-Servern müssen entsprechende ausnahmeregeln
#definiert werden.

iptables -A INPUT -i $INTERNET -d $BROADCAST_DEST -j DROP

#Variablen definieren wenn sie das erste mal gebraucht werden
CLASS_D_MULTICAST='224.0.0.0/4' #Klasse D: Multicast-Adressen
CLASS_E_RESERVED_NET='240.0.0.0/5' #Klasse E: reservierte Adressen

#Multicast Adressen aus dem Internet sperren
#das sind Adressen aus den Klassen D und E

iptables -A INPUT -i $INTERNET -s $CLASS_D_MULTICAST -j DROP

#Multicast-pakete benutzen immer das Protokoll UDP
#Also werden alle Multicast-Pakete gesperrt die nicht UDP benutzen

iptables -A INPUT -i $INTERNET -p ! udp -d $CLASS_D_MULTICAST -j DROP

iptables -A INPUT -i $INTERNET -s $CLASS_E_RESERVED_NET -j DROP

#Variablen definieren wenn sie das erste mal gebraucht werden
UNPRIVPORTS="1024:65535" #unprivilegierte Ports
NAMESERVER='192.168.120.252' #IP-des Nameservers normalerweise
#dns-PROTOKOLL

if [ "$CONNECTION_TRACKING" = "1" ];
then
iptables -A OUTPUT -o $INTERNET -p udp \
-s $IPADDR --sport $UNPRIVPORTS \
-d $NAMESERVER --dport 53 \
-m state --state NEW -j ACCEPT
fi

iptables -A OUTPUT -o $INTERNET -p udp -s $IPADDR --sport $UNPRIVPORTS \
-d $NAMESERVER --dport 53 -j ACCEPT
iptables -A INPUT -i $INTERNET -p udp -s $NAMESERVER --sport 53 \
-d $IPADDR --dport $UNPRIVPORTS -j ACCEPT

if [ "$CONNECTION_TRACKING" = "1" ];
then
iptables -A OUTPUT -o $INTERNET -p tcp \
-s $IPADDR --sport $UNPRIVPORTS \
-d $NAMESERVER --dport 53 \
-m state --state NEW -j ACCEPT
fi

iptables -A OUTPUT -o $INTERNET -p tcp -s $IPADDR --sport $UNPRIVPORTS \
-d $NAMESERVER --dport 53 -j ACCEPT

iptables -A INPUT -i $INTERNET -p tcp ! --syn -s $NAMESERVER --sport 53 \
-d $IPADDR --dport $UNPRIVPORTS -j ACCEPT
#Forwarding DNS (DNS-Weiterleitung)
#FW-Buch seite 165

if [ "$CONNECTION_TRACKING" = "1" ];
then
iptables -A OUTPUT -o $INTERNET -p udp \
-s $IPADDR --sport 53 \
-d $NAMESERVER --dport 53 \
-m state --state NEW -j ACCEPT
fi

iptables -A OUTPUT -o $INTERNET -p udp -s $IPADDR --sport 53 \
-d $NAMESERVER --dport 53 -j ACCEPT
iptables -A INPUT -i $INTERNET -p udp -s $NAMESERVER --sport 53 \
-d $IPADDR --dport 53 -j ACCEPT

#DHCP-SERVER
#Zugriff vom eigenen DHCP-Client zum fremden Server
#FW-Buch Seite 201

#Initialisierung oder Re-Initialisierung
#Noch keine IP-Adr. vorhanden oder Sie muss erneuert werden!

iptables -A OUTPUT -o $INTERNET -p udp -s $BROADCAST_SRC --sport 68 \
-d $BROADCAST_DEST --dport 67 -j ACCEPT

#Ankommendes DHCPOFFER von den verfügbaren DHCP-Servern
#DHCP-Server melden ihre Anwesenheit

iptables -A INPUT -i $INTERNET -p udp -s $BROADCAST_SRC --sport 67 \
-d $BROADCAST_DEST --dport 68 -j ACCEPT

#zurück zur Initialisierung
#Variablen definieren wenn sie das erste mal gebraucht werden
DHCP_SERVER='192.168.120.2' #Die IP-Adr. des DHCP-Servers (immer anpassen!)

#Der Client kennt den Server, aber die Gültigkeit der adresse ist Ausgelaufen,
#oder sie muss nach einem reboot bestätigt werden.

iptables -A OUTPUT -o $INTERNET -p udp -s $BROADCAST_SRC --sport 68 \
-d $DHCP_SERVER --dport 67 -j ACCEPT


iptables -A INPUT -i $INTERNET -p udp -s $DHCP_SERVER --sport 67 \
-d $BROADCAST_DEST --dport 68 -j ACCEPT

iptables -A INPUT -i $INTERNET -p udp -s $DHCP_SERVER --sport 67 \
--dport 68 -j ACCEPT

#Gültigkeit verlängern lassen

iptables -A OUTPUT -o $INTERNET -p udp -s $IPADDR --sport 68 \
-d $DHCP_SERVER --dport 67 -j ACCEPT


iptables -A INPUT -i $INTERNET -p udp -s $DHCP_SERVER --sport 67 \
-d $IPADDR --dport 68 -j ACCEPT



#Variablen definieren wenn sie das erste mal gebraucht werden
XWINDOW_PORTS='6000:6063' #64 Ports auf denen X-Server laufen können
#X-Window
#Beschreibung:
#die Erste Regel verhindert abgehende Verbindungen zu fremden X-Servern
#die Zweite Regel verhindert alle zugriffe aus dem Internet auf den eigenen X-Server
#ERSTE REGEL
iptables -A OUTPUT -o $INTERNET -p tcp --syn --destination-port $XWINDOW_PORTS -j REJECT
#ZWEITE REGEL
iptables -A INPUT -i $INTERNET -p tcp --syn --destination-port $XWINDOW_PORTS -j DROP

#Variablen definieren wenn sie das erste mal gebraucht werden
NFS_PORT='2049' #NFS
SOCKS_PORT='1080' #SOCKS
OPENWINDOWS_PORT='2000' #OPENWINDOWS
SQUID_PORT='3128' #SQUID
LOCKD_PORT='4045' #RPC-lockd für NFS
#Verbindungsaufbau über TCP und UDP zu NFS, OPENWINDOWS,SOCKS oder SQUID
#zurückweisen bzw. verbieten

iptables -A OUTPUT -o $INTERNET -p tcp -m multiport --destination-port \
$NFS_PORT,$OPENWINDOWS_PORT,$SOCKS_PORT,$SQUID_POR T \
--syn -j REJECT

iptables -A INPUT -i $INTERNET -p tcp -m multiport --destination-port \
$NFS_PORT,$OPENWINDOWS_PORT,$SOCKS_PORT,$SQUID_POR T \
--syn -j DROP

#NFS und lockd über UDP

if [ "$CONNECTION_TRACKING" = "1" ];
then
iptables -A OUTPUT -o $INTERNET -p udp \
-m multiport --destination-port $NFS_PORT,$LOCKD_PORT \
-m state --state NEW -j REJECT


iptables -A INPUT -i $INTERNET -p udp \
-m multiport --destination-port $NFS_PORT,$LOCKD_PORT \
-m state --state NEW -j DROP

else
iptables -A OUTPUT -o $INTERNET -p udp \
-m multiport --destination-port $NFS_PORT,$LOCKD_PORT \
-j REJECT


iptables -A INPUT -i $INTERNET -p udp \
-m multiport --destination-port $NFS_PORT,$LOCKD_PORT \
-j DROP
fi

#Das identd-Protokoll
#Identifiziert Benutzer auf dem eigenen Rechner gegenüber fremden Systemen
#Abgehende Anfragen

if [ "$CONNECTION_TRACKING" = "1" ];
then
iptables -A OUTPUT -o $INTERNET -p tcp \
-s $IPADDR --sport $UNPRIVPORTS \
--dport 113 -m state --state NEW -j ACCEPT
fi

iptables -A OUTPUT -o $INTERNET -p tcp \
-s $IPADDR --sport $UNPRIVPORTS \
--dport 113 -j ACCEPT

iptables -A INPUT -i $INTERNET -p tcp ! --syn \
--sport 113 -d $IPADDR --dport $UNPRIVPORTS -j ACCEPT

#Ankommende Anfragen an einen Server des eigenen Rechners
#Seite 167 FW-Buch
if [ "$CONNECTION_TRACKING" = "1" ];
then
iptables -A INPUT -i $INTERNET -p tcp \
--sport $UNPRIVPORTS \
-d $IPADDR --dport 113 \
-m state --state NEW -j ACCEPT
fi

iptables -A INPUT -i $INTERNET -p tcp --sport $UNPRIVPORTS -d $IPADDR --dport 113 -j ACCEPT

iptables -A OUTPUT -o $INTERNET -p tcp ! --syn -s $IPADDR --sport 113 --dport $UNPRIVPORTS -j ACCEPT

#Das WWW wichtig zum Surfen!
#FW-Buch Seite 189

#Zugriff auf fremde Websites als Client
#Das sollte der Normale fall sein den Jeder der das Internet benötigt brauch

if [ "$CONNECTION_TRACKING" = "1" ];
then
iptables -A OUTPUT -o $INTERNET -p tcp \
-s $IPADDR --sport $UNPRIVPORTS \
--dport 80 -m state --state NEW -j ACCEPT
fi

iptables -A OUTPUT -o $INTERNET -p tcp -s $IPADDR --sport $UNPRIVPORTS --dport 80 -j ACCEPT

iptables -A INPUT -i $INTERNET -p tcp ! --syn --sport 80 -d $IPADDR --dport $UNPRIVPORTS \
-j ACCEPT

#Zugriff lokaler FTP-Clients auf Fremde FTP-Server
#FTP FW-Buch Seite 186
#Abgehende Kontrollverbindungen zu Fremden FTP-Servern

if [ "$CONNECTION_TRACKING" = "1" ];
then
iptables -A OUTPUT -o $INTERNET -p tcp \
-s $IPADDR --sport $UNPRIVPORTS \
--dport 21 -m state --state NEW -j ACCEPT
fi

iptables -A OUTPUT -o $INTERNET -p tcp -s $IPADDR --sport $UNPRIVPORTS --dport 21 -j ACCEPT

iptables -A INPUT -i $INTERNET -p tcp ! --syn --sport 21 -d $IPADDR --dport $UNPRIVPORTS \
-j ACCEPT

#Aktivieren der Datenkanäle für den Aktiven Ftp-Modus

if [ "$CONNECTION_TRACKING" = "1" ];
then
iptables -A INPUT -i $INTERNET -p tcp \
--sport 20 \
-d $IPADDR --dport $UNPRIVPORTS \
-m state --state NEW -j ACCEPT
fi

iptables -A INPUT -i $INTERNET -p tcp --sport 20 -d $IPADDR --dport $UNPRIVPORTS -j ACCEPT

iptables -A OUTPUT -o $INTERNET -p tcp ! --syn -s $IPADDR --sport $UNPRIVPORTS \
--dport 20 -j ACCEPT


#Aktivieren der Datenkanäle für den Passiven Ftp-Modus

if [ "$CONNECTION_TRACKING" = "1" ];
then
iptables -A OUTPUT -o $INTERNET -p tcp \
-s $IPADDR --sport $UNPRIVPORTS \
--dport $UNPRIVPORTS -m state --state NEW -j ACCEPT

fi

iptables -A OUTPUT -o $INTERNET -p tcp -s $IPADDR --sport $UNPRIVPORTS \
--dport $UNPRIVPORTS -j ACCEPT

iptables -A INPUT -i $INTERNET -p tcp ! --syn --sport $UNPRIVPORTS \
-d $IPADDR --dport $UNPRIVPORTS -j ACCEPT


#Variablen definieren wenn sie das erste mal gebraucht werden
SSH_PORTS='1020:65535' #RHost-RSA-Authentifizierung
#Zugriff auf fremde SSH-Server
#wird zum Online-Banking genutzt
#RSA-Authentifizierung über die Variable RSA_SSH_PORTS='1024:65535'
#RHost-Authentifizierung über die Variable RH_SSH_PORTS='1020:65535'

if [ "$CONNECTION_TRACKING" = "1" ];
then
iptables -A OUTPUT -o $INTERNET -p tcp \
-s $IPADDR --sport $SSH_PORTS \
--dport 22 -m state --state NEW -j ACCEPT
fi

iptables -A OUTPUT -o $INTERNET -p tcp -s $IPADDR --sport $SSH_PORTS \
--dport 22 -j ACCEPT

iptables -A INPUT -i $INTERNET -p tcp ! --syn --sport 22 \
-d $IPADDR --dport $SSH_PORTS -j ACCEPT


#Zugriff auf den eigenen SSH-Server durch fremde Clients aus dem Internet

if [ "$CONNECTION_TRACKING" = "1" ];
then
iptables -A INPUT -i $INTERNET -p tcp --sport $SSH_PORTS \
-d $IPADDR --dport 22 -m state --state NEW -j ACCEPT
fi

iptables -A INPUT -i $INTERNET -p tcp --sport $SSH_PORTS \
-d $IPADDR --dport 22 -j ACCEPT

iptables -A OUTPUT -o $INTERNET -p tcp ! --syn -s $IPADDR --sport 22 \
--dport $SSH_PORTS -j ACCEPT

#SSL oder TLS Nutzen
#Zugriff auf fremde Websites über SSL oder TLS
#FW-Buch Seite 191

if [ "$CONNECTION_TRACKING" = "1" ];
then
iptables -A OUTPUT -o $INTERNET -p tcp \
-s $IPADDR --sport $UNPRIVPORTS \
--dport 443 -m state --state NEW -j ACCEPT
fi


iptables -A OUTPUT -o $INTERNET -p tcp -s $IPADDR --sport $UNPRIVPORTS --dport 443 \
-j ACCEPT

iptables -A INPUT -i $INTERNET -p tcp ! --syn --sport 443 -d $IPADDR \
--dport $UNPRIVPORTS -j ACCEPT

#whois -Server
#FW-Buch Seite 195

if [ "$CONNECTION_TRACKING" = "1" ];
then
iptables -A OUTPUT -o $INTERNET -p tcp \
-s $IPADDR --sport $UNPRIVPORTS \
--dport 43 -m state --state NEW -j ACCEPT
fi

iptables -A OUTPUT -o $INTERNET -p tcp -s $IPADDR --sport 43 -j ACCEPT

iptables -A INPUT -i $INTERNET -p tcp ! --syn --sport 43 \
-d $IPADDR --dport $UNPRIVPORTS -j ACCEPT

#Pings erlauben
#Abgehende Pings

if [ "$CONNECTION_TRACKING" = "1" ];
then
iptables -A OUTPUT -o $INTERNET -p icmp \
-s $IPADDR --icmp-type echo-request \
-m state --state NEW -j ACCEPT
fi

iptables -A OUTPUT -o $INTERNET -p icmp \
-s $IPADDR --icmp-type echo-request -j ACCEPT

iptables -A INPUT -i $INTERNET -p icmp \
--icmp-type echo-reply -d $IPADDR -j ACCEPT

#Variablen definieren wenn sie das erste mal gebraucht werden
MY_ISP='192.168.120.107' #Ip-Addresse die man vom ISP erhält
#Ankommende Pings

if [ "$CONNECTION_TRACKING" = "1" ];
then
iptables -A INPUT -i $INTERNET -p icmp \
-s $MY_ISP --icmp-type echo-request -d $IPADDR \
-m state --state NEW -j ACCEPT
fi

iptables -A INPUT -i $INTERNET -p icmp \
-s $MY_ISP --icmp-type echo-request -d $IPADDR -j ACCEPT


iptables -A OUTPUT -o $INTERNET -p icmp \
-s $IPADDR --icmp-type echo-reply -d $MY_ISP -j ACCEPT

#Abgehende Mails über ein exteres SMTP-Gateway verschicken
#Das ist der normalfall für Private Internetanbindung!
#SMTP-Gateway meint den Mail-Server des Providers
#Dazu muss die Variable SMTP-GATEWAY mit dem Mailserver des Providers als wert belegt werden
#bsp.: SMTP_GATEWAY="mx.freenet.de" für den Mailserver von Freenet
#Seite 171 FW-Buch

#Variablen definieren wenn sie das erste mal gebraucht werden
SMTP_GATEWAY='192.168.120.252' #siehe abschnitt Abgehede Mails
POP_SERVER='192.168.120.252' #siehe abschnitt mails abholen über POP
if [ "$CONNECTION_TRACKING" = "1" ];
then
iptables -A OUTPUT -o $INTERNET -p tcp \
-s $IPADDR --sport $UNPRIVPORTS \
-d $SMTP_GATEWAY --dport 25 -m state --state NEW -j ACCEPT
fi

iptables -A OUTPUT -o $INTERNET -p tcp \
-s $IPADDR --sport $UNPRIVPORTS \
-d $SMTP_GATEWAY --dport 25 -j ACCEPT

iptables -A INPUT -i $INTERNET -p tcp ! --syn \
-s $SMTP_GATEWAY --sport 25 \
-d $IPADDR --dport $UNPRIVPORTS -j ACCEPT

#Mail empfangen/abholen über POP
#Die Variable POP_SERVER wieder mit der IP-Adresse des Providers belegen

if [ "$CONNECTION_TRACKING" = "1" ];
then
iptables -A OUTPUT -o $INTERNET -p tcp \
-s $IPADDR --sport $UNPRIVPORTS \
-d $POP_SERVER --dport 110 -m state --state NEW -j ACCEPT
fi

iptables -A OUTPUT -o $INTERNET -p tcp -s $IPADDR --sport $UNPRIVPORTS -d $POP_SERVER \
--dport 110 -j ACCEPT

iptables -A INPUT -i $INTERNET -p tcp ! --syn -s $POP_SERVER --sport 110 \
-d $IPADDR --dport $UNPRIVPORTS -j ACCEPT

#ICMP-Nachrichten
#FW-Buch Seite 204 Fragmentierte ICMP-Nachrichten

iptables -A INPUT -i $INTERNET --fragment -p icmp -j LOG --log-prefix "Fragmented ICMP: "

iptables -A INPUT -i $INTERNET --fragment -p icmp -j DROP

#Kontrollnachricht source-quench (typ 4)

iptables -A INPUT -i $INTERNET -p icmp \
--icmp-type source-quench -d $IPADDR -j ACCEPT

iptables -A OUTPUT -o $INTERNET -p icmp \
-s $IPADDR --icmp-type source-quench -j ACCEPT

#Statusmeldung parameter-problem (typ 12)

iptables -A INPUT -i $INTERNET -p icmp \
--icmp-type parameter-problem -d $IPADDR -j ACCEPT

iptables -A OUTPUT -o $INTERNET -p icmp \
-s $IPADDR --icmp-type parameter-problem -j ACCEPT

#Fehlermeldung destination-unreachable (typ 3)

iptables -A INPUT -i $INTERNET -p icmp \
--icmp-type destination-unreachable -d $IPADDR -j ACCEPT

iptables -A OUTPUT -o $INTERNET -p icmp \
-s $IPADDR --icmp-type fragmentation-needed -j ACCEPT

#Abgehende ICMP-Fehlermeldung löschen, ohne das sie im Syslog erscheint!

iptables -A OUTPUT -o $INTERNET -p icmp \
-s $IPADDR --icmp-type destination-unreachable -j DROP

iptables -A INPUT -i $INTERNET -p icmp \
--icmp-type time-exceeded -d $IPADDR -j ACCEPT
#alle Pakete für die keine Regel zutrifft werden Protokolliert
#FW-Buch Seite 208

iptables -A INPUT -i $INTERNET -j LOG

#abgewiesene abgehende Pakete prototkollieren

iptables -A OUTPUT -o $INTERNET -j LOG

################################################## ########################
##################Hier Endet die Firewall#################################
################################################## ########################

Vielleicht habe ich ja in den Regeln einen Fehler gemacht wäre ganz nett wenn mir dazu mal jemand etwas posten könnte.

HangLoose
17.11.02, 10:33
hi

ich kann dir bei deinem script nicht wirklich weiterhelfen. aber du kannst dir hier (http://www.harry.homelinux.org/modules.php?name=iptables_Generator) ja mal ein script erzeugen lassen und dann mit deinem vergleichen.


Gruß HangLoose

tantalus
17.11.02, 11:54
Vielen Dank!
Das ist genau das was ich gesucht habe! Ich habe mir auch so gleich dort ein Script zusammen geklickt. Und es funktioniert Wunderbar. Aber das eigentlich gute daran ist das ich nun anfangen kann den fehler in meinem script zu suchen. Ich bin schon echt am verzweifeln gewesen.
Vielen vielen Dank dafür.

HangLoose
17.11.02, 12:00
hi

dann gib harry mal ein kleines feedback :)


Gruß HangLoose

Spike05
17.11.02, 12:05
apt-get install firestarter

cu

Jochen

Jinto
17.11.02, 12:56
@tantalus
Du solltest bei den Ketten NAT und Mangle die Default Policy _nicht_ ändern.

tantalus
18.11.02, 11:46
@Spike05
Danke für den Tip mit dem Firestarter, habe ihn mir gerade mal angeschaut. Macht einen guten eindruck werde mich damit auch noch intensiver befassen, aber alles nach einander.

@Jinto
Könntest du mir das mal näher erklären!
Den ich wollte ja die Policie "Alles ist verboten was nicht erlaubt ist" umsetzen und habe deshalb die Policie auf DROP gesetzt. Da ich aber in dieser Richtung Blutiger Anfänger bin, und ich mir alles irgendwie selber versuhe bei zubringen, bin ich für jede hilfe und erklärung Dankbar.

Harry
18.11.02, 12:20
Ein IP-Datagramm durchläuft auf Deinem Rechner per Default alle drei Tables unter iptables (filter, nat, mangle).
Je nach Ursprung und/oder Ziel wird es innerhalb dieser drei Tables auf spezielle Chains gelenkt (INPUT, OUTPUT, FORWARD, POSTROUTING, PREROUTING) und die dort befindlichen Regeln nach dem Prinzip "first match" ausgewertet (trifft nicht für das LOG-Target zu).

Die Bezeichnungen der Tables kommen nicht von ungefähr. Jede Table hat eine ganz spezielle Aufgabe (ok - man kann sie auch für andere Aufgaben missbrauchen):
- filter -> zulassen, droppen oder zurückweisen von Datagrammen
- nat -> Umschreibung von Adressinformationen in IP-, TCP-, UDP- und ICMP-Headern
- mangle -> markieren von Datagrammen, Umschreibung weiterer Optionen in IP- und TCP-Headern

Daraus ergibt sich, dass Du eine Paketfilterung lediglich in den Chains der filter-Table vornehmen solltest, Du filterst jedoch auch in den Chains der nat-Table und der mangle-Table über die Default-Policy. Konkret filterst Du beispielsweise alle Datagramme, die geroutet werden direkt in der PREROUTING-Chain und alle Datagramme, die von Deiner Firewall ausgehen in der OUTPUT-Chain (nat-Table), da gerade in diesen beiden Chains keinerlei Regeln überhaupt Datagramme zulassen.

Dass dann eigentlich nichts mehr funktioniert ist genau das Ergebnis, welches Du bekommst.

Mal von diesem Umstand abgesehen: Wo steht geschrieben, dass ein guter Paketfilter so unheimlich komplex aufgebaut sein muß? Im Gegenteil ist es in der Praxis meist genau andersrum: Je einfacher und damit übersichtlicher und wartbarer ein Paketfilter aufgebaut ist, desto höher ist oftmals seine Sicherheit, denn man sollte beim Schreiben der letzten Zeile immer noch wissen was am Anfang des Skriptes stand :D

Harry

tantalus
18.11.02, 12:31
@Harry
Vielen Dank für die schnelle antwort! Ich werde mal versuchen das umzusetzen, schließlich möchte ich ja mein Script auch mal laufen sehen. Dank deines IP-Tables-Generator kann ich mir dafür jetzt ja auch Zeit lassen und muss nicht immer wenn ich länger am rechner arbeite auf mein SuSE umschalten. Ich finde Debian mitlerweile nämlich echt klasse.
Ich hab da mal noch eine frage: Habt ihr sowas wie einen Simulator?
Ich meine so ein Programm mit dem ich alle möglichen sachen von IPtables ausprobieren kann und mir dann auch mal anschauen kann wie sich das ganze auswirkt, ohne wirklich etwas an der Firewall zumachen. das wäre sehr hilfreich zum lernen.

Harry
18.11.02, 12:46
Hallo Rene,

einen Simulator haben wir bisher nicht aber die Idee zur Bereitstellung eines solchen ist gut.
Uns fehlen einzig und allein die Kapazitäten, um einen solchen Simulator bereitzustellen.

Alternativ kann man sich beliebig über online verfügbare Portscanner bedienen (bspw. http://scan.sygatetech.com/).

Harry

tantalus
18.11.02, 13:03
@Harry

Das ist schade, aber schön das dir diese idee gefällt.

Und danke für den tip mit den Online Portscannern, ich wußte garnicht das es so etwas gibt. Naja ich habe auch noch nicht danach gesucht. Zumal Englisch nicht mein Stecken Pferd ist, und ich immer ziehmlich lange brauche bis ich mir das ganze übersetzt habe. Das scheint sich aber dies mal wieder zu lohnen, naja und schaden kann es ja auch nicht vielleicht wird mein englisch ja irgendwann ein mal besser.

Jinto
18.11.02, 15:08
Iptables wird irgendwann mal das injecten von Testpaketen erlauben. Damit sollte es auch relativ einfach sein, die gewünschten Operationen durchzuführen.

Aber um Harry's Ausführungen bezgl nat und mangle zu vervollständigen:
Man sollte berücksichtigen das alle IP-Pakete die nat/PREROUTING Tabelle durchlaufen müssen, d. h. es muss für jedes Paket nicht nur eine Regel in der filter Tabelle vorgenommen werden, sondern zusätzlich auch in der PREROUTING und POSTROUTING Tabelle.

Du bekommst damit automatisch mehrere Probleme (von der flaschen Nutzungsart mal abgesehen)
1. Dein Script wird komplexer
2. Du musst mehrere identische Operationen mit unterschiedlichen Parametern durchführen
3. Du musst dir Gedanken über dein logischen/physichen Netzaufbau machen, und machst damit den Schritt zurück zu ipchains
4. Je mehr Regeln du verwendest, desto mehr leidet die Performance darunter
5. ich habe betimmt irgend etwas vergessen.

IMO ist Herr Ziegler mit dem Filtern (setzen einer DROP-Default-Policy) in der nat/mangle Table über sein Ziel hinausgeschossen.

Gruß