DMZ mit dem fli4l

DMZ - was ist das

Frei nach Wikipedia: Eine Demilitarized Zone (DMZ, auch ent- oder demilitarisierte Zone) bezeichnet ein Computernetz mit sicherheitstechnisch kontrollierten Zugriffsmöglichkeiten auf die daran angeschlossenen Server.

Wer weiter lesen will: Demilitarized Zone

Hier noch eine bildliche Darstellung einer DMZ


Vorraussetzungen

Ich will hier mal von der fli4l Standard-Config ausgehen, die ich im Folgenden ein wenig erweitern werde, dazu gehört:

IP_NET_N='3'
IP_NET_1='192.168.6.1/24'   # internes Netz (LAN)
IP_NET_1_DEV='eth0'         # (grün)
 
IP_NET_2='192.168.7.1/24'   # DMZ Netz
IP_NET_2_DEV='eth1'         # (orange)
 
IP_NET_3='192.168.200.1/24' # externes Netz (WAN)
IP_NET_3_DEV='eth2'         # (rot)

hier habe ich als externe Schnittstelle zum WAN auch einfach ein Netzwerk genommen, es geht natürlich auch jegliches andere "Medium"

Netze

naja wie man oben sehen kann gibt es davon in diesem Beispiel 3 Stück. Die Config von oben kann man einfach übernehmen bzw. sich seinen Bedürfnissen anpassen.

Regeln

Hier sollte man schon wissen was man a) möchte und b) wie man dahin kommt

a) was will ich

Was ich hier möchte ist einen offenen Zugang vom LAN in die DMZ (und andersrum ein wenig gefiltert) und einen "Gefilterten" vom WAN in die DMZ. Ins LAN soll man von außen nicht kommen.

Um es in Farben zu sagen: von Grün nach Orange soll frei sein, von Rot nach Orange soll eingeschränkt möglich sein und von Rot nach Grün natürlich nicht. Naja Grün nach Rot soll auch gehen.

In der DMZ sollen 3 Server laufen, einer macht WWW, einer Mail und einer FTP (siehe dazu die Grafik)

b) wie komme ich da hin

alles was aus dem LAN und der DMZ raus geht...

gehen wir erstmal wieder von der Grundkonfig aus:

PF_FORWARD_N='2'
PF_FORWARD_1='tmpl:samba DROP' 
PF_FORWARD_2='if:IP_NET_1_DEV:any IP_NET_1 ACCEPT' # von grün nach orange und rot

damit kommt man schon mal aus Netz 1 überall hin. Nur wollen wir ja auch noch ein wenig mehr.

PF_FORWARD_N='3'
...
PF_FORWARD_3='if:IP_NET_2_DEV:any IP_NET_2 ACCEPT' # orange überall hin, was wir nicht wollen

jetzt darf die DMZ auch überall hin.

Soweit so gut, allerdings stellt sich hier die Frage ob das so geschickt ist das die DMZ auf das LAN zugreifen darf. Man sollte das noch einschränken:

PF_FORWARD_N='4'
...
PF_FORWARD_3='IP_NET_2 IP_NET_1 REJECT'				# orange nach grün verbieten
PF_FORWARD_4='if:IP_NET_2_DEV:any IP_NET_2 ACCEPT'	# orange überall hin nur nicht in grün (s.o.)

Wichtig ist hier die Reihenfolge der Regeln. Der DMZ muss verboten werden ins LAN zu kommen, bevor alle Pakete aus ihr akzeptiert werden, d.h. die letzte Regel zur Einschränkung muss zwischen die bereits bestehenden eingefügt werden. Was haben wir bis jetzt:

Das LAN kann nach außen und in die DMZ, ( grün --> rot, grün --> orange)

Die DMZ kann ins LAN sofern die Verbindung aus dem LAN "angestoßen" wurde

und die DMZ kann nach "Draußen" (orange --> rot)

Zusammenfassung
PF_FORWARD_N='4'
PF_FORWARD_1='tmpl:samba DROP' 
PF_FORWARD_2='if:IP_NET_1_DEV:any IP_NET_1 ACCEPT'
PF_FORWARD_3='IP_NET_2 IP_NET_1 REJECT'
PF_FORWARD_4='if:IP_NET_2_DEV:any IP_NET_2 ACCEPT'
Alles was von außen in die DMZ bzw. das LAN will

Dann fehlt uns noch der Zugriff von außen in die DMZ (rot --> orange), wie oben geschrieben gehe ich einfach von 3 Servern aus:

  • 192.168.7.2 (WWW mit HTTPS)
  • 192.168.7.3 (Mail)
  • 192.168.7.4 (FTP)

Die Rechner lassen sich natürlich auch als Hosts in dns_dhcp eintragen:

HOST_1_IP4='192.168.7.2'
HOST_1_MAC='xx:xx:xx:xx:xx:xx'
HOST_1_NAME='www'

HOST_2_IP4='192.168.7.3'
HOST_2_MAC='xx:xx:xx:xx:xx:xx'
HOST_2_NAME='mail'

HOST_3_IP4='192.168.7.4'
HOST_3_MAC='xx:xx:xx:xx:xx:xx'
HOST_3_NAME='ftp'

Im Weiteren werde ich eine Zusammenfassung der Regeln eimal mit den IPs und einmal mit den Hostnamen zeigen. Die Regeln sind dann austauschbar.

Das wird im Prerouting erledigt:

PF_PREROUTING_N='2'
PF_PREROUTING_1='tmpl:http dynamic DNAT:192.168.7.2'
PF_PREROUTING_2='tmpl:https dynamic DNAT:192.168.7.2'

das macht schon mal den Zugriff auf den WWW Server auf.

PF_PREROUTING_N='5'
...
PF_PREROUTING_3='tmpl:smtp dynamic DNAT:192.168.7.3'
PF_PREROUTING_4='tmpl:pop3 dynamic DNAT:192.168.7.3'
PF_PREROUTING_5='tmpl:imap dynamic DNAT:192.168.7.3'

dies sind die Regeln für den Mailserver, hier soll nicht darauf eingegangen werden das es besser wäre den Server verschlüsselt laufen zu lassen. Die Ports sind in der Reihenfolge: SMTP, POP3, IMAP.

Dann noch den FTP-Zugriff auf den dritten Server

PF_PREROUTING_N='6'
...
PF_PREROUTING_6='tmpl:ftp dynamic DNAT:192.168.7.4'

auch hier die Zusammenfassung

Zusammenfassung mit IPs
PF_PREROUTING_N='6'
PF_PREROUTING_1='tmpl:http dynamic DNAT:192.168.7.2'
PF_PREROUTING_2='tmpl:https dynamic DNAT:192.168.7.2'
PF_PREROUTING_3='tmpl:smtp dynamic DNAT:192.168.7.3'
PF_PREROUTING_4='tmpl:pop3 dynamic DNAT:192.168.7.3'
PF_PREROUTING_5='tmpl:imap dynamic DNAT:192.168.7.3'
PF_PREROUTING_6='tmpl:ftp dynamic DNAT:192.168.7.4'
Zusammenfassung mit dns Namen
PF_PREROUTING_N='6'
PF_PREROUTING_1='tmpl:http dynamic DNAT:@www'
PF_PREROUTING_2='tmpl:https dynamic DNAT:@www'
PF_PREROUTING_3='tmpl:smtp dynamic DNAT:@mail'
PF_PREROUTING_4='tmpl:pop3 dynamic DNAT:@mail'
PF_PREROUTING_5='tmpl:imap dynamic DNAT:@mail'
PF_PREROUTING_6='tmpl:ftp dynamic DNAT:@ftp'

eine kleine "Sonderlocke" macht hier der FTP-Server, denn damit der fli4l den Datenport aufmacht braucht es noch einen Helfer.

 PF_PREROUTING_CT_N='1'
 PF_PREROUTING_CT_1='tmpl:ftp any dynamic HELPER:ftp'
damit das was raus geht auch ne "richtige" Adresse bekommt

damit es auch wirklich klappt fehlt noch das Postrouting

PF_POSTROUTING_N='2'
PF_POSTROUTING_1='IP_NET_1 MASQUERADE'
PF_POSTROUTING_2='IP_NET_2 MASQUERADE'

Hier werden das LAN und die DMZ nach außen maskiert so das es aussieht als ob die Daten vom fli4l kommen. Besser wäre es, den Verkehr zwischen den lokalen Subnetzen von den Masquerading-Regeln auszunehmen. Die Dokumentation des base-Paketes verrät wie, hier mit IP_NET_3 als WAN-interface wäre es beispielsweise möglich, nur den Traffic, der über das WAN-Interface rausgeht, zu maskieren:

PF_POSTROUTING_N='1'
PF_POSTROUTING_1='if:any:IP_NET_3_DEV MASQUERADE'

Man kann noch sehr viel mehr absichern und anders machen, aber das sollte eine solide Basis sein.

IPv6

Da es sich bei IPv6 im Prinzip analog zu dem in IPv4 gesagtem verhält, präsentiere ich hier nur eben die Regeln. Das oben Erwähnte sollte man auch hier beachten:

Netze
IPV6_NET_N='3'

IPV6_NET_1='{xxx}::6:0:0:0:1/64'
IPV6_NET_1_DEV='IP_NET_1_DEV'
IPV6_NET_1_ADVERTISE='yes'
IPV6_NET_1_ADVERTISE_DNS='yes'
IPV6_NET_1_DHCP='yes'
 
IPV6_NET_2='{xxx}::7:0:0:0:1/64'
IPV6_NET_2_DEV='IP_NET_2_DEV'
IPV6_NET_2_ADVERTISE='yes'
IPV6_NET_2_ADVERTISE_DNS='yes'
IPV6_NET_2_DHCP='yes'
 
IPV6_NET_3='{xxx}::200:0:0:0:1/64'
IPV6_NET_3_DEV='IP_NET_3_DEV'
IPV6_NET_3_ADVERTISE='yes'
IPV6_NET_3_ADVERTISE_DNS='yes'
IPV6_NET_3_DHCP='yes'
dns_dhcp.txt
HOST_1_IP4='192.168.7.2'
HOST_1_IP6='auto'
HOST_1_MAC='xx:xx:xx:xx:xx:xx'
HOST_1_NAME='www'

HOST_2_IP4='192.168.7.3'
HOST_2_IP6='auto'
HOST_2_MAC='xx:xx:xx:xx:xx:xx'
HOST_2_NAME='mail'

HOST_3_IP4='192.168.7.4'
HOST_3_IP6='auto'
HOST_3_MAC='xx:xx:xx:xx:xx:xx'
HOST_3_NAME='ftp'

Bei IPv6 bietet es sich an mit den Hostnamen zu arbeiten, da sonst die Regeln doch ein wenig unübersichtlich werden, natürlich gehen auch hier einfach die IPs.

PF_FORWARD
PF6_FORWARD_N='4'
PF6_FORWARD_1='tmpl:samba DROP' 
PF6_FORWARD_2='if:IPV6_NET_1_DEV:any IPV6_NET_1 any ACCEPT'
PF6_FORWARD_3='IPV6_NET_2 IPV6_NET_1 REJECT'
PF6_FORWARD_4='if:IPV6_NET_2_DEV:IPV6_NET_3_DEV IPV6_NET_2 IPV6_NET_3 ACCEPT'

Beim PREROUTING gibt es jetzt 2 Möglichkeiten:

Die Erste ist die Server in der DMZ unter der IPv6 des fli4l erreichbar zu machen. Das wäre analog zum IPv4 Setup:

PF_PREROUTING
PF6_PREROUTING_N='6'
PF6_PREROUTING_1='tmpl:http dynamic DNAT:@www'
PF6_PREROUTING_2='tmpl:https dynamic DNAT:@www'
PF6_PREROUTING_3='tmpl:smtp dynamic DNAT:@mail'
PF6_PREROUTING_4='tmpl:pop3 dynamic DNAT:@mail'
PF6_PREROUTING_5='tmpl:imap dynamic DNAT:@mail'
PF6_PREROUTING_6='tmpl:ftp dynamic DNAT:@ftp'

Dann ist es aber auch noch möglich sofern die Server eine öffentliche IPv6 haben diese direkt erreichbar zu machen, dann allerdings unter der jeweiligen IP.

PF6_PREROUTING_N='6'
PF6_PREROUTING_1='tmpl:http if:IPV6_NET_3:IPV6_NET_2 any @www ACCEPT'
PF6_PREROUTING_2='tmpl:https if:IPV6_NET_3:IPV6_NET_2 any @www ACCEPT'
PF6_PREROUTING_3='tmpl:smtp if:IPV6_NET_3:IPV6_NET_2 any @mail ACCEPT'
PF6_PREROUTING_4='tmpl:pop3 if:IPV6_NET_3:IPV6_NET_2 any @mail ACCEPT'
PF6_PREROUTING_5='tmpl:imap if:IPV6_NET_3:IPV6_NET_2 any @mail ACCEPT'
PF6_PREROUTING_6='tmpl:ftp if:IPV6_NET_3:IPV6_NET_2 any @ftp ACCEPT'

auch hier die "Sonderlocke" für den FTP-Server.

 PF6_PREROUTING_CT_N='1'
 PF6_PREROUTING_CT_1='tmpl:ftp any dynamic HELPER:ftp'

Das Postrouting entfällt hier, da es bei IPv6 so nicht nötig ist.