atomic
15.03.04, 12:34
Tag zusammen,
ich sitze gerade hier und bastel an meinem Script fuer eine DMZ herum.
Ungefaehre Skizze:
(Der Webserver haengt natuerlich mit Alice und Bob an einem DMZ-Switch.
INET----|Alice|-----|Webserver|--------|Bob|-------- LAN
Soweit so gut, das Script auf "Bob" ist in Ordnung, aber wenn ich folgendes Script auf "Alice" einspiele bekommen die Clients im LAN keine Verbindung mehr in Internet. Hat jemand eine Idee?
#!/bin/bash
#
# DMZ Script (Demilitarisierte Zone)
#
# Iptables-Konfiguration fuer Firewall 1 ('Alice')
#
# Grundlegende Definitionen von Netzwerkadressen und Interfaces
INET_nic=eth0 # Netzwerkadapter der mit dem Internet-Router verbunden wird.
DMZ_nic=eth1 # Netzwerkadapter der mit dem DMZ-Switch verbunden wird.
LO_nic=lo # Virtueller Netzwerkadapter (localhost)
INET_addr=172.6.114.175 # IP-Adresse der Internetanbindung / Offizielle Class-B Adresse
DMZ_addr=192.168.0.2 # IP-Adresse der Demilitarisierte Zone /Private Class-C Adresse
SRV_addr=192.168.2.2 # IP des Webservers in der DMZ / Private Class-C Adresse
LO_addr=127.0.0.1 # Lokale Loopback-Adresse (localhost)
IPT=/sbin/iptables # Absoluter Pfad zu 'iptables' im Dateisystem
OK='echo : [ok]' # Standardausgabe
# Keine Aenderungen unter dieser Zeile vornehmen.
################################################## ###############################################
case "$1" in
load)
echo "Konfiguriere Firewall (`$IPT -V`)"
echo -n " * Loeschen der Firewall-Regelketten"
$IPT -F
$OK
echo -n " * Loeschen der NAT-Regelketten"
$IPT -t nat -F
$OK
echo -n " * Loeschen der selbst angelegten Regelketten"
$IPT -F bad_tcp_packets 2>/dev/null
$IPT -F allowed 2>/dev/null
$IPT -X bad_tcp_packets 2>/dev/null
$IPT -X allowed 2>/dev/null
$OK
echo "---"
echo " * Ausgangszustand setzen (alles verbieten)"
echo -n " * INPUT - Kette zuruecksetzen"
$IPT -P INPUT DROP
$OK
echo -n " * OUTPUT - Kette zuruecksetzen"
$IPT -P OUTPUT DROP
$OK
echo -n " * Forward - Kette zuruecksetzen"
$IPT -P FORWARD DROP
$OK
echo -n " * Regelkette fuer erlaubte Verbindungen erstellen"
$IPT -N allowed
$OK
echo -n " * Pakete mit SYN-Flag zulassen"
$IPT -A allowed -p TCP --syn -j ACCEPT
$OK
echo -n " * Bereits etablierte Verbindungen aufrecht erhalten"
$IPT -A allowed -p TCP -m state --state ESTABLISHED,RELATED -j ACCEPT
$OK
echo -n " * Alles andere verbieten"
$IPT -A allowed -p TCP -j DROP
$OK
echo "---"
# Defekte oder "gefaelschte" Pakete in "bad_tcp_packets" Regel ablegen und loggen.
echo -n " * Regelkette fuer defekte oder illegale Pakete erstellen"
$IPT -N bad_tcp_packets
$OK
echo -n " * Defekte oder illegeale Pakete in einer Logdatei vermerken"
$IPT -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j LOG --log-prefix "Illegal (no syn):"
$OK
echo -n " * Defekte oder illegale Pakete verwerfen"
$IPT -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j DROP
$OK
# Anti-IP Spoofing (RFC1918):
# Der Class-A Bereich 10.x.x.x ist fuer private Zwecke bestimmt und wird im Internet nicht geroutet
# Der Class-B Bereich 172.16.x.x - 172.31.x.x ist fuer private Zwecke bestimmt und wird im Internet nicht geroutet
# Der Class-C Bereich 192.168.x.x ist fuer private Zwecke bestimmt und wird im Internet nicht geroutet
echo -n " * Gefaelschte Adressen auf dem Internet-Device laut RFC1918 verwerfen"
$IPT -A bad_tcp_packets -i $INET_nic -s 10.0.0.0/8 -j DROP
$IPT -A bad_tcp_packets -i $INET_nic -s 172.16.0.0/12 -j DROP
$IPT -A bad_tcp_packets -i $INET_nic -s 192.168.0.0/16 -j DROP
$OK
echo "---"
# Routing der LAN Rechner ins Internet mittels Source-Nat
echo -n " * Aktivierung von NAT (LAN -> Inet)"
$IPT -t nat -A POSTROUTING -o $INET_nic -j SNAT --to-source $INET_addr
$OK
echo -n " * Weiterleitung (forwarding) von TCP Port 80 (http) auf DMZ Webserver"
$IPT -t nat -A PREROUTING -p TCP -i $INET_nic -d $INET_addr --dport 80 -j DNAT --to-destination $SRV_addr
$OK
echo -n " * Weiterleitung (forwarding) von TCP Port 443 (https) auf DMZ Webserver"
$IPT -t nat -A PREROUTING -p TCP -i $INET_nic -d $INET_addr --dport 80 -j DNAT --to-destination $SRV_addr
$OK
echo "---"
echo "FORWARD Regeln"
##### FORWARD
# In die Forward-Regel die zuvor erstellte Regel "bad_tcp_packets" zuweisen
echo -n " * Regel 'Illegale Pakete' auf FORWARD-Kette anweden"
$IPT -A FORWARD -p tcp -j bad_tcp_packets
$OK
# DMZ Forwarding
echo -n " * Verbindung DMZ -> INET erlauben"
$IPT -A FORWARD -i $DMZ_nic -o $INET_nic -j ACCEPT
$OK
echo -n " * Bestehende Verbindung INET -> DMZ erlauben"
$IPT -A FORWARD -i $INET_nic -o $DMZ_nic -m state --state ESTABLISHED,RELATED -j ACCEPT
$OK
# Server in der DMZ
# Anfragen auf Port 80 und 442 in beide Richtungen (http/s) erlauben
echo -n " * Verbindungen auf Port 80 und 443 des Servers in der DMZ zulassen"
$IPT -A FORWARD -p tcp -i $INET_nic -o $DMZ_nic -d $SRV_addr --dport 80 -j ACCEPT
$IPT -A FORWARD -p tcp -i $DMZ_nic -o $INET_nic -s $SRV_addr --sport 80 -j ACCEPT
# $IPT -A FORWARD -p tcp -i $INET_nic -o $DMZ_nic -d $SRV_addr --dport 443 -j ACCEPT
# $IPT -A FORWARD -p tcp -i $DMZ_nic -o $INET_nic -s $SRV_addr --sport 443 -j ACCEPT
$OK
echo -n " * Bereits etablierte Verbindungen zur DMZ durchlassen"
$IPT -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
$OK
echo -n " * Verbindungen in die DMZ protokollieren und beschraenken"
$IPT -A FORWARD -m limit --limit 3/minute --limit-burst 3 -j LOG --log-level DEBUG --log-prefix "FORWARD packet error: "
$OK
echo "INPUT Regeln"
##### INPUT
echo -n " * Regel 'Illegale Pakete' auf INPUT-Kette anweden"
$IPT -A INPUT -p tcp -j bad_tcp_packets
$OK
### Pakete vom DMZ-Server ins Internet erlauben
$IPT -A INPUT -p ALL -i $DMZ_nic -d $DMZ_addr -j ACCEPT
# Localhost
echo -n " * Pakete von Localhost akzeptieren"
$IPT -A INPUT -p ALL -i $LO_nic -s $LO_addr -j ACCEPT
$IPT -A INPUT -p ALL -i $LO_nic -s $INET_addr -j ACCEPT
$OK
# Legale Pakete erlauben deren Verbindung vom Server ins Internet bereits aufgebaut ist
echo -n " * Verbindungen aus der DMZ protokollieren und beschraenken"
$IPT -A INPUT -p ALL -d $INET_addr -m state --state ESTABLISHED,RELATED -j ACCEPT
$OK
echo -n " * Verbindungen aus der DMZ protokollieren und beschraenken"
$IPT -A INPUT -m limit --limit 3/minute --limit-burst 3 -j LOG --log-level DEBUG --log-prefix "INPUT error: "
$OK
##### OUTPUT
# In die OUTPUT-Regel die zuvor erstellte Regel "bad_tcp_packets" zuweisen
$IPT -A OUTPUT -p tcp -j bad_tcp_packets
# Erlaube Verbindungen nach draussen (nur mit richtigem device und richtiger source-ip)
echo -n " * Legale Verbindungen ins Internet erlauben"
$IPT -A OUTPUT -p ALL -o $LO_nic -s $LO_addr -j ACCEPT
$IPT -A OUTPUT -p ALL -o $INET_nic -s $INET_addr -j ACCEPT
$OK
# Log - und verhindere mit limit das ueberlaufen der Datei
echo -n " * Verbindungen protokollieren und beschraenken"
$IPT -A OUTPUT -m limit --limit 3/minute --limit-burst 3 -j LOG --log-level DEBUG --log-prefix "OUTPUT packet died: "
$OK
echo -n " * Aktiviere IP Forwarding"
echo "1" > /proc/sys/net/ipv4/ip_forward
$OK
echo "Firewallkonfiguration Vollstaendig."
;;
unload)
echo "Firewall deaktivieren (`$IPT -V`)..."
# Loesche alles aus Input, output, forward und der nat tabelle
$IPT -F
$IPT -t nat -F
# Leere selbsterstelle und loesche diese
# Falls diese nicht bestehen - Errormeldung ignorieren
$IPT -F bad_tcp_packets 2>/dev/null
$IPT -F allowed 2>/dev/null
$IPT -X bad_tcp_packets 2>/dev/null
$IPT -X allowed 2>/dev/null
$IPT -P INPUT ACCEPT
$IPT -P OUTPUT ACCEPT
$IPT -P FORWARD ACCEPT
$IPT -t nat -P POSTROUTING ACCEPT
$IPT -t nat -P PREROUTING ACCEPT
$IPT -t nat -P OUTPUT ACCEPT
echo "Firewall deaktiviert."
;;
reload)
echo "Neustart der Firewall (`$IPT -V`)..."
sh $0 unload
sh $0 load
;;
*)
echo "+++++++++++++++++++++++++++++++"
echo "Aufruf nicht korrekt."
echo "Syntax: $0 [load|unload|reload]"
echo "+++++++++++++++++++++++++++++++"
exit 1
;;
esac
exit 0
Oder gibt es eventuell noch Verbesserungsvorschlaege?
danke im Vorraus
martin
ich sitze gerade hier und bastel an meinem Script fuer eine DMZ herum.
Ungefaehre Skizze:
(Der Webserver haengt natuerlich mit Alice und Bob an einem DMZ-Switch.
INET----|Alice|-----|Webserver|--------|Bob|-------- LAN
Soweit so gut, das Script auf "Bob" ist in Ordnung, aber wenn ich folgendes Script auf "Alice" einspiele bekommen die Clients im LAN keine Verbindung mehr in Internet. Hat jemand eine Idee?
#!/bin/bash
#
# DMZ Script (Demilitarisierte Zone)
#
# Iptables-Konfiguration fuer Firewall 1 ('Alice')
#
# Grundlegende Definitionen von Netzwerkadressen und Interfaces
INET_nic=eth0 # Netzwerkadapter der mit dem Internet-Router verbunden wird.
DMZ_nic=eth1 # Netzwerkadapter der mit dem DMZ-Switch verbunden wird.
LO_nic=lo # Virtueller Netzwerkadapter (localhost)
INET_addr=172.6.114.175 # IP-Adresse der Internetanbindung / Offizielle Class-B Adresse
DMZ_addr=192.168.0.2 # IP-Adresse der Demilitarisierte Zone /Private Class-C Adresse
SRV_addr=192.168.2.2 # IP des Webservers in der DMZ / Private Class-C Adresse
LO_addr=127.0.0.1 # Lokale Loopback-Adresse (localhost)
IPT=/sbin/iptables # Absoluter Pfad zu 'iptables' im Dateisystem
OK='echo : [ok]' # Standardausgabe
# Keine Aenderungen unter dieser Zeile vornehmen.
################################################## ###############################################
case "$1" in
load)
echo "Konfiguriere Firewall (`$IPT -V`)"
echo -n " * Loeschen der Firewall-Regelketten"
$IPT -F
$OK
echo -n " * Loeschen der NAT-Regelketten"
$IPT -t nat -F
$OK
echo -n " * Loeschen der selbst angelegten Regelketten"
$IPT -F bad_tcp_packets 2>/dev/null
$IPT -F allowed 2>/dev/null
$IPT -X bad_tcp_packets 2>/dev/null
$IPT -X allowed 2>/dev/null
$OK
echo "---"
echo " * Ausgangszustand setzen (alles verbieten)"
echo -n " * INPUT - Kette zuruecksetzen"
$IPT -P INPUT DROP
$OK
echo -n " * OUTPUT - Kette zuruecksetzen"
$IPT -P OUTPUT DROP
$OK
echo -n " * Forward - Kette zuruecksetzen"
$IPT -P FORWARD DROP
$OK
echo -n " * Regelkette fuer erlaubte Verbindungen erstellen"
$IPT -N allowed
$OK
echo -n " * Pakete mit SYN-Flag zulassen"
$IPT -A allowed -p TCP --syn -j ACCEPT
$OK
echo -n " * Bereits etablierte Verbindungen aufrecht erhalten"
$IPT -A allowed -p TCP -m state --state ESTABLISHED,RELATED -j ACCEPT
$OK
echo -n " * Alles andere verbieten"
$IPT -A allowed -p TCP -j DROP
$OK
echo "---"
# Defekte oder "gefaelschte" Pakete in "bad_tcp_packets" Regel ablegen und loggen.
echo -n " * Regelkette fuer defekte oder illegale Pakete erstellen"
$IPT -N bad_tcp_packets
$OK
echo -n " * Defekte oder illegeale Pakete in einer Logdatei vermerken"
$IPT -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j LOG --log-prefix "Illegal (no syn):"
$OK
echo -n " * Defekte oder illegale Pakete verwerfen"
$IPT -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j DROP
$OK
# Anti-IP Spoofing (RFC1918):
# Der Class-A Bereich 10.x.x.x ist fuer private Zwecke bestimmt und wird im Internet nicht geroutet
# Der Class-B Bereich 172.16.x.x - 172.31.x.x ist fuer private Zwecke bestimmt und wird im Internet nicht geroutet
# Der Class-C Bereich 192.168.x.x ist fuer private Zwecke bestimmt und wird im Internet nicht geroutet
echo -n " * Gefaelschte Adressen auf dem Internet-Device laut RFC1918 verwerfen"
$IPT -A bad_tcp_packets -i $INET_nic -s 10.0.0.0/8 -j DROP
$IPT -A bad_tcp_packets -i $INET_nic -s 172.16.0.0/12 -j DROP
$IPT -A bad_tcp_packets -i $INET_nic -s 192.168.0.0/16 -j DROP
$OK
echo "---"
# Routing der LAN Rechner ins Internet mittels Source-Nat
echo -n " * Aktivierung von NAT (LAN -> Inet)"
$IPT -t nat -A POSTROUTING -o $INET_nic -j SNAT --to-source $INET_addr
$OK
echo -n " * Weiterleitung (forwarding) von TCP Port 80 (http) auf DMZ Webserver"
$IPT -t nat -A PREROUTING -p TCP -i $INET_nic -d $INET_addr --dport 80 -j DNAT --to-destination $SRV_addr
$OK
echo -n " * Weiterleitung (forwarding) von TCP Port 443 (https) auf DMZ Webserver"
$IPT -t nat -A PREROUTING -p TCP -i $INET_nic -d $INET_addr --dport 80 -j DNAT --to-destination $SRV_addr
$OK
echo "---"
echo "FORWARD Regeln"
##### FORWARD
# In die Forward-Regel die zuvor erstellte Regel "bad_tcp_packets" zuweisen
echo -n " * Regel 'Illegale Pakete' auf FORWARD-Kette anweden"
$IPT -A FORWARD -p tcp -j bad_tcp_packets
$OK
# DMZ Forwarding
echo -n " * Verbindung DMZ -> INET erlauben"
$IPT -A FORWARD -i $DMZ_nic -o $INET_nic -j ACCEPT
$OK
echo -n " * Bestehende Verbindung INET -> DMZ erlauben"
$IPT -A FORWARD -i $INET_nic -o $DMZ_nic -m state --state ESTABLISHED,RELATED -j ACCEPT
$OK
# Server in der DMZ
# Anfragen auf Port 80 und 442 in beide Richtungen (http/s) erlauben
echo -n " * Verbindungen auf Port 80 und 443 des Servers in der DMZ zulassen"
$IPT -A FORWARD -p tcp -i $INET_nic -o $DMZ_nic -d $SRV_addr --dport 80 -j ACCEPT
$IPT -A FORWARD -p tcp -i $DMZ_nic -o $INET_nic -s $SRV_addr --sport 80 -j ACCEPT
# $IPT -A FORWARD -p tcp -i $INET_nic -o $DMZ_nic -d $SRV_addr --dport 443 -j ACCEPT
# $IPT -A FORWARD -p tcp -i $DMZ_nic -o $INET_nic -s $SRV_addr --sport 443 -j ACCEPT
$OK
echo -n " * Bereits etablierte Verbindungen zur DMZ durchlassen"
$IPT -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
$OK
echo -n " * Verbindungen in die DMZ protokollieren und beschraenken"
$IPT -A FORWARD -m limit --limit 3/minute --limit-burst 3 -j LOG --log-level DEBUG --log-prefix "FORWARD packet error: "
$OK
echo "INPUT Regeln"
##### INPUT
echo -n " * Regel 'Illegale Pakete' auf INPUT-Kette anweden"
$IPT -A INPUT -p tcp -j bad_tcp_packets
$OK
### Pakete vom DMZ-Server ins Internet erlauben
$IPT -A INPUT -p ALL -i $DMZ_nic -d $DMZ_addr -j ACCEPT
# Localhost
echo -n " * Pakete von Localhost akzeptieren"
$IPT -A INPUT -p ALL -i $LO_nic -s $LO_addr -j ACCEPT
$IPT -A INPUT -p ALL -i $LO_nic -s $INET_addr -j ACCEPT
$OK
# Legale Pakete erlauben deren Verbindung vom Server ins Internet bereits aufgebaut ist
echo -n " * Verbindungen aus der DMZ protokollieren und beschraenken"
$IPT -A INPUT -p ALL -d $INET_addr -m state --state ESTABLISHED,RELATED -j ACCEPT
$OK
echo -n " * Verbindungen aus der DMZ protokollieren und beschraenken"
$IPT -A INPUT -m limit --limit 3/minute --limit-burst 3 -j LOG --log-level DEBUG --log-prefix "INPUT error: "
$OK
##### OUTPUT
# In die OUTPUT-Regel die zuvor erstellte Regel "bad_tcp_packets" zuweisen
$IPT -A OUTPUT -p tcp -j bad_tcp_packets
# Erlaube Verbindungen nach draussen (nur mit richtigem device und richtiger source-ip)
echo -n " * Legale Verbindungen ins Internet erlauben"
$IPT -A OUTPUT -p ALL -o $LO_nic -s $LO_addr -j ACCEPT
$IPT -A OUTPUT -p ALL -o $INET_nic -s $INET_addr -j ACCEPT
$OK
# Log - und verhindere mit limit das ueberlaufen der Datei
echo -n " * Verbindungen protokollieren und beschraenken"
$IPT -A OUTPUT -m limit --limit 3/minute --limit-burst 3 -j LOG --log-level DEBUG --log-prefix "OUTPUT packet died: "
$OK
echo -n " * Aktiviere IP Forwarding"
echo "1" > /proc/sys/net/ipv4/ip_forward
$OK
echo "Firewallkonfiguration Vollstaendig."
;;
unload)
echo "Firewall deaktivieren (`$IPT -V`)..."
# Loesche alles aus Input, output, forward und der nat tabelle
$IPT -F
$IPT -t nat -F
# Leere selbsterstelle und loesche diese
# Falls diese nicht bestehen - Errormeldung ignorieren
$IPT -F bad_tcp_packets 2>/dev/null
$IPT -F allowed 2>/dev/null
$IPT -X bad_tcp_packets 2>/dev/null
$IPT -X allowed 2>/dev/null
$IPT -P INPUT ACCEPT
$IPT -P OUTPUT ACCEPT
$IPT -P FORWARD ACCEPT
$IPT -t nat -P POSTROUTING ACCEPT
$IPT -t nat -P PREROUTING ACCEPT
$IPT -t nat -P OUTPUT ACCEPT
echo "Firewall deaktiviert."
;;
reload)
echo "Neustart der Firewall (`$IPT -V`)..."
sh $0 unload
sh $0 load
;;
*)
echo "+++++++++++++++++++++++++++++++"
echo "Aufruf nicht korrekt."
echo "Syntax: $0 [load|unload|reload]"
echo "+++++++++++++++++++++++++++++++"
exit 1
;;
esac
exit 0
Oder gibt es eventuell noch Verbesserungsvorschlaege?
danke im Vorraus
martin