Eine Reise - Online.net, IPv6 und LXC Container

Posted on Sun 09 October 2016 in lxc

Prolog

Einfach mal etwas Neues probieren. Das dachte ich mir vor einigen Wochen. Kurz gefasst: Fedora, HTTP2, Security überdenken, Systeme umziehen. Yeah!

Wo wir beim Systeme umziehen sind: Online.net ist für mich seit einiger Zeit der Hoster der Wahl. Günstig, aktuelle Systeme, stabil und die Performance stimmt auch. Nach einer kurzen Überlegung was ich alles benötige werden das Blog, Confluence und ein paar andere Dienste demnächst auf einer Dedibox Classic laufen.

Ziel

Am Ende steht das Ziel meherere voneinander abgekoppelte Systeme bereitzustellen, um verschiedene Dienste separiert zu betreiben. Die Möglichkeiten von Snapshots sollen verwendet werden, um zukünftige Hardware Umzüge einfach zu gestalten. Durch die Verwendung der abgekoppelten Systeme sollen zudem einfache OS Updates ermöglicht werden.

Die Systeme sollen öffentlich nur über IPv6 erreichbar sein. Zusätzlich sollen interne Dienste über ein separates Netz erreichbar sein.

Spielwiese Proxmox

Die 6 Systeme können einander beeinflussen und wollen getrennt werden, weshalb ich einen Blick auf Proxmox geworfen habe. Nach 2 Stunden und einigen ausgiebigen Fluchereien habe ich dann das System auf Fedora 24 neu installieren lassen.

Warum? Proxmox baut auf Debian auf. D.h. ein Standard SSH Daemon läuft, welcher nicht sauber abgesichert ist. Für Updates benötigt man mindestens eine nicht kostenfreie Community Lizenz, LXC Template Uploads schlagen fehl, wennn diese mit xz komprimiert sind, das IPv6 Bridging lässt sich (zumindest bei Online.net) nicht konfigurieren, ohne das die Konfiguration wieder verloren geht. Zusätzlich finde ich die Oberfläche nicht wirklich intuitiv, schnell und brauchbar.

LXC - was, bitte?

LXC, die Linux Container laufen direkt im Kernel. Ohne Hypervisor. Das bedeutet, dass diese nicht für alle Anwendungsfälle sinnvoll sind. Beispielsweise kann damit kein Windows gestartet werden. Allerdings benötigen diese Container weniger Ressourcen, da keine Hardware emuliert werden muss. Für Details sei dieser Sysadmin Cast empfohlen.

Der Weg zum ersten Container

LXC Setup

Unter Fedora 24 werden die Abhängigkeiten in LXC wie folgt installiert:

# yum install debootstrap perl libvirt lxc lxc-templates

Im Anschluss sollten sowohl libvirtd als auch lxc gestartet werden und für die Ausführung beim Systemstart aktiviert werden:

# systemctl start lxc.service
# systemctl start libvirtd 
# systemctl enable lxc.service
# systemctl enable libvirtd

Im Anschluss werden zwei neue Netze verfügbar sein:

# ip a
...
4: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
    link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
    inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
       valid_lft forever preferred_lft forever
5: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc fq_codel state DOWN group default qlen 1000
    link/ether 52:54:00:4f:97:60 brd ff:ff:ff:ff:ff:ff

Auffällig ist, dass diese beide als DOWN markiert werden. Das ändert sich, sobald diese aktiv von einem Container verwendet werden. Den Status prüft man zusätzlich besser mit den libvirt-Tools:

virsh net-list --all
 Name                 State      Autostart     Persistent
----------------------------------------------------------
 default              active     yes           yes

Im Anschluss kann über den Befehl lxc-checkconfig und dessen Ausgabe überprüft werden, ob alle Voraussetzungen erfüllt sind, um einen Container zu erstellen und zu starten.

Erstellen eines Containers & Grundkonfiguration

Durch die Installation des Paketes lxc-templates stehen bereits viele Templates zur Verfügung:

# ls -al /usr/share/lxc/templates/
total 412
drwxr-xr-x 2 root root  4096 Oct  8 23:40 ./
drwxr-xr-x 6 root root  4096 Oct  8 23:40 ../
-rwxr-xr-x 1 root root 13033 Aug 16 16:23 lxc-alpine*
-rwxr-xr-x 1 root root 13713 Aug 16 16:23 lxc-altlinux*
-rwxr-xr-x 1 root root 11090 Aug 16 16:23 lxc-archlinux*
-rwxr-xr-x 1 root root 12159 Aug 16 16:23 lxc-busybox*
-rwxr-xr-x 1 root root 29503 Aug 16 16:23 lxc-centos*
-rwxr-xr-x 1 root root 10374 Aug 16 16:23 lxc-cirros*
-rwxr-xr-x 1 root root 20180 Aug 16 16:23 lxc-debian*
-rwxr-xr-x 1 root root 17890 Aug 16 16:23 lxc-download*
-rwxr-xr-x 1 root root 49600 Aug 16 16:23 lxc-fedora*
-rwxr-xr-x 1 root root 28384 Aug 16 16:23 lxc-gentoo*
-rwxr-xr-x 1 root root 13868 Aug 16 16:23 lxc-openmandriva*
-rwxr-xr-x 1 root root 15932 Aug 16 16:23 lxc-opensuse*
-rwxr-xr-x 1 root root 41992 Aug 16 16:23 lxc-oracle*
-rwxr-xr-x 1 root root 11570 Aug 16 16:23 lxc-plamo*
-rwxr-xr-x 1 root root 19250 Aug 16 16:23 lxc-slackware*
-rwxr-xr-x 1 root root 26862 Aug 16 16:23 lxc-sparclinux*
-rwxr-xr-x 1 root root  6862 Aug 16 16:23 lxc-sshd*
-rwxr-xr-x 1 root root 25602 Aug 16 16:23 lxc-ubuntu*
-rwxr-xr-x 1 root root 11439 Aug 16 16:23 lxc-ubuntu-cloud*

Mein Hostsystem baut bereits auf Fedora auf. Daas soll auch für meine Gastsysteme gelten, sodass ich einen Container auf Fedora Basis mit dem Namen reducto erstelle:

# lxc-create -n reducto -t fedora

Nach wenigen Minuten sind alle Abhängigkeiten heruntergeladen und der Container gebaut.

Wichtig ist das Ausgabe am Ende. Hier wird auf das Root-Kennwort hingewiesen, welches beim ersten Login verwendet werden muss!

Beim ersten Start sollte man einen Pfad angeben, damit ein Log geschrieben wird:

# lxc-start -n reducto --logfile=lxclog.log
# cat lxclog.log
lxc-start 20161008235436.072 ERROR    lxc_conf - conf.c:instantiate_veth:2596 - failed to attach 'veth5TF2CV' to the bridge 'lxcbr0': Operation not permitted
lxc-start 20161008235436.086 ERROR    lxc_conf - conf.c:lxc_create_network:2882 - failed to create netdev
lxc-start 20161008235436.086 ERROR    lxc_start - start.c:lxc_spawn:1081 - failed to create the network
lxc-start 20161008235436.086 ERROR    lxc_start - start.c:__lxc_start:1354 - failed to spawn 'reducto'
...

Es wird also auf die Bridge mit dem Namen lxcbr0 verwiesen? Wo soll die denn versteckt sein? Wir wollen doch virbr0 verwenden!

Zuerst sollte das Standard Interface für neue Container in der Datei /etc/lxc/default.conf angepasst werden:

lxc.network.link = virbr0

Im Anschluss kann die Konfiguration des Containers angepasst werden:

# vi /var/lib/lxc/reducto/config
lxc.network.type = veth
lxc.network.link = virbr0
lxc.network.name = eth0
lxc.network.hwaddr = fe:61:2c:xx:xx:xx
lxc.network.ipv4=192.168.122.2/24
lxc.network.flags = up

Anpassung des libvirt-Interfaces

In diesem Fall möchte ich eine statische IP verwenden. Damit das auch innerhalb des Containers möglich ist muss zusätzlich die DHCP Konfiguration des virbr0-Interfaces angepasst werden:

# virsh net-edit default
      <range start='192.168.122.2' end='192.168.122.254'/>
## Anpassung nach:
      <range start='192.168.122.20' end='192.168.122.254'/>

Nach einem Neustart von libvirtd mit systemctl restart libvirtd.service vergibt der mitgelieferte DHCP Server nur noch IPs ab .20, sodass die Adressen .2-.19 für die statische Vergabe zur Verfügung stehen.

Erster Start des Containers

Die Grundkonfiguration ist nun abgeschlossen, sodass der Container zum ersten Mal gestartet werden kann. Ganz ohne Fehlermeldungen. Der Parameter -d gibt dabei an, dass der Start im Hintergrund passiert. Im Anschluss kann mit lxc-info geprüft werden, ob der Container läuft und eine Shell mit lxc-attache geöffnet werden:

# lxc-start --name=reducto
# lxc-info --name reducto
Name:           reducto
State:          RUNNING
PID:            7295
...
# lxc-attach --name=reducto
[root@reducto ~]#

Um die feste IP innerhalb des Containers zu konfigurieren kann eine Netzwerkkonfiguration wie folgt aussehen:

# vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=static
ONBOOT=yes
HOSTNAME=reducto
NM_CONTROLLED=no
TYPE=Ethernet
IPV4_FAILURE_FATAL=no
IPADDR=192.168.122.2
PREFIX=24
GATEWAY=192.168.122.1
DEFROUTE=yes
IPV6INIT="no"
MTU=

Ausblick

An diesem Punkt hat man einen Container der über das Hostsystem erreichbar ist und dessen Verbindung Richtung Internet mit verwendet. Damit ist es möglich "mal eben" etwas zu testen.

Die Einrichtung mit einer statischen IPv6 bei Online.net wird ein zweiter Artikel.