1) Was ist eine Firewall ------------------------- Eine Firewall ist ein Stück Software, was den Datenverkehr über das Netzwerk auf einem Computer überwacht 1.1) Arten einer Firewall -------------------------- 1.1.1) Proxy (Application Level Gateway) - kontrolliert den Namen/IP des Verbindungspartners - Filterkriterien: - nach URL/Rechnernamen - Vorteil: - leicht zu installieren - zu administrieren (BlackLists) - Nachteil: - Protokoll-abhängig - kann durch Mirrors umgangen werden - für den User sichtbar - Beispiele: - apache (HTTP, FTP) - wwwoffle (HTTP, FTP) - squid (HTTP, FTP) 1.1.2) Content-Filter-Firewall - kontrolliert den Inhalt verschiedener Datenpackete - Filterkriterien: - reguläre Ausdrücke / Bytefolgen - Vorteile: - sicher bei aktueller Vergleichsdatenbank - Nachteile: - abhängig von Protokollen - langsam, da alle Daten durchsucht werden müssen - nutzlos bei veralteter Vergleichsdatenbank - Beispiele: - verschiedene Virenscanner 1.1.3) Packet-Filter-Firewall - kontrolliert den Weg/Art/Status der einzelnen Datenpackete über das Netzwerk - Filterkriterien: - Daten aus den IP/TCP/UDP-Headern - Vorteile: - sehr schnell - meist unabhängig von Protokollen (Ausnahme FTP & Quake ;)) - Nachteile: - keine Überprüfung des Inhalts der Datenpackete - Beispiele: - die Linux-Firewall - Firewalls von BSD & Co. 2) Geschichte der Linux-Firewall --------------------------------- 2.1) ipfwadm - KernelVersion: 2.0.X - hervorgegangen aus der Packet-Firewall von BSD 2.2) ipchains - KernelVersion: 2.2.X - neues Konzept mit Chains (Filterketten) - entwickelt von Rusty Russel 2.3) iptables - KernelVersion: 2.4.X - erweitertes/verbessertes ipchains - strickte Trennung von Packet-Filtering und NAT (Network Address Translation) 3) Der Aufbau der Packete -------------------------- - bestehen aus 20-Byte langen IP-Header, gefolgt von TCP-, UDP- oder ICMP-Header und den eigentlichen Daten 3.1) Der IP-Header ------------------- (this diagram is stolen shamelessly from RFC 790) 0 15 16 31 .-------+-------+---------------+-------------------------------. |Version| IHL |Type of Service| Total Length | |-------+-------+---------------+-------------------------------| | Identification |Flags| Fragment Offset | |---------------+---------------+-------------------------------| | Time to Live | Protocol | Header Checksum | |---------------+---------------+-------------------------------| | Source Address | |---------------------------------------------------------------| | Destination Address | `---------------------------------------------------------------' - wichtige Daten: - Protocol: 6=TCP, 17=UDP, 1=ICMP - Source Address: IP-Adresse des Senders (z.B. 192.168.0.10) - Destination Address: IP-Adresse des Empfängers - TOS: nur 1 von 4 Bits darf 1 sein minimale Dauer maximaler Durchsatz maximale Zuverlässigkeit minimale Kosten 3.2) Der TCP-Header -------------------- 0 15 16 31 .-------------------------------+-------------------------------. | Source Port | Destination Port | |-------------------------------+-------------------------------| | Sequence Number | |---------------------------------------------------------------| | Acknowledgment Number | |-------------------+-+-+-+-+-+-+-------------------------------| | Data | |U|A|P|R|S|F| | | Offset| Reserved |R|C|S|S|Y|I| Window | | | |G|K|H|T|N|N| | |-------+-----------+-+-+-+-+-+-+-------------------------------| | Checksum | Urgent Pointer | `---------------------------------------------------------------' - wichtige Daten: - Source Port: identifiziert das sendende Programm - Destination Port: identifiziert das empfangende Programm - Sequence & Acknoledment Number: sorgen für die richtige Reihenfolge - ACK,SYN,RST,FIN flags: Kennzeichen für Verbindungsauf und -abbau 3.3) Der UDP-Header -------------------- 0 15 16 31 .-------------------------------+-------------------------------. | Source Port | Destination Port | |-------------------------------+-------------------------------| | Length | Checksum | `---------------------------------------------------------------' - wichtige Daten: - Source Port: identifiziert das sendende Programm - Destination Port: identifiziert das empfangende Programm 3.4) Der ICMP-Header --------------------- 0 15 16 31 .-------------------------------+-------------------------------. | Type | Code | Checksum | `---------------------------------------------------------------' - wichtige Daten: - Type & Code: bestimmen den Grund der ICMP-Nachricht - z.B. 0:0=echo reply, 8:0=echo request 4) Das Grundkonzept von iptables --------------------------------- 4.1) Was ist ein Table? ------------------------ Tables Chains .----------------. .---------. | FILTER - Table |----------| INPUT | |----------------| | OUTPUT | | NAT - Table |-----. | FORWARD | |----------------| | `---------' | MANGLE - Table |--. |____.-------------. `----------------' | | PREROUTING | | | OUPUT | | | POSTROUTING | | `-------------' |_______.------------. | PREROUTING | | OUTPUT | `------------' 4.2) Was ist eine Chain? ------------------------- - der Verlauf der Datenpackete durch den Computer werden abstrahiert - alle Packete werden durch Chains geschickt, in denen Filterregeln definiert sind .---------------. | | Filterregel 1 | M-----> target |---------------| | | Filterregel 2 | M-----> target |---------------| | | Filterregel 3 | M-----> target |---------------| | | ... | M-----> target `---------------' | DP `-----> target Beispiel: FILTER-Table _____ Incoming / \ Outgoing ->[Routing ]--->|FORWARD|-------> [Decision] \_____/ ^ | | v ____ ___ / \ / \ |OUTPUT| |INPUT| \____/ \___/ ^ | | ----> Local Process ---- 5) iptables - Kommandozeilenargumente -------------------------------------- iptables -t [MATCH] -j [TARGET] Aktionen: -N neue Chain erzeugen -X leere Chain entfernen -P DefaultPolicy der Chain ändern -L alle Filterregeln der Chain auflisten -F alle Filterregeln aus der Chain entfernen -Z Packet- und Byte-Zähler der Chain zurücksetzen -A Filterregel an Chain anhängen -I Filterregel in Chain einfügen -R Filterregel in Chain ersetzen -D Filterregel von Chain entfernen 5.1) MATCH: ------------ -p Protokoll (tcp/udp/icmp) -s Source Address --sport Source Port (nur mit -p) -d Destination Address --dport Destination Port (nur mit -p) -i Input-Interface (nur in INPUT und FORWARD) -o Output-Interface (nur in OUTPUT und FORWARD) -f betrifft alle Fragmente eines Packetes -c initialisiert Counter (nur bei -A -I -R) 5.2) MATCH Extensions: ----------------------- * können dynamisch geladen werden * implizit mit -p * explizit mit -m implizite ---------- tcp: --sport port --sport port:port --dport port --dport port:port --tcp-flags mask comp Flags: SYN ACK FIN RST URG PSH ALL NONE Bsp: --tcp-flags SYN,ACK,FIN,RST SYN --syn (--tcp-flags SYN,ACK,RST SYN) =================================================== iptables -A INPUT -p tcp --dport 25 --syn -j DROP =================================================== udp: --sport port --sport port --dport port --dport port:port icmp: --icmp-type typename Werte für 'typename': iptables -p icmp -h explizite: ----------- mac: --mac-source address nur in PREROUTING, FORWARD und INPUT bei Ethernet =================================================================== iptables -A INPUT -m mac --mac-source 00:C0:26:AB:4C:E4 -j ACCEPT =================================================================== limit: --limit rate Werte für 'rate': X/second X/minute X/hour X/day ===================================================================== iptables -A INPUT -p tcp --dport 110 -m limit --limit 1/s -j ACCEPT ===================================================================== mulitport: --source-port port1,port2,... --destination-port port1,port2,... --port port1,port2,... mark: --mark value Werte für 'value': unsigned int ==================================================================== iptables -A OUTPUT -p tcp --dport 3112 -m mark --mark 42 -j ACCEPT ==================================================================== owner: --uid-owner uid --gid-owner gid --pid-owner pid --sid-owner sid nur gültig in OUTPUT state: --state state Werte für 'state': INVALID ESTABLISHED NEW RELATED ==================================================================== iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT ==================================================================== unclean: keine Argumente tos: --tos tos Werte für 'tos': iptables -m tos -h 5.3) TARGET ------------ DROP Packet wird ohne Rückmeldung verworfen ACCEPT Packet wird akzeptiert => Ende der Chain QUEUE Packete werden für UserSpace-Programm gesammelt RETURN alle Filterregeln der aktuellen Chain werden übersprungen 5.4) TARGET Extensions: ------------------------ LOG --log-level level Werte für 'level': siehe syslog.conf --log-prefix prefix Werte für 'prefix': bis 29 Zeichen langer String --log-tcp-sequence --log-tcp-options --log-ip-options MARK nur in 'mangle'-Table anwendbar --set-mark mark =================================================================== iptables -t mangle -A OUTPUT -p tcp ! --syn -j MARK --set-mark 42 =================================================================== REJECT nur in INPUT-, OUTPUT- und FORWARD-Chain anwendbar --reject-with-type type Werte für 'type': icmp-net-unreachable icmp-host-unreachable icmp-port-unreachable icmp-proto-unreachable icmp-net-prohibitedor icmp-host-prohibited TOS nur in 'mangle'-Table anwendbar --set-tos tos Werte für 'tos': iptables -j TOS -h SNAT nur in 'nat'-Table in POSTROUTING-Chain anwendbar --to-source ip-address:ip-address port:port DNAT nur in 'nat'-Table in PREROUTING- und OUTPUT-Chain anwendbar --to-destination ip-address:ip-address port:port MASQUERADE nur in 'nat'-Table in POSTROUTING-Chain anwendbar --to-ports port:port REDIRECT nur in 'nat'-Table in PREROUTING- und OUTPUT-Chain anwendbar --to-ports port:port 6) Beispiele für Filterregeln ------------------------------ # Regeln hinzufügen iptables -A INPUT -s 192.168.0.0/24 -j ACCEPT iptables -A OUTPUT -p tcp --dport 80 -j DROP iptables -A FORWARD -p ! tcp --dport ! 80 -j DROP iptables -A FORWARD -i eth0 -o eth2 -j DROP iptables -A FORWARD -i eth2 -o eth0 -j DROP iptables -A FORWARD -i eth1 -o eth2 -j ACCEPT iptables -A FORWARD -i eth2 -o eth1 -j ACCEPT # Regeln entfernen iptables -D INPUT -s 192.168.0.0/24 -j ACCEPT # oder iptables -D INPUT 1 # neue Chain anlegen iptables -N mychain iptables -A FORWARD -s 192.168.0.42 -j DROP (Rule1) iptables -A FORWARD -s 192.168.0.0/24 -j mychain (Rule2) iptables -A FORWARD -p udp -d 192.168.0.0/24 -j ACCEPT (Rule3) iptables -A mychain -p tcp ! --syn -j ACCEPT (Rule1) iptables -A mychain -p udp -j LOG (Rule2) iptables -P FORWARD DROP v __________________________ `FORWARD' | / `mychain' v .-----------------------|--/ .----------------------|---. | Rule1 | /| | Rule1 | | |-----------------------|/-| |----------------------|---| | Rule2 ` | | Rule2 | | |--------------------------| `----------------------v---' | Rule3 ,------------------------------' `-----------------------|--' v # Syn-Flood-Schutz iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT # Verstohlene Portscanner iptables -A FORWARD -p tcp --tcp-flags ALL NONE -m limit --limit 1/h -j ACCEPT # Ping of death iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s ACCEPT Mein Netzwerk: .-------------. .-------------. | 192.168.0.2 |---| 192.168.0.1 | `-------------' `-------------' | [Modem] | /\/\/\/\/\ < Internet > \/\/\/\/\/ # Masquerading echo "1" > /proc/sys/net/ipv4/ip_forward echo "1" > /proc/sys/net/ipv4/ip_dynaddr iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE # IP-Spoofing iptables -A INPUT -s 192.168.0.0/24 -i ppp0 -j LOG iptables -A INPUT -s 192.168.0.0/24 -i ppp0 -j DROP # ident-Packete iptables -A INPUT -p tcp -i ppp0 --dport 113 -j REJECT # TCP-Verbindungen vom Internet iptables -A INPUT -p tcp -i ppp0 --syn -j LOG iptables -A INPUT -p tcp -i ppp0 --syn -j DROP # Bind und Portmapper iptables -A INPUT -p udp -i ppp0 -m multiport --dport 53,111 -j DROP 7) NAT (Network Address Translation) ------------------------------------- NAT ist das Umschreiben der Source- oder Destination-Adresse im IP-Header _____ _____ / \ / \ PREROUTING -->[Routing ]----------------->POSTROUTING-----> \D-NAT/ [Decision] \S-NAT/ | ^ | __|__ | / \ | | OUTPUT| | \D-NAT/ | ^ | | `-------> Local Process -----' Beispiel: HTTP-Server Mail-Server Top Secret .-------------. .-------------. .-------------. | 192.168.0.3 | | 192.168.0.2 | | 192.168.0.4 | `-------------' `-------------' `-------------' |______________|________________| | | eth1 (192.168.0.1) .--------------------------------. | Firewall ohne weitere Prozesse | `--------------------------------' | eth0 (212.113.24.10) /\/\/\/\/\ < Internet > \/\/\/\/\/ 192.168.0.3:80 = Apache 192.168.0.2:25 = Exim 212.113.24.10:8080 = Zugriff auf Apache 212.113.24.10:8025 = Zugriff auf Exim Ziel: Zugriff auf Apache und Exim über offizielle IP (212.113.24.10) iptables -t nat -A PREROUTING -p tcp --dport 8080 -i eth0 -j DNAT --to-destination 192.168.0.3:80 iptables -t nat -A PREROUTING -p tcp --dport 8025 -i eth0 -j DNAT --to-destination 192.168.0.2:25 ******************************************************************************** That's all folks :)