Eine DMZ kann auch mit nur einem Gateway/Router/Firewall realisiert werden. Entscheidend ist, dass LAN und DMZ getrennte Netze bilden.
In einer Klassischen DMZ laufen Dienste, die von aussen erreichbar sein müssen - sprich die DMZ ist potentiell "feindlichem" Traffic ausgesetzt und wird daher vom sicheren Netz (LAN) getrennt.
Lokale Dienste werden entweder direkt im LAN angeboten oder in einer lokalen DMZ (LDMZ).
Um solche Netzwerkstrukturen sinnvoll/überhaupt aufzubauen sind VLANs unverzichtbar (=VLAN-fähige switches mit egress-filter); notfalls muss für jede Zone zumindest eine eigene NIC und ggf ein eigener Switch verwendet werden.
Thema Virtualisierung:
Mit Softwarevirtualisierung wirst du eher nicht glücklich. Solange du kein Windows anbieten musst, sind VMs (Hardware-Virtualisierung) der falsche Weg. Der Overhead übersteigt meistens den Ressourcenbedarf der eigentlichen Dienste in so kleinen Anwendungsfällen. Ganz zu schweigen vom Wartungsaufwand wenn für jeden Dienst ein komplettes eigenes System läuft...
Unter Linux bleibt aktuell eigentlich nur LXC/Docker. Ggf mit vagrant für "einfacheres" management. Unterm Strich ist aber jede LXC/Docker Installation immer noch (unnötig) komplex, wirkt immer wüst zusammengeschustert und ist sicherheitstechnisch eine ziemliche Katastrophe (my 2 cents). Zudem hat man hier wieder praktisch "einzelne Systeme" die alle einzeln gewartet werden müssen.
Deutlich eleganter und _viel_ einfacher zu verwalten sind Jails mit FreeBSD - kombiniert mit ZFS ist das unglaublich schlank, flott und mit iocage[1] ziemlich simpel zu verwalten/pflegen. Alle Einstellungen sind als attribute des ZFS-Datensatz gespeichert; Jails können daher absolut simpel und schnell per ZFS send/receive repliziert werden, z.B. auf ein neues System, für Backups oder für Hochverfügbarkeit in kombination mit CARP.
Overhead auf der Platte (ohne deduplikation) sind i.d.r. 50-200MB; Speicher wird praktisch nur von den Anwendungen die im Jail laufen benötigt, den Rest stellt das Hostsystem bereits. Upgrades auf das base-jail werden automatisch und sofort ohne downtime auf alle anderen jails propagiert. Da man Jails mit ZFS in sekundenbruchteilen klonen kann (alles per iocage möglich!), sind auch selektive Upgrades oder tests einfach durchzuführen. Gerade für owncloud (oder auch Wordpress) ist das praktisch, da sich diese gerne mal bei upgrades komplett zerlegen...
Jail klonen, den Klon updaten und ggf manuelle anpassungen vornehmen, die IP von "altem" zu "neuem" jail switchen - fertig. Die eigentlichen Daten für owncloud liegen idealerweise auf einem NFS-share oder einem weiteren ZFS-Datensatz und werden (automatisch) ins "neue" jail übernommen.
Auf meinem Gateway zuhause (WAN,LAN,WLAN (=2VLANs privat/gäste), DMZ) laufen BIND, DHCP und tor (4 nodes) jeweils in eigenen Jails. Hardware ist ein alter 1U Server mit Celeron D 340 mit 6GB RAM und 60GB SSD. RAM-Verbrauch liegt zu Spitzenzeiten bei knapp über 50%; die CPU wird im normalen Betrieb praktisch nie wirklich beansprucht - nen eigenen Kernel bauen dauert aber etwas länger
Backups bestehen aus einfachem ZFS send/receive via amanda-script zum Storageserver. Das sind nach der ersten vollständigen Replikation nur noch wenige MB am Tag.
[1]
http://iocage.readthedocs.io/en/latest/index.html#