So, ich habe mir einige Blogposts angesehen und auch die Hetzner Wiki verschlungen und nichts klappte so richtig.
Damit hat es geklappt:
Um das Grundlegende zu verstehen,
wir haben ein frisch aufgesetztes System das systemd nutzt und deshalb die ifaces z.B. enp5s0 oder eno1 nennt.
eth0, enp5s0, enp4s0, eno1 usw. ist hier in diesem Kontext das selbe.
Wir installieren also libvirt und qemu und kvm, alles damit wir ein lauffähiges System haben.
libvirtd läuft. qemu:///system ist ansprechbar.
virsh net-list zeigt default ist aktiv und autostartet
und wir haben ein iface das enp5s0 heist.
An diesem haben wir die öffentliche IPv4 und IPv6 aus dem zugewiesenen /64 Netz.
So, wir wollen aber das der Gast
1. eine IPv6 IP bekommt
2. die IPv6 IP sich nicht verändert
3. die IPv6 von außen erreichbar ist
4. die Außenwelt vom Gast erreichbar ist
Wie macht libvirt das?
Es nutzt dnsmasq.
DNSMASQ ist vieles, DNS Server, DHCP Server, DHCPv6 Server, TFTP Server. Gutes Zeug.
Wir brechen uns keinen ab sondern lassen dnsmasq die Arbeit für uns machen.
Warnung 24.04.2017: Die Firewall sollte, wenn dnsmasq alleine läuft Zugriffe per TCP und UDP auf Port 53 von außen blocken, da es sonst (abuse Meldung vom BSI) als open relay herhält der für DNS Reflection Angriffe herhalten kann.
/etc/sysctl.conf bzw. /etc/sysctl.d/ipv6.conf
1 |
net.ipv6.conf.all.forwarding=1 |
Aber zuerst erstellen wir ein BR0 interface. Eine Brücke.
Ich mach das mit dem NetworkManager und nmtui in der Konsole.
Beispiel mit enp5s0 als iface name:
1 2 3 4 5 |
nmcli con add type bridge con-name br0 ifname br0 nmcli con modify br0 bridge.stp no nmcli con modify br0 bridge.hello-time 0 nmcli con modify enp5s0 connection.master br0 connection.slave-type bridge systemctl restart network |
Es gibt viele Arten das zu machen.
systemd-networkd z.B.
Wie ihr das macht ist “out of scope” dieses Beitrags.
Ihr erstellt also ein BR0.
Jetzt kanns kompliziert werden, oder auch nicht.
Wenn ihr mit IPv4 verbunden seid müsst ihr zusehen das ihr euch mit IPv6 Verbindet.
– Ihr seid noch mit IPv4 verbunden über ssh
– Ihr erstellt eine ::3/64 IPv6 auf enp5s0
– Ihr löscht die ::2/64 IPv6 auf enp5s0
– Ihr logt euch aus und verbindet euch über die ::3/64 IPv6
– Ihr löscht die IPv4 von enp5s0
– Ihr weist die ::2/64 IPv6 und die IPv4 br0 zu, sowie macht enp5s0 zum br0 Sklaven.
– Ihr logt euch aus und verbindet euch über die ::2/64 IPv6
– Ihr löscht die ::3/64 IPv6 von enp5s0 und rebootet das ganze
Alternativ gehts auch mit LARA.
Wichtig ist einfach nur das br0 alle IP Adressen bekommt, die IPv4 und die ::2/64 IPv6 und enp5s0 keine eigene Adresse hat, sonst kann es nicht versklavt werden.
Ihr installiert nun dnsmasq.
dnsmasq.conf
1 2 3 4 5 6 7 8 9 10 |
#port=0 # Den Kommentar entfernen wenn Bind schon auf als DNS herhält und dnsmasq keine DNS funktionalität bieten soll bogus-priv # benötigt interface=br0 # benötigt bind-interfaces # benötigt expand-hosts # optional. Nur wirksam wenn DNS aktiv ist. domain=example.com # optional. Hier steht euer Hostname. dhcp-range=2a01:4f8:xxx:xxx::3, 2a01:4f8:xxx:xxx::ff, 64, 24h # benötigt enable-ra # benötigt dhcp-option=option6:dns-server,[2a01:4f8:0:a0a1::add:1010],[2a01:4f8:0:a102::add:9999],[2a01:4f8:0:a111::add:9898] # benötigt dhcp-authoritative # benötigt |
dnsmasq starten und freuen.
Wenn man den Host über virt-manager managet wählt man z.B. bridge br0.
virbr0 aka default kann weiterhin bestehen bleiben für den Fall das die Gäste untereinander privat kommunizieren wollen.
Wenn jetzt noch flannel IPv6 unterstützen würde wäre die Sache ideal. Bis es das tut kann man Calico verwenden, oder libreswan oder was auch immer ihr für VPN nutzt.
Hoffe gehelft zu haben