Linux VM mit "bhyve"

foxit

Well-Known Member
Hallo,

Ich habe in der letzten Woche mal "bhyve" angeschaut und jetzt ein paar Fragen. Ich habe dazu "FreeBSD 10.0-RELEASE-p9 amd64" verwendet. Mein Testrechner hat 2 Netzwerkkarten. Beide sind auf das internen Netz gesteckt. Der Host bekommt über die NIC 1 per DHCP eine IP Adresse. Die zweite NIC ist nicht konfiguriert und wird als "bridge" für "bhyve" verwendet. [1]:
Code:
ifconfig tap0 create
sysctl net.link.tap.up_on_open=1
ifconfig bridge0 create
ifconfig bridge0 addm re1 addm tap0
ifconfig bridge0 up
Damit klappt es ohne Probleme und ich kann ein Debian Linux installieren und starten. Die VM bekommt über die NIC2 (re1) vom DHCP eine IP Adresse. Jetzt zu meinem Problem.

Auf dem Host sind noch zusätzlich 4 Jails eingerichtet welche auf "lo1" konfiguriert sind. Diese haben die IP's "10.0.0.X/29". Ich würde jetzt gerne das gleiche mit "bhyve" umsetzen wollen. Sprich die Linux VM soll eine IP "10.0.0.X/29" erhalten und von aussen nur über NIC1 (re0) erreichbar sein. Dies dann natürlich nur über die Port welche ich via PF öffne, so wie ich sie auch mit den Jails mache.

Leider habe ich jetzt keine Idee, wie ich das am Besten umsetzen könnte.

Danke
Gruss

[1] https://www.freebsd.org/doc/handbook/virtualization-host-bhyve.html
 
Also ich würde es so machen, bzw. habe es so auf meinem Notebook umgesetzt (leider aus dem Gedächtnis aufgeschrieben, komme gerade nicht an die Konfiguration):

/etc/rc.conf:
Code:
autobridge_interfaces="bridge0"
autobridge_bridge0="tap*" # Alle tap Devices zur Bridge hinzufügen
cloned_interfaces="bridge0 tap0 tap1 tap2 tap3 tap4"  # tap0-4 für bhyve und die 4 Jails
ifconfig_bridge0="inet 10.0.0.1/29"

gateway_enable="YES" # Zum Routen zwischen den Interfaces

Relevantes aus /etc/pf.conf:
Code:
set skip on tap

nat on bridge0 from 10.0.0.0/29 to any ->(bridge0:0)

Dann _sollte_ das mit manueller Netzwerkkonfiguration schon klappen. In den Jails bzw. den virtuellen Maschinen gibst du dann die 10.0.0.1 (IP von bridge0) als default router an und vergibst ne IP zwischen 10.0.0.2 und 10.0.0.6.

Oder du machst es dir etwas einfacher und installierst auf dem Host net/dnsmasq:

/usr/local/etc/dnsmasq.conf:
Code:
domain-needed
bogus-priv
interface=bridge0
dhcp-range=10.0.0.2,10.0.0.6,12h

/usr/local/etc/dnsmasq.conf:
Code:
conf-file=/etc/dnsmasq-conf.conf
resolv-file=/etc/dnsmasq-resolv.conf

/etc/resolvconf.conf:
Code:
name_servers=127.0.0.1
dnsmasq_conf=/etc/dnsmasq-conf.conf
dnsmasq_resolv=/etc/dnsmasq-resolv.conf

Mit der Konfiguration fungiert dnsmasq dann als DHCP Server für die Jails und bhyve und auch als DNS Server für diese und den Host selbst. Das charmante bei der Lösung ist, dass sich alle Maschinen untereinander mit Namen ansprechen lassen, vom Jail zu bhyve, bhyve zum Host, etc.


Disclaimer: Die Config war jetzt nur so heruntergetippt und nicht auf Fehler getestet. Heute Abend kann ich mal meine Produktivkonfiguration zeigen. Das Ganze wurde übrigens inspiriert vom bhyve Artikel im aktuellen FreeBSD Journal: https://www.freebsdfoundation.org/journal
 
Also ich würde es so machen, bzw. habe es so auf meinem Notebook umgesetzt
Ich habe deinen Vorschlag jetzt mal versucht umzusetzen. Das hier ist jetzt meine Konfiguration. Ich habe den IP Bereich auf "/24" geändert!

/etc/rc.conf
Code:
autobridge_interfaces="bridge0"
autobridge_bridge0="tap*"
cloned_interfaces="bridge0 tap0 tap1 tap2 tap3 tap4"
ifconfig_bridge0="inet 10.0.0.1/24"
gateway_enable="YES"

/etc/pf.conf
Code:
set skip on lo0
set skip on tap0

nat on bridge0 from 10.0.0.0/24 to any -> (bridge0:0)

ifconfig
Code:
bridge0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        ether xxxxxxxxxxxxxx
        inet 10.0.0.1 netmask 0xffffff00 broadcast 10.0.0.255 
        nd6 options=9<PERFORMNUD,IFDISABLED>
        id 00:00:00:00:00:00 priority 32768 hellotime 2 fwddelay 15
        maxage 20 holdcnt 6 proto rstp maxaddr 2000 timeout 1200
        root id 00:00:00:00:00:00 priority 32768 ifcost 0 port 0
        member: tap4 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
                ifmaxaddr 0 port 9 priority 128 path cost 2000000
        member: tap3 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
                ifmaxaddr 0 port 8 priority 128 path cost 2000000
        member: tap2 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
                ifmaxaddr 0 port 7 priority 128 path cost 2000000
        member: tap1 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
                ifmaxaddr 0 port 6 priority 128 path cost 2000000
        member: tap0 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
                ifmaxaddr 0 port 5 priority 128 path cost 2000000
tap0: flags=8942<BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=80000<LINKSTATE>
        ether xxxxxxxxxxxxxx
        nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
        media: Ethernet autoselect
        status: active
        Opened by PID 4826
tap1: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=80000<LINKSTATE>
        ether xxxxxxxxxxxxxx
        inet 10.0.0.11 netmask 0xffffffff broadcast 10.0.0.11 
        nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
        media: Ethernet autoselect
        status: no carrier
tap2: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=80000<LINKSTATE>
        ether xxxxxxxxxxxxxx
        inet 10.0.0.12 netmask 0xffffffff broadcast 10.0.0.12 
        nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
        media: Ethernet autoselect
        status: no carrier
tap3: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=80000<LINKSTATE>
        ether xxxxxxxxxxxxxx
        inet 10.0.0.13 netmask 0xffffffff broadcast 10.0.0.13 
        nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
        media: Ethernet autoselect
        status: no carrier
tap4: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=80000<LINKSTATE>
        ether xxxxxxxxxxxxxx
        inet 10.0.0.14 netmask 0xffffffff broadcast 10.0.0.14 
        nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
        media: Ethernet autoselect
        status: no carrier

Alle Jails sind gestartet und haben auch eine IP. Da läuft es wie vorher alles OK. Die "bhyve" VM welche auf "tap0" läuft, hat aber keine IP. Ich habe dort jetzt eine IP gesetzt inkl. Gateway "10.0.0.1" (bridge0) aber leider kann ich weder vom Host zur VM einen ping absetzen noch von der VM zum Host bzw. zu einer Jail.

Mit der Konfiguration fungiert dnsmasq dann als DHCP Server für die Jails und bhyve und auch als DNS Server für diese und den Host selbst. Das charmante bei der Lösung ist, dass sich alle Maschinen untereinander mit Namen ansprechen lassen, vom Jail zu bhyve, bhyve zum Host, etc.
Das werde ich einrichten, wenn es mit statischen IP Adressen funktioniert.

Heute Abend kann ich mal meine Produktivkonfiguration zeigen.
Das wäre super! Danke
 
Hmm, setze mal an jegliche block Regel in der pf.conf ein "log" und schau mal mit
Code:
tcpdump -n -e -ttt pflog0
ob irgendwas noch geblockt wird, wenn du versuchst zu pingen.
 
Code:
block in log
pass out
Code:
tcpdump -e -n -ttt -vv -i pflog0
Mhhh nichts zu sehen.

Code:
... -s 2:0,virtio-net,tap0
Das ist der Parameter für "bhyve". Sollte passen oder? Zumindest mit dem physischen Netzwerk "re1" hat es ja so funktioniert.
 
Also hier meine existierende pf Konfiguration (Auszug):

Code:
wlan_if="wlan0"
virt_if="bridge0"

set skip on tap
set skip on bridge
nat on $wlan_if from $virt_if:network to any -> ($wlan_if)

pass out
pass in on $virt_if

Das kann man evtl. noch optimieren, aber es funktioniert für mich.
 
Ich habe meine PF Konfiguration jetzt wirklich auf das nötigste reduziert aber es klappt nicht.

Zeigt es dir auf deinem Host mit "ifconfig" bei dem "tapX" Device für "bhyve" eine IP an?
 
Zurück
Oben