kompakte Doku für iptabels
kompakte Doku für iptabels
Hallo zusammnen,
kennt jemand eine kompakte Doku, in der iptabels gut beschrieben ist. Ich möchte mich nicht auf irgendwelche vorgefertigten Scripts verlassen.
k-pl
kennt jemand eine kompakte Doku, in der iptabels gut beschrieben ist. Ich möchte mich nicht auf irgendwelche vorgefertigten Scripts verlassen.
k-pl
Das Problem liegt ja darin, dass Du um mit iptables selbständig Firewall-Skripte schreiben zu können, auch Grundlagen in Netzwerksicherheitskonzeptionen und der Funktionsweise der verwendeten Protokolle benötigst. Eine wie ich finde sehr gute Einführung dazu ist das Buch "Building Linux and OpenBSD Firewalls". In diesem Buch wird zwar nur Redhat und ipchains behandelt, aber das gelernte Wissen lässt sich dann leicht mit "man iptables" und anderen Beispielskripten auf iptables übertragen. Ansonsten wüsste ich jetzt auch nur noch die Howtos auf linuxdoc.org.
Hier ist mal mein Skript von daheim. Ich habe einen Bind- und einen Squid-Server auf meinem Router laufen:
#!/bin/sh
# ***************************
# ***************************
# * *
# * 1. SETZEN VON VARIABLEN *
# * *
# ***************************
# ***************************
# 1.1. Netzwerkvariablen
# Schnittstelle zum lokalen Netzwerk
IFACE_INT=eth0
# Internetschnittstelle
IFACE_EXT=ppp0
# Loopback device
IFACE_LO=lo
# Interner Netzwerkbereich
NET_INT=10.1.1.0/24
# 1.2. PIDs
# Auslesen des PIDs von Bind
BIND=`cat /var/run/named.pid`
function StopFirewall() {
# **********************************
# **********************************
# * *
# * 2. HERUNTERFAHREN DER FIREWALL *
# * *
# **********************************
# **********************************
# Ausschalten des Routing
echo "0" > /proc/sys/net/ipv4/ip_forward
# Default-Policies: Alles rein und raus, kein Forwarding mehr
iptables -P INPUT ACCEPT
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# Löschen aller Regeln
iptables -F
iptables -t nat -F
# Löschen aller zusätzlichen Ketten
iptables -X
iptables -t nat -X
}
function StartFirewall() {
# ***************************
# ***************************
# * *
# * 3. Starten der Firewall *
# * *
# ***************************
# ***************************
# 3.1 Allgemeines
# Default-Policies setzen - alles fliegt raus
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
# Einschalten von ip-Forwarding
echo "1" > /proc/sys/net/ipv4/ip_forward
# Wegen moeglicher Netzwerkprobleme zwecks MTU
iptables -I FORWARD -p TCP --tcp-flags SYN,RST SYN \
-j TCPMSS --clamp-mss-to-pmtu
# 3.1.1. Eigene Kette zum gleichzeitigen Protokollieren und Rausschmeissen
# Eigene Kette erstellen
iptables -N RAUS
# Protokollieren
iptables -A RAUS -j LOG -m limit --limit 5/minute \
--log-prefix "Boses Packet: "
# Raussschmeissen
iptables -A RAUS -j DROP
# 3.2. Regeln fuer eingehende Pakete
# 3.2.1. Vom internen Netzwerk
# Alles erlauben
iptables -A INPUT -i $IFACE_INT -s $NET_INT -j ACCEPT
# 3.2.2. Vom Loopback
# Alles erlauben
iptables -A INPUT -i $IFACE_LO -j ACCEPT
# 3.2.3. Vom Internet
# Soll nicht sein
iptables -A INPUT -p TCP ! --syn -m state --state NEW -j RAUS
# Darf auch nicht sein
iptables -A INPUT -i $IFACE_EXT -s 10.0.0.0/8 -j RAUS
iptables -A INPUT -i $IFACE_EXT -s 172.16.0.0/12 -j RAUS
iptables -A INPUT -i $IFACE_EXT -s 192.168.0.0/24 -j RAUS
# Erlauben von bereits initialisierten TCP-Verbindungen
iptables -A INPUT -i $IFACE_EXT -p TCP -m state \
--state ESTABLISHED,RELATED -j ACCEPT
# Erlauben von bereits initialisierten UDP-Verbindungen von Zeitservern
iptables -A INPUT -i $IFACE_EXT -p UDP -m state \
--state ESTABLISHED,RELATED --sport 123 -j ACCEPT
# Erlauben von bereits initialisierten Verbindungen von DNS
iptables -A INPUT -i $IFACE_EXT -p UDP -m state \
--state ESTABLISHED,RELATED --sport 53 -j ACCEPT
# Verbindungen zum Identserver erlauben
iptables -A INPUT -i $IFACE_EXT -p TCP --dport 113 -j ACCEPT
iptables -A INPUT -i $IFACE_EXT -p UDP --dport 113 -j ACCEPT
# Erlauben der notwendigsten ICMP-Pakete
iptables -A INPUT -i $IFACE_EXT -p ICMP --icmp-type 0 -j ACCEPT
iptables -A INPUT -i $IFACE_EXT -p ICMP --icmp-type 3 -j ACCEPT
iptables -A INPUT -i $IFACE_EXT -p ICMP --icmp-type 5 -j ACCEPT
iptables -A INPUT -i $IFACE_EXT -p ICMP --icmp-type 11 -j ACCEPT
# 3.3. Regeln fuers Forwarding
# 3.3.1. Lokal -> Internet
# Erlauben von Telnet, SSH, FTP, SMTP, POP3, SHTML Verbindungen
iptables -A FORWARD -i $IFACE_INT -o $IFACE_EXT -p TCP -m multiport \
--dport 20,21,22,25,80,110,443 -j ACCEPT
# Erlauben von Highport-Verbindungen
iptables -A FORWARD -i $IFACE_INT -o $IFACE_EXT -p TCP \
--dport 1024:65000 -j ACCEPT
# ICQ-Verbindungen
iptables -A FORWARD -i $IFACE_INT -o $IFACE_EXT -p UDP \
--dport 4000 -j ACCEPT
# 3.3.2. Internet -> Lokales
# Nur UDP-Verkehr über bereits bestehende ICQ-Verbindungen erlauben
iptables -A FORWARD -i $IFACE_EXT -o $IFACE_INT -p UDP -m state \
--state ESTABLISHED,RELATED --sport 4000 -j ACCEPT
# Nur TCP-Verkehr über bereits bestehende Verbindungen erlauben
iptables -A FORWARD -i $IFACE_EXT -o $IFACE_INT -p TCP -m state \
--state ESTABLISHED,RELATED -j ACCEPT
# 3.4. Regeln für ausgehende Pakete
# 3.4.1. Ins lokale Netzwerk
# Alles erlauben
iptables -A OUTPUT -o $IFACE_INT -j ACCEPT
# 3.4.2. Ans Loopback
# Alles erlauben
iptables -A OUTPUT -o $IFACE_LO -j ACCEPT
# 3.4.3. Ins Internet
# DNS den Verkehr ins Internet erlauben - falls den einer läuft
if [ $BIND != "" ]; then
iptables -A OUTPUT -o $IFACE_EXT -p UDP -m owner \
--pid-owner=$BIND --dport 53 -j ACCEPT
fi
# Squid-Proxy den TCP-Verkehr ins Internet erlauben
iptables -A OUTPUT -o $IFACE_EXT -p TCP -m owner --uid-owner=13 -j ACCEPT
# Dem Ident-Server Verkehr ins Internet erlauben
iptables -A OUTPUT -o $IFACE_EXT -p UDP --sport 113 -j ACCEPT
iptables -A OUTPUT -o $IFACE_EXT -p TCP --sport 113 -j ACCEPT
# Verkehr zu einem Zeitserver erlauben
iptables -A OUTPUT -o $IFACE_EXT -p UDP --dport 123 -j ACCEPT
# ICMP-Verkehr ins Internet erlauben
iptables -A OUTPUT -o $IFACE_EXT -p ICMP -j ACCEPT
# 3.5. Routing
# Masquerading
iptables -A POSTROUTING -o $IFACE_EXT -t nat -j MASQUERADE
# Direkte Verbindungen für ICQ zu mir umleiten
iptables -t nat -A PREROUTING -i $IFACE_EXT -p TCP \
--dport 6000:6010 -j DNAT --to 10.1.1.20
# 3.6. Mitprotokollieren
iptables -A OUTPUT -j LOG --log-prefix "Nicht raus: "
iptables -A FORWARD -j LOG --log-prefix "Nicht durch: "
iptables -A INPUT -j LOG --log-prefix "Nicht rein: "
}
# **********************
# **********************
# * *
# * START-STOP-SKRIPT *
# * *
# **********************
# **********************
case "$1" in
start)
echo -n "Starting firewall: iptables"
StartFirewall
;;
stop)
echo "Stopping firewall: iptables"
StopFirewall
echo "."
;;
force-reload|restart)
$0 stop
$0 start
;;
*)
echo "Usage: /etc/init.d/firewall {start|stop|restart" \
"|force-reload}"
exit 1
;;
esac
Vielleicht noch ein paar erklärende Worte:
Prinzipiell wird erstmal alles gedropt und dann später in den einzelnen Regeln nur das wieder erlaubt, was ich auch für wirklich wichtig erachte.
Verbindungen von aussen können nur an ICQ oder meinen oidentd gemacht werden (Ports 113,6000-6010).
Von meinem Firewall-Rechner darf nur der Squid-Proxy (benutzt UID 13), der Bind, der oident und mein ntpupdate ins Internet. Desweiteren habe ich auch noch ein paar ICMP-Typen erlaubt (pingen, traceroute ...). Aber in der jetztigen Konfiguration kann mein Rechner selbst nicht angepingt werden, dazu müsste der ICMP-Type 8 noch zugelassen werden.
Der Verkehr von Innen ins Internet ist ebenfalls limitiert: Im Bereich der Systemports (<1024) sind nur die wichtigsten erlaubt. Die Highports würde ich im Firmennetz nicht freigeben - aber nachdem es nur für daheim ist ...
Der Verkehr vom Router ins lokale Netzwerk und vom lokalen Netzwerk an den Router ist nicht beschränkt.
Der Verkehr vom Router ins Internet kann natürlich auch ganz freigeben werden - war halt mal eine Spielerei.
Prinzipiell wird erstmal alles gedropt und dann später in den einzelnen Regeln nur das wieder erlaubt, was ich auch für wirklich wichtig erachte.
Verbindungen von aussen können nur an ICQ oder meinen oidentd gemacht werden (Ports 113,6000-6010).
Von meinem Firewall-Rechner darf nur der Squid-Proxy (benutzt UID 13), der Bind, der oident und mein ntpupdate ins Internet. Desweiteren habe ich auch noch ein paar ICMP-Typen erlaubt (pingen, traceroute ...). Aber in der jetztigen Konfiguration kann mein Rechner selbst nicht angepingt werden, dazu müsste der ICMP-Type 8 noch zugelassen werden.
Der Verkehr von Innen ins Internet ist ebenfalls limitiert: Im Bereich der Systemports (<1024) sind nur die wichtigsten erlaubt. Die Highports würde ich im Firmennetz nicht freigeben - aber nachdem es nur für daheim ist ...
Der Verkehr vom Router ins lokale Netzwerk und vom lokalen Netzwerk an den Router ist nicht beschränkt.
Der Verkehr vom Router ins Internet kann natürlich auch ganz freigeben werden - war halt mal eine Spielerei.
Du brauchst nur was "extra", wenn Du die Geschichte ohne Highports machen bzw. kein passives ftp benutzen willst.
"Network packet filtering (replaces ipchains)" anschalten, danach kannst Du unter " IP: Netfilter Configuration" die einzelnen Module auswählen. Nimm am besten alles als Modul - dann hast Du später die wenigsten Sorgen.
"Network packet filtering (replaces ipchains)" anschalten, danach kannst Du unter " IP: Netfilter Configuration" die einzelnen Module auswählen. Nimm am besten alles als Modul - dann hast Du später die wenigsten Sorgen.
Ich habe mal alles auf ein Minimum zusammengekürzt. Eigentlich macht diese Firewall nur eins: sie verhindert, dass von aussen - sprich dem Internet - Verbindung zu den Heimrechnern aufgenommen werden kann.
Ein Problem liegt dann auch darin, dass vermeidliche Windows-Kisten, welche über den Router ins Internet gehen, auch ihre Shares dem Internet mitteilen, da der Verkehr für sie ins Internet nicht limitiert ist.
Aber wie gesagt, ist vielleicht eine gute Ausgangsbasis für eigene Firewallskripts:
Ein Problem liegt dann auch darin, dass vermeidliche Windows-Kisten, welche über den Router ins Internet gehen, auch ihre Shares dem Internet mitteilen, da der Verkehr für sie ins Internet nicht limitiert ist.
Aber wie gesagt, ist vielleicht eine gute Ausgangsbasis für eigene Firewallskripts:
Code: Alles auswählen
#!/bin/sh
# Schnittstelle zum lokalen Netzwerk
IFACE_INT=eth0
# Internetschnittstelle
IFACE_EXT=ppp0
# Loopback device
IFACE_LO=lo
# ************
# * POLICIES *
# ************
# Default-Policies setzen - alles fliegt raus
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
# Einschalten von ip-Forwarding
echo "1" > /proc/sys/net/ipv4/ip_forward
# ************
# * INCOMING *
# ************
# Soll nicht sein
iptables -A INPUT -p TCP ! --syn -m state --state NEW -j DROP
# Vom internen Netz alles erlauben
iptables -A INPUT -i $IFACE_INT -j ACCEPT
# Vom Loopback Alles erlauben
iptables -A INPUT -i $IFACE_LO -j ACCEPT
# Vom Internet: Darf nicht sein
iptables -A INPUT -i $IFACE_EXT -s 10.0.0.0/8 -j DROP
iptables -A INPUT -i $IFACE_EXT -s 172.16.0.0/12 -j DROP
iptables -A INPUT -i $IFACE_EXT -s 192.168.0.0/24 -j DROP
# Vom Internet Erlauben von bereits initialisierten Verbindungen
iptables -A INPUT -i $IFACE_EXT -m state \
--state ESTABLISHED,RELATED -j ACCEPT
# **************
# * FORWARDING *
# **************
# Lokal -> Internet: Alles erlauben
iptables -A FORWARD -i $IFACE_INT -o $IFACE_EXT -j ACCEPT
# Internet -> Lokales: Nur Verkehr über bereits bestehende Verbindungen erlauben
iptables -A FORWARD -i $IFACE_EXT -o $IFACE_INT -m state \
--state ESTABLISHED,RELATED -j ACCEPT
# **************
# * FORWARDING *
# **************
# Ins lokale Netzwerk: Alles erlauben
iptables -A OUTPUT -o $IFACE_INT -j ACCEPT
# Ans Loopback: Alles erlauben
iptables -A OUTPUT -o $IFACE_LO -j ACCEPT
# Ins INternet : Alles erlauben
iptables -A OUTPUT -o $IFACE_EXT -j ACCEPT
# Masquerading
iptables -A POSTROUTING -o $IFACE_EXT -t nat -j MASQUERADE
# Alles was bis hier kommt, mitprotokollieren
iptables -A OUTPUT -j LOG --log-prefix "Nicht raus: "
iptables -A FORWARD -j LOG --log-prefix "Nicht durch: "
iptables -A INPUT -j LOG --log-prefix "Nicht rein: "
Upps
Habe gerade seit langem wieder mal probiert eine direkete Verbindung mit meinem ICQ zu machen. Und da durfte ich feststellen, dass ich mal eine Zeile aus meinem Firewallskript gelöscht hatte. Unter 3.3.2 (Internet -> Lokal) gehört noch folgendes rein:
Code: Alles auswählen
# ICQ-Verbindungen von aussen weiterleiten
iptables -A FORWARD -i $IFACE_EXT -o $IFACE_INT -p TCP \
--dport 6000:6010 -j ACCEPT
Bastel auch gerade etwas an einer Firewall mit IPTables rum, möchte hier noch auf eine Seite verweisen, die eine kurze Einleitung und ein gutes Skript anbietet:
http://www.it-secure-x.de/htmltonuke.ph ... ables.html
Martin
http://www.it-secure-x.de/htmltonuke.ph ... ables.html
Martin
- eigeneachse
- Beiträge: 752
- Registriert: 28.01.2002 17:12:52
- Wohnort: München
-
Kontaktdaten:
hallo,
ich hab mal das skript hergenommen und probiert es zum laufen zu bringen.
ich bekomme immer die fehlermeldung
wo ist denn der fehler.
danke
ich hab mal das skript hergenommen und probiert es zum laufen zu bringen.
ich bekomme immer die fehlermeldung
Code: Alles auswählen
agrathea:/etc/init.d# /etc/init.d/firewall start
cat: /var/run/named.pid: Datei oder Verzeichnis nicht gefunden
Starting firewall: iptablesiptables: No chain/target/match by that name
iptables: No chain/target/match by that name
iptables: No chain/target/match by that name
iptables: No chain/target/match by that name
iptables: No chain/target/match by that name
iptables: No chain/target/match by that name
/etc/init.d/firewall: [: !=: unary operator expected
iptables: No chain/target/match by that name
danke
Debian Sarge
- eigeneachse
- Beiträge: 752
- Registriert: 28.01.2002 17:12:52
- Wohnort: München
-
Kontaktdaten:
Das alte Skript von mir war eine Lösung, die für mich daheim angepasst war. Du wirst auch nicht darum kommen dieses Skript Deinen Bedürfnissen anzupassen.eigene achse hat geschrieben:danke werde ich probieren.
ist mir alles noch ein wenig schleierhaft die geschichte.
Eine Firewall ist aber nur so weit sicher, als Du auch die Regeln verstehst. Darum würde ich Dir Raten vielleicht doch mit einem kleinerem Konfigurationsskript anzufangen.
Du kannst in das Skript auch noch kleine "echo DEBUG (1,2,...)" einfügen um die betreffenden Zeilen, die den Fehelr erzeugen herauszubekommen.
Die "raus"-chain sollte aber funktionieren.
- eigeneachse
- Beiträge: 752
- Registriert: 28.01.2002 17:12:52
- Wohnort: München
-
Kontaktdaten:
- eigeneachse
- Beiträge: 752
- Registriert: 28.01.2002 17:12:52
- Wohnort: München
-
Kontaktdaten:
- eigeneachse
- Beiträge: 752
- Registriert: 28.01.2002 17:12:52
- Wohnort: München
-
Kontaktdaten:
also ich habe mir das jetzt mal zusammengebastelt.
im prinzip nur das kleine skript mit den start und stop funktionen.
aber immer noch die meldung
hab ich irgendein modul vergessen?
hmmmmm
edit:
hab was gefunden
wo bekomme ich das her??
danke
im prinzip nur das kleine skript mit den start und stop funktionen.
aber immer noch die meldung
Code: Alles auswählen
magrathea:/home/ralph# /etc/init.d/firewall start
Starting firewall: iptables
iptables: No chain/target/match by that name
iptables: No chain/target/match by that name
iptables: No chain/target/match by that name
hmmmmm
edit:
hab was gefunden
Code: Alles auswählen
modprobe: Can't locate module ipt_state
danke
Debian Sarge
Folgende Zeilen kommen in die fuction startFirewall
$IF_OUT und $IF_LO mußt Du natürlich am Anfang des Scripts zugewiesen haben. Ich hoffe, dass ich in der Eile nichts vergessen habe.
Code: Alles auswählen
iptables -F
iptables -X
# drop everything
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
# allow everything from and to IF_LO
iptables -A INPUT -i $IF_LO -j ACCEPT
iptables -A OUTPUT -o $IF_LO -j ACCEPT
# allow established and related TCP-connections from IF_OUT
iptables -A INPUT -i $IF_OUT -p TCP -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i $IF_OUT -p UDP -m state --state ESTABLISHED,RELATED -j ACCEPT
# allow DNS-Connections
iptables -A OUTPUT -o $IF_OUT -p UDP --dport 53 -j ACCEPT
# allow connections to Port 80 and 443 (HTTP und HTTPS)
iptables -A OUTPUT -o $IF_OUT -p TCP -m multiport --dport 80,443 - j ACCEPT
- eigeneachse
- Beiträge: 752
- Registriert: 28.01.2002 17:12:52
- Wohnort: München
-
Kontaktdaten: