Linux als Firewall
Einordnung und Abgrenzung
- Firewall-Systeme, Router
- ausschliesslich Paketfilter-Techniken
# sysctl net.ipv4.ip_forward net.ipv4.ip_forward = 1 #
- Schutz eines privaten Netzes mit Maschinen unterschiedlicher Plattformen
- eine von viele Schutzmaßnahmen
- Wirksamkeit umstritten
- filtern von ein- und ausgehenden Datenverkehr aller Rechner des privaten Netzes
- Ziel: ungewollten/unbeabsichtigten Datenverkehr unterbinden
- Voraussetzung: genaue und detaillierte Kenntnisse über Anwendungsprotokolle
- hier: Basismechanismen und -werkzeuge
- ausserdem: Selbstschutz des Firewall-Systems
- nicht:
- Application Level Gateway (Proxy)
- grafische Frontends für Regel-Definitionen
Was ist netfilter/iptables?
- Paket-Filter im Linux-Kernel (ab Version 2.4)
- inspiziert IP-Pakete
- entscheidet auf Grund von Regeln, wie mit einem IP-Paket zu verfahren ist
- konfiguriert durch das Kommando
iptables
- realisiert als Kernel-Moduln
# ls /lib/modules/$(uname -r)/kernel/net/ipv4/netfilter arptable_filter.ko ipt_addrtype.ko ipt_NETMAP.ko arp_tables.ko ipt_ah.ko ipt_NOTRACK.ko arpt_mangle.ko ipt_CLASSIFY.ko ipt_owner.ko ip_conntrack_amanda.ko ipt_comment.ko ipt_physdev.ko ip_conntrack_ftp.ko ipt_conntrack.ko ipt_pkttype.ko ip_conntrack_irc.ko ipt_dscp.ko ipt_realm.ko ip_conntrack.ko ipt_DSCP.ko ipt_recent.ko ip_conntrack_proto_sctp.ko ipt_ecn.ko ipt_REDIRECT.ko ip_conntrack_tftp.ko ipt_ECN.ko ipt_REJECT.ko ip_nat_amanda.ko ipt_esp.ko ipt_SAME.ko ip_nat_ftp.ko ipt_helper.ko ipt_sctp.ko ip_nat_irc.ko ipt_iprange.ko ipt_state.ko ip_nat_snmp_basic.ko ipt_length.ko ipt_tcpmss.ko ip_nat_tftp.ko ipt_limit.ko ipt_TCPMSS.ko ip_queue.ko ipt_LOG.ko ipt_tos.ko iptable_filter.ko ipt_mac.ko ipt_TOS.ko iptable_mangle.ko ipt_mark.ko ipt_ttl.ko iptable_nat.ko ipt_MARK.ko ipt_ULOG.ko iptable_raw.ko ipt_MASQUERADE.ko ip_tables.ko ipt_multiport.ko #
- es werden nur die Moduln geladen, für die Regeln definiert sind (bzw. zugehörige Helper-Moduln)
# lsmod|grep ip ipv6 240097 100 ipt_REJECT 10561 3 ipt_LOG 10049 1 ipt_multiport 5953 3 ipt_state 5825 4 ip_conntrack 45573 1 ipt_state iptable_filter 6721 1 ip_tables 21441 5 ipt_REJECT,ipt_LOG,ipt_multiport,ipt_state,iptable_filter #
Funktionsprinzipien von iptables
- ein IP-Paket durchläuft mehrere chains / tables
- chains enthalten Regeln
- eine Regel definiert
- ein Muster: Bedingungen, denen ein Paket entsprechen soll, z.B. bestimmte Ziel-Adresse, bestimmte Flags im TCP-Header, o.dgl.
- ein Ziel: target
- ein target ist eine weitere chain oder ein default-target (z.B.
DROP
,ACCEPT
, ...) - ein Paket wird an das target weitergeleitet, wenn es dem in der Regel definierten Muster entspricht (match)
- d.h.: sobald ein match erreicht ist, werden nachfolgende Regeln in dieser Tabelle nicht mehr angewendet
- wird in einer chain kein match erreicht, dann
- wird mit übergeordneter chain fortgesetzt, falls es eine gibt
- sonst bestimmt die policy das Verhalten
- policy definiert eines der default-targets
Paketverarbeitung: das ganze Bild
Tabellen (tables)
- regeln unterschiedliche Arten der Paketverarbeitung
- grundlegende Gruppierung der Pakete
- jede Tabelle enthält vordefinierte und ggf. nutzerdefinierte chains
- conntrack
- Connection Tracking
- erkennen von zusammengehörigen Paketen (z.B. TCP-Session, UDP-Stream, Analyse von Anwendungsprotokollen)
- realisiert sog. statefull packet filter
- nicht veränderbar: es können keine Regeln angegeben werden
- mangle
- bestimmte Änderungen an Paketen, z.B. TTL (time-to-live), TOS (Type of Service)
- Pakete markieren
- chains: alle
- nat
- Network Address Translation
- Änderung von IP-Adressen/Port-Nummern
- SNAT (Soure-NAT):
- Ändern der Quell-Adresse
- chains:
POSTROUTING
- auch: Masquerading (Umgang mit dynamischen IP-Adressen, setzen der Quell-IP-Adresse auf IP-Adresse des outgoing Interfaces)
- DNAT (Destination-NAT):
- Ändern der Ziel-Adresse
- chains:
PREROUTING
undOUTPUT
- Redirection: Ändern des Ziel-Ports
- filter
- Paket-Filter
- chains:
INPUT
,OUTPUT
undFORWARD
- oftmals benutzerdefinierte chains
- ggf. weitere Tabellen, je nach Distribution, Kernel- und iptables-Version
- wenn für eine Table keine Regeln definiert sind, entfällt die komplette Table (der Kernel-Modul wird nicht geladen)
- Maschinen, die kein Routing vornehmen, benutzen i.d.R. nur die filter-Table
Regelketten (chains)
IP-Pakete passieren die einzelnen chains unter den folgenden Bedingungen (die einzelnen Tables enthalten ggf. nicht alle chains)
- PREROUTING
- unmittelbar nach dem Eintreffen an der Maschine
- vor der routing-Entscheidung
- INPUT
- Ziel: lokaler Prozess
- FORWARD
- Ziel: nicht lokal, Paket hat externen Empfänger
- OUTPUT
- Quelle: lokaler Prozess
- POSTROUTING
- vor dem Verlassen der Maschine
Das Kommando iptables
- Einrichten, Manipulieren und Anzeigen der iptables-Regeln im Kernel
Aufrufkonventionen, Syntax, etc.
- siehe Punkt 7 in Wolfgang Kinkeldei: iptables - Die Firewall des Kernels 2.4
Connection Tracking
Kernel-Modul
- Kernel-Modul
ip_conntrak
führt eine Connection Tracking Database (/proc/net/ip_conntrak
) - einzelne Einträge beschreiben zu einem konkreten Zeitpunkt den Zustand von IP-Verbindungen
# cat /proc/net/ip_conntrack ... tcp 6 429160 ESTABLISHED src=134.109.201.14 dst=134.109.132.20 \ #1 sport=1023 dport=22 packets=385 bytes=24044 \ #2 src=134.109.132.20 dst=134.109.201.14 sport=22 dport=1023 \ #3 packets=231 bytes=33073 [ASSURED] use=1 #4 ... tcp 6 115 SYN_SENT src=134.109.201.14 dst=134.109.148.50 \ #5 sport=1022 dport=22 [UNREPLIED] \ #6 src=134.109.148.50 dst=134.109.201.14 sport=22 dport=1022 \ #7 [ASSURED] use=2 #8
- erster Eintrag (#1...#4)
- TCP-Verbindung (IP-Protokollnummer 6) zwischen 134.109.201.14:1023 und 134.109.132.20:22
- Zustand (tcp state):
ESTABLISHED
(three-way handshake ist beendet) - Timeout: 429160 Sekunden
- Startwert ist zustandsabhängig
- Reset bei Zustandsänderung oder wenn die Verbindung benutzt wird
- Zeilen #1 und #2: "request"-Richtung
- Zeilen #3 und #4: "return"-Richtung
-
[ASSURED]
: Eintrag wird nicht gelöscht, wenn max. Anzahl von Einträgen erreicht ist
- zweiter Eintrag (#5...#8)
- TCP-Verbindung (IP-Protokollnummer 6) zwischen 134.109.201.14:1022 und 134.109.148.50:22
- Zustand (tcp state):
SYN_SENT
- es wurde bisher nur ein TCP-Segement mit gesetzem SYN-Flag gesendet
- erster Schritt im three-way handshake
- Zustand (tcp state):
-
[UNREPLIED]
: bisher keine Antwort
- TCP-Verbindung (IP-Protokollnummer 6) zwischen 134.109.201.14:1022 und 134.109.148.50:22
- zahlreiche Zustände (protokollabhängig)
iptables
- Modul
ipt_state
- vereinfachtes Zustandsmodell (
iptables -m state --state
)-
NEW
- erstes Paket einer Verbindung
- typisch:
SYN
-Paket einer TCP-Verbindung - erstes UDP-Paket mit bestimmten Addressangaben (Source-IP, Source-Port, Dest-IP. Dest-Port)
-
ACK
-Packet einer TCP-Verbindung, die nicht beendet wurde (close), aber den timeout-Wert überschritten hat
-
ESTABLISHED
- Paket-Verkehr in beiden Richtungen hat stattgefunden
-
RELATED
- zugehörig zu einer
ESTABLISHED
Verbindung - typisch: ftp-data / ftp-control
- erfordert oftmals anwendungsprotokollspezifische helper modules
- ICMP error messages
- zugehörig zu einer
-
INVALID
- Paket kann nicht identifiziert werden
- ICMP error messages, die zu keiner bekannten Verbindung gehören
- out of TCP window packets
- falsche Kombination von TCP-Flags
-
UNTRACKED
- Paket wurde nicht von conntrack behandelt
-
- connection tracking in der chain
-
PREROUTING
- alle ankommenden Pakete: Neueintrag (request) oder Zustandsänderung (reply)
- vor Routing-Entscheidung
- alle lokal addressierten Pakete
- alle zu routende Pakete (richtungsunabhängig)
-
OUTPUT
- alle lokal gesendeten Pakete: Neueintrag (request) oder Zustandsänderung (reply)
-
- conntrack- und iptables-Zustände
Beispiel: Aufbau einer TCP-Verbindung von Host A zu Host BSchritt Richtung TCP-Flags Sicht von Host A Sicht von Host B iptables chain tcp state iptables state iptables chain tcp state iptables state 1 A -> B SYN OUTPUT SYN_SENT NEW PREROUTING SYN_RECV NEW 2 B -> A SYN+ACK PREROUTING SYN_RECV ESTABLISHED OUTPUT ESTABLISHED ESTABLISHED 3 A -> B ACK OUTPUT ESTABLISHED ESTABLISHED PREROUTING ESTABLISHED ESTABLISHED
- Steuerung über Parameter in
/proc/sys/net/ipv4/netfilter/*
Beispiel: Paketfilter für ein Server-Subnetz
Setup und Aufgabenstellung
- Server-Subnetz
134.109.102.0/24
(routbare IP-Adressen) enthält einige Server- Web-Server
- Linux-Server 134.109.102.1
- Datenbank (proprietäres Produkt)
- Linux-Server 134.109.102.2
- Windows Terminal-Server
- Client der Datenbank
- Spezial-Anwendungen
- 134.109.102.3
- Web-Server
- Ziele:
- Server schützen
- proprietäre Produkte/Protokolle
- Windows-Terminal-Server
- interaktive Nutzung einschränken
- evtl. eingeschleppte Malware nicht weiter verbreiten
- Besonderheit: einzelne Anwendungen greifen per
HTTP/HTTPS
auf externe (bekannte) Server zu
- Server schützen
- Zugänge
- aus dem Internet
- mit
HTTP/HTTPS
zu134.109.102.1
- mit
RDP
(Remote Desktop Protocol) zu134.109.102.3
- mit proprietärem Protokoll (1972/tcp) zu Datenbank-Server
134.109.102.2
(Updates) durch bekannte Partner
- mit
- aus dem Intranet
- mit
HTTP/HTTPS
zu134.109.102.1
- mit
RDP
(Remote Desktop Protocol) zu134.109.102.3
- mit
SSH
auf alle Linux-Systeme
- mit
- aus dem Internet
- Forderungen
- geschützte Server sollen Dienste im Intranet nutzen können
- DNS
- NTP
- DHCP
- AFS
- ...
- geschützte Server sollen einzelne Server im Internet erreichen können
- HTTP/HTTPS
- Firewall-System soll sich selbst schützen
- geschützte Server sollen Dienste im Intranet nutzen können
Lösungsansatz
- IP-Adresse
134.109.100.100
muss als Gateway-Adresse für das Subnetz 134.109.102.0/24 im zentralen Router eingetragen sein - "klassischer" statefull packet filter
- Policy: Verkehrsbeziehungen unterbinden, die nicht explizit erlaubt sind
- erlaubte Pakete sollen möglichst wenige Regeln passieren müssen
- Table:
filter
- Chains
-
FORWARD
- Schutz des Server-Subnetzes
-
INPUT
,OUTPUT
- Selbstschutz
-
- benutzerdefinierte Chains
-
COMMON
- referenziert aus
FORWARD
,INPUT
,OUTPUT
- "statefull Regeln"
- "Hygiene": was nicht sein kann, darf nicht sein
- referenziert aus
-
COMMONCLIENT
- referenziert aus
OUTPUT
undFORWARD
- Dienste, die vom Firewall-System selbst als auch von den Maschinen im Server-Subnetz genutzt werden
- referenziert aus
-
SERVERNET
- referenziert aus
FORWARD
- Dienste, die Maschinen im Server-Subnetz anbieten
- referenziert aus
-
LOGREJECT
- referenziert aus
FORWARD
,INPUT
,OUTPUT
undCOMMON
- Logging und zurückweisen von Paketen
- referenziert aus
-
- zusätzliche Kernel-Konfiguration
- AFS
- Timeout-Wert für UDP-Streams erhöhen
-
sysctl -w net.ipv4.netfilter.ip_conntrack_udp_timeout_stream=720
- besser als Eintrag in
/etc/sysctl.conf
- siehe auch Linux-PCs sichern mit iptables : AFS-Client
- AFS
# cat /etc/sysconfig/iptables *filter :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT DROP [0:0] ### # LOGREJECT ### -N LOGREJECT -A LOGREJECT -j LOG --log-level info --log-prefix "iptables REJECT:" -A LOGREJECT -p tcp -j REJECT --reject-with tcp-reset -A LOGREJECT -j REJECT --reject-with icmp-host-prohibited ### # COMMON ### -N COMMON -A COMMON -m state --state INVALID -j DROP -A COMMON -m state --state ESTABLISHED,RELATED -j ACCEPT -A COMMON -p tcp ! --syn -m state --state NEW -j LOGREJECT -A COMMON -i eth0 -s 134.109.102.0/24 -j LOGREJECT -A COMMON -o eth0 -d 134.109.102.0/24 -j LOGREJECT # Monitoring -A COMMON -s 134.109.aaa.bbb -d 134.109.102.0/24 -p icmp -m icmp --icmp-type ping -j ACCEPT ### # COMMONCLIENT ### -N COMMONCLIENT # AFS # udp_stream_timeout! -A COMMONCLIENT -o eth0 -p udp -m multiport --dports 7000,7002,7003,7004 -j ACCEPT # Kerberos -A COMMONCLIENT -o eth0 -p udp -m multiport --dports 88,750,4444 -j ACCEPT # DNS, NTP -A COMMONCLIENT -o eth0 -p udp -m multiport --dports 53,123 -j ACCEPT ### # SERVERNET ### -N SERVERNET # HTTP/HTTPS -A SERVERNET -d 134.109.102.1 -p tcp -m multiport --dports 80,443 -j ACCEPT # RDP -A SERVERNET -d 134.109.102.3 -p tcp -m tcp --dport 3389 -j ACCEPT # DB-Zugriff -A SERVERNET -d 134.109.102.2 -s xxx.yyy.zzz.0/24 -p tcp -m tcp --dport 1972 -j ACCEPT # SSH -A SERVERNET -d 134.109.102.1 -s 134.109.0.0/16 -p tcp -m tcp --dport 22 -j ACCEPT -A SERVERNET -d 134.109.102.2 -s 134.109.0.0/16 -p tcp -m tcp --dport 22 -j ACCEPT # HTTP/HTTPS zu externen Servern -A SERVERNET -d nnn.mmm.ooo.ppp -s 134.109.102.3 -p tcp -m multiport --dports 80,443 -j ACCEPT # Path MTU discovery -A SERVERNET -p icmp -m icmp --icmp-type destination-unreachable -j ACCEPT ### # FORWARD ### -A FORWARD -j COMMON -A FORWARD -j COMMONCLIENT -A FORWARD -j SERVERNET -A FORWARD -j LOGREJECT ### # INPUT ### -A INPUT -j COMMON -A INPUT -i lo -j ACCEPT # DHCP -A INPUT -i eth1 -p udp -m udp --dport 67 --sport 68 -j ACCEPT -A INPUT -j LOGREJECT ### # OUTPUT ### -A OUTPUT -j COMMON -A OUTPUT -o lo -j ACCEPT -A OUTPUT -j COMMONCLIENT -A OUTPUT -j LOGREJECT
Network Address Translation
- ersetzen der IP-Adresse in einem Paket
- Maschinen mit privaten, nicht routbaren IP-Adressen sollen im Internet kommunizieren können
- private Adressbereiche
Adressbereich CIDR-Schreibweise Anzahl der Adressen 10.0.0.0-10.255.255.255 10.0.0.0/8 16.777.214 172.16.0.0-172.31.255.255 172.16.0.0/12 1.048.574 192.168.0.0-192.168.255.255 192.168.0.0/16 65.534 169.254.0.0-169.254.255.255 (link local) 169.254.0.0/16 65.534 - NAT-Gateway
- setzt private Adressen in öffentliche Adresse(n) um
- ggf. werden auch Port-Nummern umgeschrieben
- NAT ist primär keine Sicherheitstechnik
- Struktur des privaten Netzes wird verborgen
- ausserhalb tritt nur NAT-Gateway in Erscheinung
- maskierte Rechner haben vollständigen Internet-Zugang
- Sicherheitseigenschaften durch zusätzliche filter-Einstellungen
- Source Network Address Translation (SNAT)
- auch: Masquerading
- ändern der Quell-Adresse eines IP-Pakets
- Client im privaten Netz
- Quell-Adresse (nicht routbar) wird ersetzt durch Adresse des Gateways (routbar)
- Illustration: http://www.kohnlehome.de/netz/Masquerading.swf
- iptables chain:
POSTROUTING
- Änderung am Paket unmittelbar bevor das Paket die Maschine verlässt
- Destination Network Address Translation (DNAT)
- auch Port Forwarding
- ändern der Ziel-Adresse eines IP-Pakets
- Server im privaten Subnetz
- Adresse des Gateways wird ersetzt durch (nicht routbare) Ziel-Adresse des Servers
- Clients adressieren das Gateway (DNS-Einträge!)
- Illustration: http://www.kohnlehome.de/netz/PortForwarding.swf
- iptables chain:
PREROUTING
(OUTPUT
)- Änderung am Paket unmittelbar nach Empfang des Pakets und vor Routing-Entscheidung
- Änderung an lokal erzeugten Paketen
- es wird nur das jeweils erste Paket einer Verbindung analysiert (match) und entsprechend der Regel behandelt
- das Austauschen der Adressinformationen erfolgt dann für alle weiteren Pakete der Verbindung analog
- deshalb in Table nat möglichst keine Filter-Regeln formulieren
Beispiel: NAT für ein privates Netz
Setup und Aufgabenstellung
- IP-Adresse 134.109.100.100 wird im DNS abgebildet auf
natgw.hrz.tu-chemnitz.de
- private Maschinen als Client sollen erreichen
- ohne Einschränkungen alle Maschinen in 134.109.0.0/16
- ausserhalb von 134.109.0.0/16 nur
- HTTP/HTTPS
- SSH
- FTP
- private Maschinen als Server sollen erreichbar sein
- per
SSH
: alle ausgehend von 134.109.100.0/24 - per
HTTP
: ein Web-Server ausgehend von 134.109.0.0/16 auf 192.168.1.1
- per
- NAT-Gateway soll sich selbst schützen
Lösungsansatz
- NAT-Gateway mit Packetfilter-Funktionen
- Tables/Chains
-
nat/POSTROUTING
- private Maschinen als Client
- SNAT
- Masquerading
-
nat/PREROUTING
- private Maschinen als Server
- DNAT
-
filter/FORWARD
- Schutz des privaten Netzes
-
filter/INPUT
,filter/OUTPUT
- Selbstschutz
-
- zusätzliche Kernel-Moduln und Kernel-Konfiguration
- FTP
- active Mode erfordert helper-Modul
ip_nat_ftp
- Laden des Modules
-
modprobe ipt_nat_ftp
- Eintrag in
/etc/sysconfig/iptables-config
-
- siehe auch Linux-PCs sichern mit iptables : FTP-Client
- active Mode erfordert helper-Modul
- AFS
- Timeout-Wertes für UDP-Streams erhöhen
-
sysctl -w net.ipv4.netfilter.ip_conntrack_udp_timeout_stream=720
- besser als Eintrag in
/etc/sysctl.conf
- siehe auch Linux-PCs sichern mit iptables : AFS-Client
- FTP
# cat /etc/sysconfig/iptables *nat :PREROUTING ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] :OUTPUT ACCEPT [0:0] ### # SNAT: nat/POSTROUTING ### -A POSTROUTING -o eth0 -j SNAT --to-source 134.109.100.100 ### # DNAT: nat/PREROUTING ### # in das private Netz nicht direkt routen -A PREROUTING -i eth0 -d 192.168.0.0/16 -j DROP # HTTP -A PREROUTING -d 134.109.100.100 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.1 # SSH -A PREROUTING -d 134.109.100.100 -p tcp --dport 122 -j DNAT --to-destination 192.168.1.1:22 -A PREROUTING -d 134.109.100.100 -p tcp --dport 222 -j DNAT --to-destination 192.168.1.2:22 -A PREROUTING -d 134.109.100.100 -p tcp --dport 322 -j DNAT --to-destination 192.168.1.3:22 COMMIT *filter :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT DROP [0:0] ### # filter/LOGREJECT ### -N LOGREJECT -A LOGREJECT -j LOG --log-level info --log-prefix "iptables REJECT:" -A LOGREJECT -p tcp -j REJECT --reject-with tcp-reset -A LOGREJECT -j REJECT --reject-with icmp-host-prohibited ### # filter/COMMON ### -N COMMON -A COMMON -m state --state INVALID -j DROP -A COMMON -m state --state ESTABLISHED,RELATED -j ACCEPT -A COMMON -p tcp ! --syn -m state --state NEW -j LOGREJECT ### # filter/PRIVATENET ### -N PRIVATENET # Client mit Zielen im Intranet -A PRIVATENET -d 134.109.0.0/16 -j ACCEPT # Client mit Zielen FTP/SSH/HTTP/HTTPS im Internet -A PRIVATENET -d ! 192.168.1.0/24 -p tcp -m multiport --dports 21,22,80,443 -j ACCEPT # Server # SSH für Clients aus 134.109.100.0/24 -A PRIVATENET -d 192.168.1.0/24 -s 134.109.100.0/24 -p tcp -m tcp --dport 22 -j ACCEPT # HTTP für alle -A PRIVATENET -d 192.168.1.1 -p tcp -m tcp --dport 80 -j ACCEPT # Path MTU discovery -A PRIVATENET -p icmp -m icmp --icmp-type destination-unreachable -j ACCEPT ### # filter/FORWARD ### -A FORWARD -j COMMON -A FORWARD -j PRIVATENET -A FORWARD -j LOGREJECT ### # filter/INPUT ### -A INPUT -j COMMON -A INPUT -i lo -j ACCEPT # DHCP -A INPUT -i eth1 -p udp -m udp --dport 67 --sport 68 -j ACCEPT -A INPUT -j LOGREJECT ### # filter/OUTPUT ### -A OUTPUT -j COMMON -A OUTPUT -o lo -j ACCEPT # AFS -A OUTPUT -o eth0 -p udp -m multiport --dports 7000,7002,7003,7004 -j ACCEPT # Kerberos -A OUTPUT -o eth0 -p udp -m multiport --dports 88,750,4444 -j ACCEPT # DNS, NTP -A OUTPUT -o eth0 -p udp -m multiport --dports 53,123 -j ACCEPT -A OUTPUT -o eth1 -d 192.168.1.0/24 -p tcp -m tcp --dport 22 -j ACCEPT -A OUTPUT -o eth1 -d 192.168.1.1 -p tcp -m tcp --dport 80 -j ACCEPT -A OUTPUT -j LOGREJECT COMMIT
- Regeln in
nat/PREROUTING
undnat/POSTROUTING
erfüllen o.g. Forderungen- Maschinen im privaten Netz erreichen definierte Ziele ausserhalb
- ftp im active mode erfordert ggf. entsprechende iptables-Konfiguration auf den Maschinen im privaten Netz (siehe auch Linux-PCs sichern mit iptables: FTP-Client)
- Maschinen im privaten Netz sind erreichbar von ausserhalb
private Adresse öffentliche Adresse Beispiel 192.168.1.1:22 134.109.100.100:122 ssh -p 122 natgw.hrz.tu-chemnitz.de
192.168.1.2:22 134.109.100.100:222 ssh -p 222 natgw.hrz.tu-chemnitz.de
192.168.1.3:33 134.109.100.100:322 ssh -p 322 natgw.hrz.tu-chemnitz.de
192.168.1.1:80 134.109.100.100:80 http://natgw.hrz.tu-chemnitz.de/
- Maschinen im privaten Netz erreichen definierte Ziele ausserhalb
1. Problem
- private Maschinen können Dienste auf privaten Maschinen nicht erreichen
- Beispiel: Webbrowser auf 192.168.1.2 versucht URL
http://natgw.hrz.tu-chemnitz.de/
zu erreichen- Paket an 134.109.100.100:80 verlässt 192.168.1.2
- Paket erreicht
natgw
- in
nat/PREROUTING
wird es überDNAT
mit neuer Zieladresse 192.168.1.1:80 versehen - Paket verlässt
natgw
und erreicht HTTP-Server - HTTP sendet Antwort an 192.168.1.2 (direkt, weil im selben Subnetz)
- Paket mit Quelladresse 192.168.1.1:80 erreicht 192.168.1.2 und wird dort verworfen
(kein reply auf ursprünglichen request an 134.109.100.100:80)
- erforderlich:
SNAT
für alle Pakete, dienatgw
erreichen und für die esDNAT
Einträge gibt
-A POSTROUTING -d 192.168.1.0/16 -j SNAT --to-source 192.168.1.254
- vor Schritt 4 wird Source-Adresse in private Adresse von
natgw
geändert - Server in 192.168.1.0/24 sehen immer 192.168.1.254 als Absender (Logging wird nutzlos)
- wünschenswert: Angabe
-i eth1
- Änderung würde nur geschehen, wenn der Absender der Pakete aus dem privaten Netz stammt
- chain
POSTROUTING
erlaubt Angabe-i ...
jedoch nicht
- weiteres Problem:
filter/PRIVATENET
verwirft Pakete mit Ziel-IP 192.168.1.0/24 und Ziel-Port 22, wenn diese eine Source-IP ausserhalb 134.109.100.0/24 besitzen - weitere Regel in
filter/PRIVATENET
erforderlich (als 4. Regel eintragen):
-A PRIVATENET -d 192.168.1.0/24 -s 192.168.1.0/24 -p tcp -m tcp --dports 22 -j ACCEPT
- Konsequenz: solche Konstruktionen möglichst vermeiden
- z.B. Hostname
natgw.hrz.tu-chemnitz.de
in/etc/hosts
auf Maschinen in privatem Netz direkt auf 192.168.1.1 abbilden
- z.B. Hostname
2. Problem
- Clients auf
natgw
können Dienste auf privaten Maschinen nicht erreichen - Beispiel: Webbrowser auf
natgw
versucht URLhttp://natgw.hrz.tu-chemnitz.de/
zu erreichen- Paket an 134.109.100.100:80 erreicht chain
OUTPUT
-
nat/OUTPUT
enthält keine Regeln - Paket wird über
filter/OUTPUT
infilter/LOGREJECT
gelenkt und dort abgewiesen
- Paket an 134.109.100.100:80 erreicht chain
- erforderlich: Target
DNAT
in chainnat/OUTPUT
für alle Ziele im privaten Netz
# DNAT in nat/OUTPUT -A OUTPUT -d 134.109.100.100 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.1.1 -A OUTPUT -d 134.109.100.100 -p tcp -m tcp --dport 122 -j DNAT --to-destination 192.168.1.1:22 -A OUTPUT -d 134.109.100.100 -p tcp -m tcp --dport 222 -j DNAT --to-destination 192.168.1.2:22 -A OUTPUT -d 134.109.100.100 -p tcp -m tcp --dport 222 -j DNAT --to-destination 192.168.1.3:22
Targets SNAT und MASQUERADE
- in
nat/POSTROUTING
- Target
SNAT
- erfordert Angabe der Source-Adresse(n) (
--to-source ...
) - Problem: IP-Adresse der Internet-Verbindung wird dynamisch durch Provider vergeben
- erfordert Angabe der Source-Adresse(n) (
- Target
MASQUERADE
- benutzt IP-Adresse des outgoing Interfaces
- erleichtert iptables-Konfiguration bei dynamischer Vergabe der IP-Adresse der Internet-Anbindung
- Source-Port-Nummer bleibt erhalten (bei TCP/UDP), es sei denn
- sie ist bereits in Benutzung (durch NAT-Gateway selbst oder Verbindung einer anderen Maschine aus dem privaten Netz)
- port < 512: anderer Port < 512
- 512 <= 512 port < 1024: anderer Port < 1024
- Port-Range wird vorgegeben
-
-j SNAT --to-source ipaddr1[-ipaddr2][:port1-port2]]
-
-j MASQUERADE --to-ports port1[-port2]]
- jeweils nur in Verbindung mit
-p tcp|udp
-
- sie ist bereits in Benutzung (durch NAT-Gateway selbst oder Verbindung einer anderen Maschine aus dem privaten Netz)
Targets DNAT und MASQUERADE
- Target
DNAT
tauscht Ziel-IP in Paketen aus (innat/PREROUTING
odernat/OUTPUT
) - erforderlich ist die Qualifikation der Pakete (IP-Adresse, Port-Nummer)
- nur solche Pakete, die als Ziel das Gateway-Interface der Paketfilter-Maschine haben
- Target
MASQUERADE
anstelle vonSNAT
wird benutzt, wenn IP-Adresse des Gateway-Interfaces dynamisch vergeben wird - also nicht bekannt ist - Konsequenz:
DNAT
undMASQUERADE
lassen sich nicht sinnvoll gemeinsam einsetzen - weiterhin: Server mit dynamisch wechselnder IP-Adresse benötigen ohnehin weitere Vorkehrungen (DDNS)
Zusammenfasung
- netfilter/iptables ist mächtiges Werkzeug zum Aufbau von Paketfiltern
- Erfahrung, Training und Detailkenntnisse erforderlich
- hier nur einige Aspekte behandelt
Literatur und Verweise
Bücher
Spenneberg, Ralf
Linux Firewalls mit iptables & Co
ISBN 3-82732-136-0
Addison-Wesley Verlag, 2006
Barth, Wolfgang
Das Firewall-Buch
Grundlagen, Aufbau und Betrieb sicherer Netzwerke mit Linux
ISBN 3-89990-128-2
Nicolaus Millin Verlag GmbH, 2004
Cheswick, W.R.; Bellovin, S.M.; Rubin, A.D.
Firewalls und Sicherheit im Internet
Schutz vor cleveren Hackern
ISBN 3-8273-2117-4
Addison-Wesley Verlag, 2004
Links
http://de.wikipedia.org/wiki/Netfilter/iptables - gute deutsche Zusammenfassung bei Wikipedia
http://www.pro-linux.de/t_netzwerk/print/iptables.html - deutsches Tutorial
http://iptables-tutorial.frozentux.net/ - umfangreiches Tutorial
http://www.kalamazoolinux.org/presentations/20010417/conntrack.html - Connection Tracking
http://www.netfilter.org/ - Homepage von netfilter/iptables
http://de.wikipedia.org/wiki/Path_MTU_Discovery - Path MTU Discovery bei Wikipedia