Bhyve: wie macht man eine Port-Weiterleitung bzw. -Umleitung?

Yoda

[Linux|FreeBSD] - User
Wie wird bei Bhyve eine Port-Weiterleitung bzw. -Umleitung realisiert, wie sie bei Docker z.B. mit "port 25565:25565" realisiert wird?
So das der lokale Host-Port "25565" auf den VM-Port "25565" umgeleitet wird.
 

CommanderZed

OpenBSD User
Teammitglied
Wie wird bei Bhyve eine Port-Weiterleitung bzw. -Umleitung realisiert, wie sie bei Docker z.B. mit "port 25565:25565" realisiert wird?
So das der lokale Host-Port "25565" auf den VM-Port "25565" umgeleitet wird.
Ich bin kein experte, aber Bhyve macht ja nicht das was Docker macht sondern eher das was Hyper-V oder Virtualbox macht.

Entsprechend wirst du da vermutlich etwas mit nem virtuellen netzwerk (bridge) und einem paketfilter (pf zb) selbst bauen müssen.
 

Andy_m4

Well-Known Member
Entsprechend wirst du da vermutlich etwas mit nem virtuellen netzwerk (bridge) und einem paketfilter (pf zb) selbst bauen müssen.
Ja. Ergänzend dazu sollte man vielleicht noch sagen, das dann auch das "Routing" eingeschaltet werden muss.
Also sysctl
net.inet.ip.forwarding (für IPv4) bzw.
net.inet6.ip6.forwarding (für IPv6) auf 1 gesetzt werden muss.
Das kann man auch damit persistent machen, in dem man
gateway_enable="YES"
in die /etc/rc.conf einträgt
 

Yoda

[Linux|FreeBSD] - User
Ja. Ergänzend dazu sollte man vielleicht noch sagen, das dann auch das "Routing" eingeschaltet werden muss.
Also sysctl
net.inet.ip.forwarding (für IPv4) bzw.
net.inet6.ip6.forwarding (für IPv6) auf 1 gesetzt werden muss.
Das kann man auch damit persistent machen, in dem man
gateway_enable="YES"
in die /etc/rc.conf einträgt
Ja, das ist schon aktiviert. Eine Bhyve-VM läuft schon auf einer dedizierten NIC...
 

Yoda

[Linux|FreeBSD] - User
Ich bin kein experte, aber Bhyve macht ja nicht das was Docker macht sondern eher das was Hyper-V oder Virtualbox macht.

Entsprechend wirst du da vermutlich etwas mit nem virtuellen netzwerk (bridge) und einem paketfilter (pf zb) selbst bauen müssen.
Davor graut es mir.
Ich komme wohl mit der nativen FW von FreeBSD (fw) klar aber mit "pf" dagegen nicht...
hättest Du da ein Beispiel, wie man das umsetzen müsste?
 

CommanderZed

OpenBSD User
Teammitglied
Ich gehe jetzt mal davon aus das die einfachere Option, die VM einfach direkt mit dem Netzwerk, zu verbinden mit einer eigenen IP im "richtigen" Netzwerk keine Option ist.

Ich kenn mich halt mit fw nicht aus. deshalb hätt ich pf genommen weil ich da zumindest eine Idee hab was man so machen kann, sofern der Syntax sehr ähnlich wie bei OpenBSD ist. Letztlich machst du das gleiche wie bei einem router im Netzwerk zuhause, NAT auf dem "externen" Interface und dann eine portweiterleitung auf die "intern" IP der vm.

Mal so grob von https://www.openbsd.org/faq/pf/example1.html abgekupfert könnte das:

Code:
ext= "em1"
int  = "tap0
set block-policy drop
set loginterface egress
set skip on lo0
match in all scrub (no-df random-id max-mss 1440)
match out on egress inet from !(egress:network) to any nat-to (egress:0)
block all
pass out quick inet
pass in on { $ext $int} inet
pass in on egress inet proto tcp from any to (egress) port { 80 443 } rdr-to 192.168.1.2

So ganz grob hinkommen denke ich - letzteres wäre dann die "Nat-Portweiterleitung".
 

Yoda

[Linux|FreeBSD] - User
Ich gehe jetzt mal davon aus das die einfachere Option, die VM einfach direkt mit dem Netzwerk, zu verbinden mit einer eigenen IP im "richtigen" Netzwerk keine Option ist.

Ich kenn mich halt mit fw nicht aus. deshalb hätt ich pf genommen weil ich da zumindest eine Idee hab was man so machen kann, sofern der Syntax sehr ähnlich wie bei OpenBSD ist. Letztlich machst du das gleiche wie bei einem router im Netzwerk zuhause, NAT auf dem "externen" Interface und dann eine portweiterleitung auf die "intern" IP der vm.

Mal so grob von https://www.openbsd.org/faq/pf/example1.html abgekupfert könnte das:

Code:
ext= "em1"
int  = "tap0
set block-policy drop
set loginterface egress
set skip on lo0
match in all scrub (no-df random-id max-mss 1440)
match out on egress inet from !(egress:network) to any nat-to (egress:0)
block all
pass out quick inet
pass in on { $ext $int} inet
pass in on egress inet proto tcp from any to (egress) port { 80 443 } rdr-to 192.168.1.2

So ganz grob hinkommen denke ich - letzteres wäre dann die "Nat-Portweiterleitung".
Danke!
Aber die letzte Zeile scheint einen Syntax-Fehler zu haben, auch verstehe ich nicht, warum dort die Router-IP noch angegeben werden muß...?


Ich habe aber etwas dazu im FreeBSD-Forum gefunden:
https://forums.freebsd.org/threads/pf-port-forwarding.56995/

# vi /etc/rc.conf sshd_enable="YES" gateway_enable="YES" ipv6_gateway_enable="YES" pf_enable="YES" pf_rules="/etc/pf.conf" pflog_enable="YES" pflog_logfile="/var/log/pflog"

# service pf start # service pflog start

# vi /etc/sysctl.conf net.inet.ip.forwarding=1 net.inet6.ip6.forwarding=1

# sysctl -f /etc/sysctl.conf

# vi /etc/pf.conf NIC_EXT="em0" # FreeBSD-Host mit IP = 192.168.1.1 NIC_INT="tap0" # Linux-VM mit IP = 192.168.1.200 # ### Rules must be in order: options, normalization, queueing, translation, filtering rdr log on $NIC_EXT proto { tcp, udp } from any to 192.168.1.1 port 24 -> 192.168.1.200 port 22 rdr pass on $NIC_EXT proto icmp from any to 192.168.1.1 -> 192.168.1.200 set skip on lo0 #block in all #pass out all keep state pass out log on $NIC_EXT all pass in all keep state

# pfctl -e ; pfctl -f /etc/pf.conf

# pfctl -s nat rdr log on em0 inet proto tcp from any to 192.168.1.1 port = 24 -> 192.168.1.200 port 22 rdr log on em0 inet proto udp from any to 192.168.1.1 port = 24 -> 192.168.1.200 port 22 rdr pass on em0 inet proto icmp from any to 192.168.1.1 -> 192.168.1.200


Jetzt werde ich mit diesem Kommando mit der VM verbunden:
# ssh -p 24 192.168.1.1

Es scheint jetzt also zu funktionieren... :-)
 

Andy_m4

Well-Known Member
Ich komme wohl mit der nativen FW von FreeBSD (fw)
Du kannst auch die ipfw dafür nehmen. Es muss nicht die pf sein.
Ich weiß jetzt auf Schlagnicht, ob sowas wie
ipfw rulenr add fwd bhyveip,25565 ip from any to myip 25565 in nic1
reicht oder ob man dafür natd braucht um die IP-Adresse umzuschreiben

# vi /etc/sysctl.conf
net.inet.ip.forwarding=1
net.inet6.ip6.forwarding=1
Das solltest Du nicht machen bzw. ist das schon durch die gateway-Option in der /etc/rc.conf abgedeckt
 
Oben