/server
Aus Dokumentation
Inhaltsverzeichnis |
Allgemeines
Ich habe die Erfahrung machen müssen, dass es leider nicht so sinnvoll ist, einen Desktop-PC irgendwo als Server unterzustellen (Serverhousing). Die einfachen Desktop-Systeme sind nicht für einen dauerhaften Serverbetrieb ausgelegt. Nach zwei Jahren ist die Hardware fertig - schade, aber man erspart sich viel ärger und ausfälle, wenn man gleich einen server mietet.
Virtualisierung
Um die Sicherheit des Systems zu erhöhen, habe ich die einzelnen Serverdienste getrennt - jeder Dienst läuft in einer eigenen virtuellen Maschine. Als Virtualisierungslösung setze ich auf KVM mit libvirt als unterbau.
Host-System
Auf dem Host läuft ausschließlich libvirt mit KVM und der Firewall.
- Minimalinstallation von Debian lenny
- Libvirt aus Testing (Version 0.8.1)
- KVM aus Testing (Version 0.12.4)
- virtinst (Zum einfachen installieren der virtuellen Maschinen).
- dnsmasq (als dhcp und dns-Server)
- ntpdate (Für genaue Zeit)
- screen
- nullmailer
- bridge-utils
nullmailer
Damit die System-Mails zugestellt werden können wird nullmailer verwendet. Die Konfiguration ist ganz einfach:
/etc/nullmailer/remotes:
<ip-adresse-des-mailservers> smtp --user=username --pass=password
/etc/nullmailer/adminaddr:
Mail_adresse_des_empfängers
/etc/mailname:
Mail_name_des_systems
dann nur noch ein /etc/init.d/nullmailer restart und fertig.
libvirt
Damit libvirt auf alle nötigen devices zugreifen kann habe ich libvirt als root laufen. Die Konfiguration ist entsprechend in /etc/libvirt/libvirtd.conf und /etc/libvirt/qemu.conf zu ändern. die optionen sind gut kommentiert und oftmals selbsterklärend.
Netzwerkkonfiguration
Alle virtuellen Maschinen sind in einer internen Bridge (br-int) zusammengefasst. das Skript bridge-skript.sh (Kann mit rechter Maustaste -> ziel speichern unter direkt gespeichert werden) legt die entsprechende Bridge an und gibt ihr die IP-Adresse 192.168.1.1 und setzt die route. Damit das Skript bei jedem Systemstart aufgerufen wird muss folgendes in /etc/network/interfaces eingetragen werden:
[...]
post-up /etc/network/bridge-skript.sh up
[...]
post-down /etc/network/bridge-skript.sh down
Damit forwarding funktioniert muss /proc/sys/net/ipv4/ip_forward auf 1 gesetzt werden. Am einfachsten in der datei /etc/sysctl.conf folgende Zeile auskommentieren:
net.ipv4.ip_forward=1
soweit, sogut. Jetzt sind iptables Regeln notwendig, um den virtuellen Maschinen zugriff aufs Internet zu geben.
Firewall / Iptables
Iptables ist ein Frontend, um Firewallregeln dem Kernel zu übergeben. Notwendig sind die Regeln, damit die virtuellen Maschinen auch ins Internet kommen - und umgekehrt durch Portforwarding die entsprechenden Ports zur jeweiligen Maschine weitergeleitet werden. Mein iptables-Skript sieht wie folgt aus:
#!/bin/bash
# Variablen setzen
EXINTERFACE='eth0'
BRIDGE='br-int'
IP1='78.46.94.109'
IP2='78.46.94.123'
IP3='78.46.94.124'
IP4='78.46.94.125'
# module laden:
modprobe ip_nat_ftp
modprobe ip_conntrack_ftp
# alle regeln loeschen
iptables --flush
iptables -t nat --flush
iptables -t mangle --flush
iptables -X
iptables -t nat -X
iptables -t mangle -X
# policy setzen
iptables --policy INPUT DROP
iptables --policy OUTPUT DROP
iptables --policy FORWARD DROP
# ipv6 sperren
ip6tables --policy INPUT DROP
ip6tables --policy OUTPUT DROP
ip6tables --policy FORWARD DROP
# erlaube traffic auf lo device
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# auch ipv6 erlauben
ip6tables -A INPUT -i lo -j ACCEPT
ip6tables -A OUTPUT -o lo -j ACCEPT
# erlaube WIRKLICH ALLE!!! ausgehenden verbindungen
iptables -A OUTPUT -j ACCEPT
# bekannte verbindungen erlauben
iptables -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -I FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
# erlaube ping
iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT
# masquerade fuer die virtuellen maschinen:
iptables -t nat -A POSTROUTING -s '192.168.1.0/24' -o ${EXINTERFACE} -j MASQUERADE
# weiterleitung in die kette forward:
iptables -A FORWARD -s '192.168.1.0/24' -o ${EXINTERFACE} -m state --state NEW -j ACCEPT
# aktiviere damit die Virtuellen maschinen das host-system erreichen koennen:
iptables -A INPUT -i ${BRIDGE} -j ACCEPT
iptables -A FORWARD -i ${BRIDGE} -j ACCEPT
# portweiterleitung auf virtuelle Maschinen!
# ssh-port auf mail:
iptables -t nat -A PREROUTING -d ${IP1} -p tcp -m tcp --dport 2222 -j DNAT --to-destination 192.168.1.3:2222
iptables -A FORWARD -p tcp --dport 2222 -i ${EXINTERFACE} -d 192.168.1.3 -j ACCEPT
# erlaube ssh auf dem Host-System:
iptables -A INPUT -p tcp --dport 22 -d ${IP1} -j ACCEPT
Hier werden zunächst alle eventuellen vorhandenen Regeln gelöscht und anschließend die Policy der Ketten gesetzt. Im nächsten Schritt wird dann alles was von und auf das locale Interface (lo) kommt erlaubt. Danach folgen Regeln, die für die virtuellen Maschinen der dreh und Angelpunkt sind! Ohne diese Regeln kommt keine Maschine über das Host-System hinaus!!! Im letzten Schritt werden dann die Portweiterleitungen festgelegt. Die zu beginn angegebenen Variablen sind entsprechend anzupassen.
VORSICHT!!!!!!!
Es muss zwingend noch der ssh-Port auf dem Host-System freigegeben werden! sonst sperrt man sich aus!
Damit diese Regeln beim booten des Systems automatisch geladen werden, trägt man sie in die datei /etc/rc.local ein.
