Zurück  

Dienste

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.

bild

bild

bild

bild

bild

bild

bild

bild

bild

Netzwerk

Die Dienste sind primär im virtuellen Netz, zusätzlich aber auch im internen. Also müssen wir noch die zweite Karte installieren.

eth1 (neu)

bild

Auto-Start

Die Dienste müssen automatisch gestartet werden. Also die entsprechende Option aktivieren.

bild

Grund-Konfiguration

etc/host.OK

Die im CT, nicht die vom Host, also die "/Pool1/subvol-220-disk-1/etc/hosts"

DL
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

Container Starten

Und gleich mit SSH Auf den Container:

DL
ssh root@192.168.99.220 -p55

Vorwort

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.

DNS-Server (Bind)

DL
apt-get install
 bind9

Die folgenden Dateien müssen ersetzt werden:
(was habe ich zu Backup vorhin geschrieben?)

/etc/bind/named.conf.options

DL
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.

/etc/bind/named.conf.local

DL
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";
};

/etc/bind/my-int-zone

DL
$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.$

/etc/bind/my-int-reverse

DL
$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.

/etc/bind/my-loc-zone

DL
$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.$

/etc/bind/my-loc-reverse

DL
$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.

/etc/resolv.conf & /etc/resolv.conf.OK

DL
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".

Neustart

Bind muss jetzt neu gestartet werden

DL
service bind9 restart

Host und andere CT anpassen

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.

DL
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:

DL
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.

DHCP-Server

DL
apt-get install
 isc-dhcp-server

Achtung: 'dhcpd start' geht in die hosen, die config ist noch leer! Die entsprechende Fehlermeldung einfach ignorieren.

/etc/dhcp/dhcpd.conf

Datei komplett ersetzen durch:

DL
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.

Web-Server (Apache)

Ich finde es praktisch, im internen Netz einen Web-Server mit PHP und Python zur Verfügung zu haben.

DL
apt-get install
 php5-cli
 php5-gd
 php5-mcrypt
 php5-ldap
 php5-sqlite
 php5-mysql
 php-pear
 apache2
 libapache2-mod-php5
 libapache2-mod-python

/etc/php5/apache2/php.ini

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.

/etc/apache2/sites-available/000-default.conf

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:

DL
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:

index.html

<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>

index.php

<?
echo "PHP Test";
?>

index.py

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).

Test

Im IceWeasel die Seite 192.168.99.220 öffnen, unsere HTML-Seite sollte erscheinen.
Bild

Der PHP-Test
Bild

Der Python-Test
Bild

Und die Original-Seite
Bild

Jetzt noch testen, ob der Web-Server auch auf dem andern Netzwerk bereit steht: "http://192.168.0.220".

Apache Konfiguration

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:

DL
mkdir /Pool1/220-WebServer
mv /Pool1/subvol-220-disk-1/var/www/* \
   /Pool1/220-WebServer

/etc/pve/lxc/220.conf

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.

/etc/apache2/envvars

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:

DL
mkdir -p /var/www/LOGS
service apache2 restart
rm -rf /var/log/apache2

Test

Bitte unbedingt die obigen Test wiederholen!

Apt-Cache

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.

DL
apt-get install
 apt-cacher-ng

Und den Dienst mit "service apt-cacher-ng stop" gleich wieder stoppen.

Konfiguration

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.

DL
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:

/var/www/html/02proxy

DL
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:

DL
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

Proxy-Kaskade

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.

/etc/apt-cacher-ng/acng.conf

(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.
Bild

Testen

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.

Statistik

Mit IceWasel auf "http://192.168.99.220:3142/acng-report.html"
Bild
Nach einem Click auf "Count Data" sehen wir die Statistik
Bild

PXE (Preboot Execution Environment)

DL
apt-get install
 tftpd-hpa

Die Daten stellen wir wieder auf den Host

DL
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)

DL
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

Erster Test

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
Bild
und kurz darauf
Bild

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.

Debian-Netboot (32bit)

Zusätzlich zur 64bit-Version installieren wir jetzt auch noch die 32bit-Version.

DL
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

SysLinux

DL
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.

DL
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:

bios

DL
PATH /bios
DISPLAY /menus/startup.bios
INCLUDE /menus/menu.bios

efi32

DL
PATH /efi32
DISPLAY /menus/startup.efi32
INCLUDE /menus/menu.efi32

efi64

DL
PATH /efi64
DISPLAY /menus/startup.efi64
INCLUDE /menus/menu.efi64

Analog dazu erstellen wir im "menus" ebenso 3 Dateien:

menu.bios

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

menu.efi32

INCLUDE /menus/default.inc
MENU TITLE PXE Boot Menu (EFI32)
MENU INCLUDE /menus/debnet32.mnu
MENU INCLUDE /menus/default.mnu

menu.efi64

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:

default.inc

DL
UI menu.c32
DEFAULT menu.c32
PROMPT 0

HDT (Hardware Detection Tool) und BootDisk:

default.mnu

DL
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:

debnet32.mnu

DL
LABEL debiannetboot32
    MENU LABEL Install Debian Jessie (i386)
    KERNEL vesamenu.c32
    APPEND debian-installer/i386/boot-screens/menu.cfg

debnet64.mnu

DL
LABEL debiannetboot32
    MENU LABEL Install Debian Jessie (amd64)
    KERNEL vesamenu.c32
    APPEND debian-installer/amd64/boot-screens/menu.cfg

Zweiter Test

Wenn alles klappt, müsste der erste Schirm wie oben aussehen, aber als zweites unser Menu erscheinen.
Bild

NFS Server

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!!

DL
apt-get install
 nfs-server

/etc/exports

wird komplett ersetzt

DL
/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...

DL
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

Test der Firewall

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.

Zurück