PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : DMZ Iptables Script


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

mfhg
15.03.04, 19:40
mal ne dumme frage, warum spricht man in manchen fällen von DMZ. ich hab das noch nicht so ganz verstanden was das genau bedeutet

emba
15.03.04, 22:12
@mfhg

ist eine demilitarisierte zone, in der alle rechner kommen, die physisch vom internen netz (LAN) getrennt sind (ggf. auch durch zusätzliche firewall) und keine verbindung ins interne netz aufbauen können

greez

zorin
16.03.04, 10:11
Man kann mit einer DMZ, vertrauenswürdige und unwürdige Rechner besser trennen. Wenn man seinem HTTP-Server 2 Netzwerkkarten spendiert, kann man eine Richtung WAN, die andere Richtung LAN anschliessen. Vom LAN aus darf man via ssh einloggen, das darf man vom WAN aus nicht. In den Firewall-Skripten kann man so nicht nur die IP überprüfen, sondern über welches Interface die Verbindung reinkommt. Das verhindert IP-Spoofing, oder minimiert das Risiko zumindest.

Gruss Zorin

PS: Schlagt mich, wenn ich lüge ;)

emba
16.03.04, 12:45
@zorin

das ist aber nicht die definition einer dmz, welche physisch (durch switch, router, ... ) vom LAN abgetrennt werden muss (und einiges mehr, s.o.)

bei deiner konstellation

WAN - WEBSERVER - LAN

ist das überhaupt nicht der fall
einfache firewallregeln "bauen" noch keine DMZ

Man kann mit einer DMZ, vertrauenswürdige und unwürdige Rechner besser trennen
rechner, die in der DMZ stehen, sind auch vertrauenswürdig (ansonsten würden da keine dienste wie mail, http, ... drauf laufen) - sie sind nur meist erstes ziel von angriffen, da sie interfaces ins LAN haben und somit weniger geschützt sind (etwa durch NAT, firewall, ... ) und stehen deshalb seperiert in einem anderen physischen netz

greez

atomic
17.03.04, 06:50
Nur noch mal zum Verstaendniss:
Alice ist die erste Firewall die mit der DMZ und dem Internet "direkt" verbunden ist.
Bob ist die zweite Firewall die mit der DMZ sowie dem LAN verbunden ist.
Der Webserver "steht" zwischen Alice und Bob in der eigentlichen DMZ und ist per
Switch mit den beiden Firewalls verbunden. Hinter "Bob" befindet sich ein weiterer
Switch an den die LAN-Rechner angeschlossen sind.

Hat schon jemand einen Fehler gefunden? :)

mfg
martin

zorin
17.03.04, 22:44
Original geschrieben von emba

rechner, die in der DMZ stehen, sind auch vertrauenswürdig (ansonsten würden da keine dienste wie mail, http, ... drauf laufen) - sie sind nur meist erstes ziel von angriffen, da sie interfaces ins LAN haben und somit weniger geschützt sind (etwa durch NAT, firewall, ... ) und stehen deshalb seperiert in einem anderen physischen netz


Und inwiefern widerspricht das jetzt meiner Ausführung?
Ich habe weder behauptet, dass DMZ-Rechner vertrauensunwürdig sind, noch, dass DMZ-Rechner Verbindungen ins LAN aufbauen dürfen.
Wenn ich zwei Ifaces habe, kann ich doch damit unterscheiden, ob die Verbindung aus dem WAN oder LAN heraus aufgebaut wurde und sie somit zulassen oder ablehnen.
z.B:
ssh aus LAN -> i.O.
ssh aus WAN -> n.i.O.

Gruss Zorin

cane
18.03.04, 07:20
Wenn ich zwei Ifaces habe, kann ich doch damit unterscheiden,

Und an welchem Interface hängt dann die DMZ?

Du brauchst drei:

1. WAN
2. LAN
3. DMZ

mfg
cane

emba
18.03.04, 21:14
die antwort auf cane´s frage wäre natürlich erstmal interessant

@zorin


Ich habe weder behauptet, dass DMZ-Rechner vertrauensunwürdig sind

dies habe ich aber so interpretiert:

"Man kann mit einer DMZ, vertrauenswürdige und unwürdige Rechner besser trennen" - was sind denn bei dir vertrauensunwürdige PC in einer LAN/DMZ-Umgebung?

zum rest deines textes: das entspricht nicht dem aufbau einer dmz, um den es hier geht

eine einfache konstellation WAN-WWW-LAN stellt nun mal keine DMZ dar ;)
natürlich kannst du ssh nur von einer seite zulassen, aber es ist keine DMZ

greez

atomic
19.03.04, 09:41
ok, nette Diskussion, aber hat jemand eine Idee wieso das Script nicht funktioniert? ;)

mfg
martin

[WCM]Manx
19.03.04, 09:48
Hi!

Ein "iptables -vnL" von Alice liest sich IMHO leichter, als das Script!

Grüße

Manx

cane
19.03.04, 09:54
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)


Wieso ist im Script keine NIC bzw. IP fürs LAN Interface definiert?

atomic
19.03.04, 11:04
Weil die Kiste nicht am LAN sondern am Internet bzw. in der DMZ sitzt.
Der Rechner mit der LAN/DMZ verbindung funktioniert, da laut tcpdump
Pakete aus dem LAN ueber Alice ins Internet geschickt werden,
aber scheinbar nicht mehr zurueckkommen.

mfg
martin

atomic
19.03.04, 11:07
iptables -vnL


Chain INPUT (policy DROP 3212 packets, 548K bytes)
pkts bytes target prot opt in out source destination
1169 59939 bad_tcp_packets tcp -- * * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- eth1 * 0.0.0.0/0 192.168.0.2
0 0 ACCEPT all -- lo * 127.0.0.1 0.0.0.0/0
0 0 ACCEPT all -- lo * 217.6.114.175 0.0.0.0/0
31 3367 ACCEPT all -- * * 0.0.0.0/0 217.6.114.175 state RELATED,ESTABLISHED
2749 502K LOG all -- * * 0.0.0.0/0 0.0.0.0/0 limit: avg 3/min burst 3 LOG flags 0 level 7 prefix `INPUT error: '

Chain FORWARD (policy DROP 14 packets, 672 bytes)
pkts bytes target prot opt in out source destination
91075 42M bad_tcp_packets tcp -- * * 0.0.0.0/0 0.0.0.0/0
45329 4719K ACCEPT all -- eth1 eth0 0.0.0.0/0 0.0.0.0/0
47015 37M ACCEPT all -- eth0 eth1 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
0 0 ACCEPT tcp -- eth0 eth1 0.0.0.0/0 192.168.2.2 tcp dpt:80
0 0 ACCEPT tcp -- eth1 eth0 192.168.2.2 0.0.0.0/0 tcp spt:80
0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
14 672 LOG all -- * * 0.0.0.0/0 0.0.0.0/0 limit: avg 3/min burst 3 LOG flags 0 level 7 prefix `FORWARD packet error: '

Chain OUTPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
32 2361 bad_tcp_packets tcp -- * * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- * lo 127.0.0.1 0.0.0.0/0
36 2610 ACCEPT all -- * eth0 217.6.114.175 0.0.0.0/0
0 0 LOG all -- * * 0.0.0.0/0 0.0.0.0/0 limit: avg 3/min burst 3 LOG flags 0 level 7 prefix `IPT OUTPUT packet died: '

Chain allowed (0 references)
pkts bytes target prot opt in out source destination
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp flags:0x16/0x02
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
0 0 DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0

Chain bad_tcp_packets (3 references)
pkts bytes target prot opt in out source destination
83 5558 LOG tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp flags:!0x16/0x02 state NEW LOG flags 0 level 4 prefix `Illegal (no syn):'
83 5558 DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp flags:!0x16/0x02 state NEW
0 0 DROP all -- eth0 * 10.0.0.0/8 0.0.0.0/0
0 0 DROP all -- eth0 * 172.16.0.0/12 0.0.0.0/0
1 48 DROP all -- eth0 * 192.168.0.0/16 0.0.0.0/0