Szenario
Ich möchte LXC auf dem Server zur Virtualisierung nutzten. Dabei möchte ich auch das vorgesehene lxc-net nutzen. Die anfängliche Einrichtung von LXC selbst ist schnell erledigt, damit dnsmasq für die DNS Auflösung von DNS aber einwandfrei läuft, sind einige Anpassungen notwendig. Des weiteren nutzte ich btrfs als Dateisystem um möchte später natürlich auch Subvolumes für die LXC-Container haben um diese wieder über Snapper sichern zu können.
Installation und Einrichtung von LXC.
Als erstes Installieren wir lxc und die btrfs-tools. Die btrfs-tools brauchen wird, damit wir bei erstellen von LXC-Container auch als Backend btrfs angeben können und diese in einem Subvolume erstellt werden.
apt install lxc btrfs-tools
Sicherstellen das bei der Installation alles gut gelaufen ist und lxc einsatzbereit ist, könnt ihr mit folgendem Befehl:
lxc-checkconfig
Solange Überall ‚enabled‚ steht könnt ihr weitermachen.
Nun müssen wir die Datei ‚/etc/default/lxc-net‘ anlegen und folgendes Hinterlegen.
USE_LXC_BRIDGE="true" #Die eigentliche Aktivierung LXC_BRIDGE="lxc" #Name des Virtuellen Devices. LXC_ADDR="10.0.0.1" #IP des Host im lxc-net LXC_NETMASK="255.255.255.0" LXC_NETWORK="10.0.0.0/24" LXC_DHCP_RANGE="10.0.0.100,10.0.0.254" LXC_DHCP_MAX="153" #LXC_DHCP_CONFILE="" LXC_DOMAIN="lxc" #Domain Name für die DNS Auflösung.
Nun noch den Befehl ’systemctl restart lxc-net‘ ausführen. Dadurch aktivieren die LXC Netzwerkbrücke. Ab jetzt ist es wichtig bei iptables aufzupassen. Nutzt man den Befehl ’netfilter-persistent save‘ werden nun auch temporäre Regeln von lxc-net mit gespeichert, die wir nicht persistent haben wollen. Im Zweifel müsst ihr die Datei unter ‚/etc/iptables/rules.v4‘ manuell von den lxc Einträgen bereinigen.
Jetzt müssen wir noch in der Datei ‚/etc/lxc/default.conf‘ den Eintrag ‚lxc.network.type = empty‘ entfernen/ändern und folgendes Hinterlegen:
lxc.network.type = veth lxc.network.link = lxc lxc.network.flags = up lxc.network.hwaddr = 00:16:4e:xx:xx:xx
Nun können wir unseren ersten LXC-Container erstellen:
lxc-create --bdev btrfs --template debian -n test
‚-B btrfs‘ sorgt dabei dafür das bei btrfs ein subvolume für den lxc Container genutzt wird. Nach dessen Erstellung können wir den mit Container mit ‚lxc-start -n test‘ starten. Wenn dies erfolgreich war, sollte uns ‚lxc-ls -f‘ folgendes ausgeben:
NAME STATE AUTOSTART GROUPS IPV4 IPV6 test RUNNING 0 - 10.0.0.100 -
Mit ‚lxc-attach -n test passwd‘ vergeben wir jetzt für den root Benutzer noch ein Passwort und können den Container mit ‚lxc-console -n test‘ nutzten.
Dnsmasq Anpassungen
Damit der Host die LXC-Container auch sauber auflösen kann, müssen wir dnsmasq anpassen. Lxc-net berücksichtigt dabei die Konfigurationsdatei unter ‚/etc/dnsmasq.conf‘ und es darf nicht das Paket ‚dnsmasq‘ Installiert werden. Da dessen Dienst sich mit Lxc-net beißt. Erstmal legen wir uns aber eine Kopie der ‚/etc/resolv.conf‘ Datei an. dnsmasq soll diese später nicht mehr nutzten, da wir Ihn dort selbst hinterlegen werden und dies sonst zu überflüssigen Log-Einträgen führt.
cp /etc/resolv.conf{,.dnsmasq}
Dies teilen wir dnsmasq mit in dem wir in dessen Konfiguration folgendes Hinterlegen:
… resolv-file=/etc/resolv.conf.dnsmasq … listen-address=127.0.0.1 …
Nun aktivieren wir das ‚/etc/dnsmasq.d‘ Konfigurationsverzeichnis damit wir die Konfigurationsdateien in getrennten Datei Pflegen können. Kommentiert dazu den folgenden Eintrag in der Datei ‚/etc/dnsmasq.conf‘ ein.
conf-dir=/etc/dnsmasq.d/,*.conf
Nun erstellen wir das Verzeichnis.
mkdir /etc/dnsmasq.d
Nun können wir später abweichende Konfigurationen für das lxc-net bspw. in der Datei ‚/etc/dnsmasq.d/lxc-net.conf‘ hinterlegen. Aktuell brauche wir das aber noch nicht.
Wir editieren nun erst mal die ‚/etc/resolv.conf‘ Datei und packen an dessen Anfang folgende Zeilen:
nameserver 127.0.0.1 search lxc …
Jetzt müssen wir noch mal mit ’systemctl restart lxc-net‘ dafür sorgen das dnsmasq neu gestartet wird. Anschließend können wir vom Host aus, die Namen der LXC-Container auflösen.
# nslookup test Server: 127.0.1.1 Address: 127.0.1.1#53 Name: test.lxc Address: 10.0.0.127 # nslookup test.lxc Server: 127.0.1.1 Address: 127.0.1.1#53 Name: test.lxc Address: 10.0.0.127
Abschluss
Das Setup hat den großen Vorteil das man so später dnsmasq weiter nutzten kann um seine DNS-Auflösung für andere Domain auch zu verändern. Die LXC-Container können Dynamisch mit Ihrem DNS Namen angesprochen werden. Was bei Vielen Konfigurationen hilfreich ist. Einzig iptables Regeln müssen bspw. weiterhin auf die IP zeigen. Dafür nutzte ich aber Innerhalb des lxc-net, später keepalived auf den LXC-Containern. Dies macht später auch das Wechseln auf einen anderen Container für Anwendungen einfacher.