Zuerst richten wir einen DNS- und einen DHCP-Server für das interne Netzwerk ein. Dann folgt ein WEB-Server mit PHP und Python für das lokale Netz. Auch ein Proxy für APT darf nicht fehlen. Als nächste noch einen PXE-Server, und der verlangt noch nach einem NFS-Server.
Entsprechend gönnen wir diesem CT etwas mehr Speicher.
Oben Rechts im Proxmox-Frontend auf 'Create CT' klicken um den Container zu erstellen.
Die Dienste sind primär im virtuellen Netz, zusätzlich aber auch im internen. Also müssen wir noch die zweite Karte installieren.
Die Dienste müssen automatisch gestartet werden. Also die entsprechende Option aktivieren.
Die im CT, nicht die vom Host, also die "/Pool1/subvol-220-disk-1/etc/hosts"
127.0.0.1 localhost 62.2.169.220 dienste.local.comasys.ch 192.168.99.220 dienste.intern.comasys.ch dienste ::1 localhost ip6-localhost ip6-loopback ff02::1 ip6-allnodes ff02::2 ip6-allrouters
Und gleich mit SSH Auf den Container:
ssh root@192.168.99.220 -p55
Was ich hier schreibe, gilt für alle weiteren CT.
Ich gebe jeweils den Pfad für die Dateien im CT an,
natürlich können die auch auf dem Host geändert werden.
Vorallem für Maus-Schubser dürft das eine echte Alternative sein,
denn in den CT gibt es keine grafisch Oberfläche.
Wer mousdpad nutzen will, muss die Änderungen auf dem Host vornehmen.
Ist ganz einfach:
jeweils "/Pool1/subvol-#ID-disk-1/" voranstellen.
Und nochwas: ich empfehle, von den Dateien jeweils ein Backup zu erstellen. Ich habe mir angewöhnt die mit dem Suffix ".ORI" (für ORIginal) zu versehen.
apt-get install bind9
Die folgenden Dateien müssen ersetzt werden:
(was habe ich zu Backup vorhin geschrieben?)
options { directory "/var/cache/bind"; forwarders { 8.8.8.8; }; auth-nxdomain no; allow-query { 127.0.0.1; 192.168.0.0/16; }; };
Als Forwarder habe ich hier den öffentlichen DNS-Server von Google eingetragen. In der Regel dürfte aber der Internet-Router einen DNS-Server anbieten, der meist auch noch schneller antwortet. Falls später noch ein externer DNS-Server eingerichtet wird, bietet sich auch der als Forwarder an - gegebenenfalls muss dann sowohl hier (bind) als auch beim dhcp nochmals nachgebessert werden.
zone "intern.comasys.ch" { type master; file "/etc/bind/my-int-zone"; }; zone "99.168.192.in-addr.arpa" { type master; file "/etc/bind/my-int-reverse"; }; zone "local.comasys.ch" { type master; file "/etc/bind/my-loc-zone"; }; zone "0.168.192.in-addr.arpa" { type master; file "/etc/bind/my-loc-reverse"; };
$TTL 1D @ IN SOA intern.comasys.ch. meine.mail.adresse ( 20151101 ; serial (yyyymmdd) 3H ; refresh 15M ; retry 1W ; expire 1D ; minimum ttl ) IN MX 5 dienste.intern.comasys.ch. IN NS dienste.intern.comasys.ch. firewall IN A 192.168.99.230 web1 IN A 192.168.99.229 web2 IN A 192.168.99.227 mail IN A 192.168.99.228 dienste IN A 192.168.99.220 file IN A 192.168.99.222 sql IN A 192.168.99.247 proxmox1 IN A 192.168.99.248 $GENERATE 101-199 ws$ A 192.168.99.$
$TTL 1D @ IN SOA dienste.intern.comasys.ch. meine.main.adresse ( 20151101 3H 15M 1W 1D ) @ IN NS dienste.intern.comasys.ch. 230 IN PTR firewall.intern.comasys.ch. 229 IN PTR web1.intern.comasys.ch. 227 IN PTR web2.intern.comasys.ch. 228 IN PTR mail.intern.comasys.ch. 220 IN PTR dienste.intern.comasys.ch. 222 IN PTR file.intern.comasys.ch. 247 IN PTR sql.intern.comasys.ch. 248 IN PTR proxmox1.intern.comasys.ch. $GENERATE 101-199 $ PTR ws$.intern.comasys.ch.
$TTL 1D @ IN SOA local.comasys.ch. meine.mail.adresse ( 20151101 3H 15M 1W 1D ) IN MX 5 dienste.local.comasys.ch. IN NS dienste.local.comasys.ch. firewall IN A 192.168.0.230 web1 IN A 192.168.0.229 web2 IN A 192.168.0.227 mail IN A 192.168.0.228 dienste IN A 192.168.0.220 file IN A 192.168.0.222 $GENERATE 101-199 ws$ A 192.168.0.$
$TTL 1D @ IN SOA dienste.local.comasys.ch. meine.main.adresse ( 20151101 3H 15M 1W 1D ) @ IN NS dienste.local.comasys.ch. 230 IN PTR firewall.local.comasys.ch. 229 IN PTR web1.local.comasys.ch. 227 IN PTR web2.local.comasys.ch. 228 IN PTR mail.local.comasys.ch. 220 IN PTR dienste.local.comasys.ch. 222 IN PTR file.local.comasys.ch. $GENERATE 101-199 $ PTR ws$.local.comasys.ch.
domain intern.comasys.ch nameserver 127.0.0.1
Damit das ganze ohne Neustart funktionniert muss es in der "resolv.conf" eingetragen werden, für den nächsten Neustart auch in der "resolv.conf.OK".
Bind muss jetzt neu gestartet werden
service bind9 restart
Auf allen andern CT (derzeit nur die Firewall) und auch auf dem Master muss der neue Server eingetragen werden. Auch das Template sollte entsprechend angepasst und neu erstellt werden, denn dies gilt natürlich auch für alle weiteren neuen CT.
domain intern.comasys.ch nameserver 192.168.99.220
Gleicher Kommentar wie oben!
Testen können wir das mit einem "nslookup tobs.tips". Das Resultat müsse etwa so aussehen:
Server: 192.168.0.220 Address: 192.168.0.220#53 Non-authoritative answer: Name: tobs.tips Address: 212.254.31.41
Sowohl 'Server' als auch 'Address' müssen auf unseren eben eingerichten 192.168.99.220 zeigen.
apt-get install isc-dhcp-server
Achtung: 'dhcpd start' geht in die hosen, die config ist noch leer! Die entsprechende Fehlermeldung einfach ignorieren.
Datei komplett ersetzen durch:
server-name "dienste"; option domain-name "local.comasys.ch"; option broadcast-address 192.168.0.255; option routers 192.168.0.230; option netbios-node-type 8; option domain-name-servers 192.168.0.220, 8.8.8.8; ddns-update-style none; default-lease-time 7200; max-lease-time 14400; authoritative; allow booting; allow bootp; option arch code 93 = unsigned integer 16; option space pxelinux; option pxelinux.magic code 208 = string; option pxelinux.configfile code 209 = text; option pxelinux.pathprefix code 210 = text; option pxelinux.reboottime code 211 = unsigned integer 32; class "pxeclients" { match if substring (option vendor-class-identifier, 0, 9) = "PXEClient"; next-server 192.168.0.220; site-option-space "pxelinux"; if exists dhcp-parameter-request-list { option dhcp-parameter-request-list = concat(option dhcp-parameter-request-list,d0,d1,d2,d3); } if option arch = 00:06 { filename "/bootia32.efi"; option pxelinux.configfile "pxelinux.cfg/efi32"; } else if option arch = 00:07 { filename "/bootx64.efi"; option pxelinux.configfile "pxelinux.cfg/efi64"; } else { filename "/pxelinux.0"; option pxelinux.configfile "pxelinux.cfg/bios"; } } subnet 192.168.0.0 netmask 255.255.255.0 { range 192.168.0.101 192.168.0.199; option routers 192.168.0.230; }
Wem die etwas gross erscheint, der hat Recht! Es würde auch deutlich schlanker gehen, aber hier sind die für PXE/tftp notwendigen Einträge bereits vorhanden.
Der Dienst muss jetzt neu gestartet werden
service isc-dhcp-server restart
Testen können wir, indem wir einen Rechner an die bislang unverkabelte Netzwerk-Ksrte anschlissen. Der müsste eine IP im angegebenen Bereich erhalten und Zugriff auf das Internet haben.
Ich finde es praktisch, im internen Netz einen Web-Server mit PHP und Python zur Verfügung zu haben.
apt-get install php5-cli php5-gd php5-mcrypt php5-ldap php5-sqlite php5-mysql php-pear apache2 libapache2-mod-php5 libapache2-mod-python
Damit PHP auch mit der Kurzform "<?...?>" und nicht nur mit der Langform "<?php...php?>" funktionniert, muss nach der Zeile "short_open_tag = off" gesucht werden und auf "= on" geändert werden.
Komplett ersetzen durch:
(was habe ich zu Backup vorhin geschrieben?)
ServerName dienste. DirectoryIndex index.html index.php index.py index.htm AddHandler mod_python .py PythonHandler mod_python.publisher PythonDebug On <VirtualHost *:80> #ServerAdmin webmaster@localhost DocumentRoot /var/www/html ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost>
Jetzt den Indianer neu starten mit:
service apache2 restart
Debian installiert eine Standard-Seite. Die benennen wir mal um. Zusätzlich erstellen wir für PHP und Python je eine weiter.
Dazu wechseln wir ins Verzeichnis "/var/www/html" und benennen die "index.html" um nach "index.htm". Anschliessend erstellen wir folgende Dateien:
<p>HTML Test</p> <ul> <li> <a href='/index.php'>PHP Test</a> </li><li> <a href='/index.py'>Python Test</a> </li> </ul> <ul> </li> <a href='/index.htm'>Original Debian</a> </li> </ul>
<? echo "PHP Test"; ?>
def index(req): return "Python Test"
Sorry, kein 'DL' für diese Seiten, habe mühe mit den HTML-Tags, also bitte hier aus der Seite kopieren (anstelle von Ctrl-A einfach mit der Maus den Bereich markieren).
Im IceWeasel die Seite 192.168.99.220 öffnen,
unsere HTML-Seite sollte erscheinen.
Der PHP-Test
Der Python-Test
Und die Original-Seite
Jetzt noch testen, ob der Web-Server auch auf dem andern Netzwerk bereit steht: "http://192.168.0.220".
Hatten wir doch schon...
Nein, nicht wirklich. Jetzt geht es mir darum, die Web-Seiten aus dem CT rauszunehmen. Die nächsten Schritte finden NICHT im CT statt, sondern auf dem Host. Also schnell ein neues Terminal öffnen, und mit "su -" zum Chef werden.
Das Verzeichnis anlegen und die vorhandenen Daten aus dem CT verschieben:
mkdir /Pool1/220-WebServer mv /Pool1/subvol-220-disk-1/var/www/* \ /Pool1/220-WebServer
Folgende Zeile am Schluss anfügen:
lxc.mount.entry: /Pool1/DATA/220-WebServer var/www none bind 0 0
Damit dies auch aktiv wird, müssen wir den CT neu starten.
Weiter geht es wieder mit der SSH-Konsole auf dem CT.
Die Log-Files liegen noch auf dem CT, die hätte ich auch gerne auf dem Host. Dazu müssen wir die Zeile "export APACHE_LOG_DIR=" suchen und den Pfad durch "/var/www/LOGS$SUFFIX" ersetzen.
Jetzt noch das Verzeichnis erstellen, den Apache neu starten und das alte Log-Verzeichnis löschen:
mkdir -p /var/www/LOGS service apache2 restart rm -rf /var/log/apache2
Bitte unbedingt die obigen Test wiederholen!
Da wir mehrere Container haben, macht der apt-cache Sinn. Updates werden jeweils nur einmal übers Netz gezogen - alle andern können es dann vom lokalen Mirror holen.
apt-get install apt-cacher-ng
Und den Dienst mit "service apt-cacher-ng stop" gleich wieder stoppen.
Wir nutzen das oben für den Apache erstellte Verzeichnis. Falls Apache nicht installiert wurde, bitte das Verzeichnis auf dem Host anlegen und die 220.conf anpassen.
Den Dienst stoppen, das Verzeichnis erstellen, dessen Berechtigung anpassen, das vorinstallierte Verzeichnis löschen und einen Link erstellen.
mkdir /var/www/apt-cacher chown apt-cacher-ng.apt-cacher-ng /var/www/apt-cacher chmod 2755 /var/www/apt-cacher rm -rf /var/cache/apt-cacher-ng ln -sf ../www/apt-cacher-ng /var/cache/apt-cacher-ng
Damit alles funktionniert, müssen wir die config noch anpassen. In der Datei "/etc/apt-cacher-ng/security.conf" muss folgende Zeile ergänzt werden
AdminAuth: root:MeinPasswort
Damit ich die Config per wget auf die Clients bekomme, lege ich auf dem Web-Server das Config-File bereit:
Acquire::http::Proxy "http://192.168.0.220:3142";
Hiermit haben wir ein Beispiel für den Nutzen eines internen Web-Servers.
Auf allen bereits vorhandenen CT (auch auf dem hier) und auf dem Host muss jetzt der Proxy aktiviert werden:
cd /etc/apt/apt.conf.d wget 192.168.99.220/02proxy
Oder natürlich auf dem Host, mit
vorgestelltem "/Pool1/subvol-#ID-disk-1/".
Nicht vergessen: Auch auf dem Template + Template neu erstellen
Solange der neue Server noch in meinem Hausnetz ist, lasse ich den apt-cacher nicht direkt ins Netz, sondern er soll gefälligst beim bereits vorhandenen Proxy saugen.
(Ungefähr auf Zeile 50)
Die Zeilen mit "Proxy: a.b.c.d" sind auskommentiert.
Hier eine neuem aktive Zeile mit dem aktuellen Proxy ergänzen.
Vor dem ausliefern unbedingt wieder auskommentieren!!
Den Dienst mit "service apt-cacher-ng start" starten.
Auf dem Host im IceWeasel ist der Apt-Cacher jetzt
unter "http://192.168.99.220:3142" erreichbar.
Wenn der Proxy auch auf dem aktuellen CT konfigueriert ist, kann mit "apt-get update" getestet werden. Einerseits müssten die Dateien heruntergeladen werden, andererseits müsste unter /var/www/apt-cacher die Daten sichtbar werden.
Der gleiche Aufruf aus dem Host mit aktivem Proxy müsste - bis auf die vom proxmox-Repo - spürbar schneller laufen.
Mit IceWasel auf "http://192.168.99.220:3142/acng-report.html"
Nach einem Click auf "Count Data" sehen wir die Statistik
apt-get install tftpd-hpa
Die Daten stellen wir wieder auf den Host
rm -rf /srv/tftp mkdir -p /var/www/pxe-boot/{pxelinux.cfg,menus,isolinux,BUP} ln -sf ..//var/www/pxe-boot /srv/tftp
Debian-Netboot (64bit)
cd /srv/tftp wget http://ftp.debian.org/debian/dists/jessie/main/installer-amd64/current/images/netboot/netboot.tar.gz tar -xf netboot.tar.gz rm netboot.tar.gz
Den TFTP neu starten
service tftpd-hpa restart
Entweder wir starten am internen Netz einen Rechner über PXE, oder wir installieren eine VM die per PXE bootet. Für die zweite Variante bitte hier weiter.
Wenn alles klappt, müsste es etwa wie folgt aussehen
und kurz darauf
Somit wäre der PXE einsatzbereit. Wir können den Rechner oder die VM wieder ausschalten.
Jetzt geht es darum, eine Menu zu mit verschiedenen Boot-Optionen bereit zu stellen.
Zusätzlich zur 64bit-Version installieren wir jetzt auch noch die 32bit-Version.
cd /srv/tftp wget http://ftp.debian.org/debian/dists/jessie/main/installer-i386/current/images/netboot/netboot.tar.gz tar -xf netboot.tar.gz rm netboot.tar.gz
apt-get install syslinux
Jetzt ein neues Verzeichnis anlegen, einige Dateien von SysLinux kopieren, ins PXE-Verzeichnis wechseln, die PCI-IDS-Datenbank (für HDT) holen, MemTest (für HDT) holen, den Link für das pxelinux.cfg löschen, Verzeichnisse anlegen.
mkdir /srv/tftp/isolinux cd /usr/lib/syslinux cp -ar modules/{bios,efi32,efi64} /srv/tftp cp -a mbr/mbr.bin memdisk /srv/tftp cd /srv/tftp wget http://pciids.sourcforge.net/v2.2/pci.ids wget http://www.memtest.org/download/5.01/memtest86+-5.01.bin.bz.gz gunzip memtest86+-5.01.bin.bz.gz ln -sf memtest86+-5.01.bin.bz memtest rm pxelinux.cfg mkdir pxelinux.cfg menus cd pxelinux.cfg
Im Verzeichnis "pxelinux.cfg" erstellen wir 3 Dateien:
PATH /bios DISPLAY /menus/startup.bios INCLUDE /menus/menu.bios
PATH /efi32 DISPLAY /menus/startup.efi32 INCLUDE /menus/menu.efi32
PATH /efi64 DISPLAY /menus/startup.efi64 INCLUDE /menus/menu.efi64
Analog dazu erstellen wir im "menus" ebenso 3 Dateien:
INCLUDE /menus/default.inc MENU TITLE PXE Boot Menu (BIOS) MENU INCLUDE /menus/debnet32.mnu MENU INCLUDE /menus/debnet64.mnu MENU INCLUDE /menus/default.mnu
INCLUDE /menus/default.inc MENU TITLE PXE Boot Menu (EFI32) MENU INCLUDE /menus/debnet32.mnu MENU INCLUDE /menus/default.mnu
INCLUDE /menus/default.inc MENU TITLE PXE Boot Menu (EFI64) MENU INCLUDE /menus/debnet32.mnu MENU INCLUDE /menus/default.mnu
Hier sind die Farben und die Geometrie definiert:
UI menu.c32 DEFAULT menu.c32 PROMPT 0
HDT (Hardware Detection Tool) und BootDisk:
MENU SEPARATOR LABEL hdt MENU LABEL Hardware Detection Tool KERNEL hdt.c32 LABEL hd1 MENU LABEL Boot first HardDisk KERNEL chain.c32 APPEND hd0
Die beiden Debian Installer:
LABEL debiannetboot32 MENU LABEL Install Debian Jessie (i386) KERNEL vesamenu.c32 APPEND debian-installer/i386/boot-screens/menu.cfg
LABEL debiannetboot32 MENU LABEL Install Debian Jessie (amd64) KERNEL vesamenu.c32 APPEND debian-installer/amd64/boot-screens/menu.cfg
Wenn alles klappt, müsste der erste Schirm wie oben aussehen,
aber als zweites unser Menu erscheinen.
Den NFS-Server brauchen wir, weil einige Distributionen nach dem Start noch weitere Daten brauchen. Die werden in der Regel über NFS geholt.
Wichtig: der wird auf dem Host installiert!!
apt-get install nfs-server
wird komplett ersetzt
/Pool1/DATA/220-WebServer/pxe-boot 192.168.0.0/24(ro,sync,no_subtree_check) /Pool1/DATA/220-WebServer/pxe-boot/BUP 192.168.0.0/24(rw,sync,no_subtree_check,no_root_squash)
Freigabe erfolgt auf das echte Verzeichnis, nicht SymLink!
Wir erstellen auch noch ein neuen Verzeichnis - wozu? kommt später...
mkdir /Pool1/DATA/220-WebServer/pxe-boot/BUP chmod 777 /Pool1/DATA/220-WebServer/pxe-boot/BUP
Jetzt müssen wir noch die neu definierten Freigaben aktivieren:
exportfs -r
Vom Host aus müssten folgende ping erfolgreich sein
192.168.11.210 / 192.168.22.210 / 192.168.99.210
192.168.22.220 / 192.168.99.220
Mit traceroute ist sichtbar, dass die Firewall auf allen 3 Interfaces direkt erreichbar ist. Dienste nur auf dem internen, der Zugriff auf das lokale erfolgt über die Firewall und braucht somit 2 Hops.