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 :)