In diesem Tutorial werden wir unseren LXC-Container eine IP aus unserem LAN vergeben. Somit ist es möglich unsere Container direkt von extern anzusprechen.
Voraussetzung für dieses Tutorial ist ein installiertes und lauffähiges libvirt-Setup. Ein detaillierte Anleitung findet man in dem Artikel Centos 7 im LXC-Container. Dieser dient uns auch als Grundlage für dieses HowTo.
Anpassen der Netzwerkkonfiguration
Zuerst benötigen wir eine Bridge (br0). In diese binden wir unser primäres Netzwerk-Interface ein, also die Netzwerkkarte mit der wir auch mit unserem LAN verbunden sind. Die virtuellen NICs der LXC-Container die eine externe IP bekommen sollen werden dann dieser Bridge hinzugefügt. Alle andern kommen in das interne Netz, also in die Bridge (virbr0).
Netzwerkbrücke konfigurieren (br0)
In diesem Scenario heisst die physisch echte Netzwerkkarte enp2s0f5 dies kann je nach Hardware unterschiedlich sein.
Zuerst erstellen wir eine Netzwerkbrücke br0. Dazu erstellen wir eine Konfigurationsdatei /etc/sysconfig/network-scripts/ifcfg-br0.
vi /etc/sysconfig/network-scripts/ifcfg-br0
dort fügen wir die gewünschte Netzwerkkonfiguration ein. Dies können die gleichen IP-Adressen sein die derzeit für die physische Schnittstelle konfiguriert sind.
DEVICE=br0 TYPE=Bridge DEFROUTE=yes IPV4_FAILURE_FATAL=no IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_FAILURE_FATAL=no IPV6_PEERDNS=yes IPV6_PEERROUTES=yes IPADDR0=192.168.1.20 NETMASK=255.255.255.0 GATEWAY=192.168.1.1 DNS1=192.168.1.1 DNS2=8.8.8.8 ONBOOT=yes BOOTPROTO=none NM_CONTROLLED=no DELAY=0 STP=yes
Unserer physischen Netzwerkkarte sagen wir nun, dass diese zur Netzwerkbrücke gehört und geben ihr keine IP-Adresse. Diese wird jetzt in der Brücke definiert.
Dazu editieren wie die Datei /etc/sysconfig/network-scripts/ifcfg-enp2s0f5.
vi /etc/sysconfig/network-scripts/ifcfg-enp2s0f5
und fügen folgende Konfiguration ein.
TYPE=Ethernet BOOTPROTO=none IPV4_FAILURE_FATAL=no NAME=enp2s0f5 UUID=fbf03542-6e15-42bf-bcb6-7e063e23202b ONBOOT=yes BRIDGE=br0
Das war es schon. Um die Konfiguration der zweiten Brücke brauchen wir uns nicht kümmern, diese wird bei der Installation von libvirt schon angelegt. Nach einen Neustart des Netzwerkdienstes oder Reboot sollte wir mit brctl show unser neues Setup kontrollieren können.
brctl show
bridge name bridge id STP enabled interfaces br0 8000.80ee730a228d yes enp2s0f5 virbr0 8000.525400e31835 yes virbr0-nic
Nun haben wir die Grundvorraussetzung für die Konfiguration von libvirt geschaffen. Wir haben 2 Netzwerkbrücken, jeweils für das externe Netzwerk br0 und für das interne virtuelle Netzwerk virtbr0.
externes Netzwerk in libvirt erstellen
Dazu erzeugen wir uns eine temporäre Datei extern.xml.
vi /tmp/extern.xml
Dort definieren wir den Namen und die Netzwerkbrücke.
<network> <name>extern</name> <forward mode='bridge'/> <bridge name='br0' /> <mac address='12:54:00:17:9:12'/> <uuid>48f0b4fb-48c7-41b4-acbf-91df582b9637</uuid> </network>
Eine zufällige MAC-Adressen können wir folgendermaßen erzeugen.
openssl rand -hex 6 | sed 's/\(..\)/\1:/g; s/.$//'
Eine zufällige UUID bekommen wir so.
cat /proc/sys/kernel/random/uuid
Jetzt binden wir unser Netzwerk in libvirt ein. Dazu starten wir die Verwaltungskonsole virsh.
virsh
Wir können uns alle bestehenden Netzwerke anzeigen lassen.
virsh # net-list
Name Status Automatischer Start Dauerhaft ---------------------------------------------------------- default Aktiv ja ja
Unser externes Netzwerk fügen wir nun hinzu.
virsh # net-define /tmp/extern.xml
Nun starten wir das neue externe Netzwerk.
net-start extern
Wir können dies nun wieder anzeigen lassen.
virsh # net-list
Name Status Automatischer Start Dauerhaft ---------------------------------------------------------- default Aktiv ja ja extern Aktiv nein ja
Zum Autostart fügen wir es wie folgt hinzu.
virsh # net-autostart extern
libvirt LXC-Container mit externer IP erstellen
Beim Erstellen eines neuen Containers kann nun mit dem Parameter –network network:extern unser neues Netzwerk ausgewählt werden.
virt-install --connect lxc:/// --name centos-7-x86_64 --ram 512 --vcpu 1 --filesystem /var/lib/libvirt/lxc/centos-7-x86_64/,/ --noautoconsole --network network:extern
Innerhalb des LXC Containers kann alles wir gewohnt konfiguriert werden. DHCP falls gewünscht bekommt der LXC Container nun vom externen Router nicht mehr von libvirt.
Fazit
Ich weise nochmal darauf hin, dass sich dieses Tutorial auf meine Testumgebung bezieht. Ein stumpfes Abtippen wird nicht zum Erfolg führen :D
Es ist ratsam, sich nochmal die Dokumentation von libvirt zu diesem Thema anzusehen.
Fragen dazu können gern in den Kommentaren gestellt werden.
Ein Kommentar