Χρήστος Μαργιώλης

FreeBSD VNET Jails

Το άρθρο υπάρχει επίσης στο FreeBSD Wiki.

Ρύθμιση

Το VNET ρυθμίζεται χρησιμοποιώντας το if_epair(4) interface γεφυρομένο με την πραγματική κάρτα δικτύου, στην δική μου περίπτωση, την re0. Όπως συμβαίνει και με τα if_tap(4) interfaces, τα epairs μπορούν να χρησιμοποιηθούν μόνο από ένα jail την φορά, οπότε εάν χρειάζεστε να τρέχετε περισσότερα από ένα jail ταυτόχρονα, θα πρέπει να φτιάξετε περισσότερα epairs.

Εάν χρησιμοποιείτε tap interfaces για bhyve VMs, μπορείτε απλά να τα προσθέσετε στην γέφυρα με την επιλογή addm.

Προσθέστε τις παρακάτω γραμμές στο /etc/rc.conf:

if_bridge_load="YES"
if_epair_load="YES"

cloned_interfaces="bridge0"
ifconfig_bridge0="addm re0 up"

Εφαρμόστε τις αλλαγές:

# /etc/netstart

Το jail πρέπει να κληρονομήσει τα /dev/bpf* από τον host προκειμένου να υπάρχει πρόσβαση στο δίκτυο. Δημιουργήστε έναν νέο κανόνα στο /dev/devfs.rules:

[devfsrules_jails=5]
add include $devfsrules_hide_all
add include $devfsrules_unhide_basic
add include $devfsrules_unhide_login
add path 'bpf*' unhide

Επανεκκινήστε το devfs(8):

# service devfs restart

Στο /etc/jail.conf, θα ονομάσουμε το jail foo και θα τού δώσουμε το άλλο άκρο του epair που θα δημιουργήσουμε ως την κάρτα δικτύου του. Η διεύθυνση IP του θα αποκτηθεί μέσω DHCP. Ο λόγος που καλώ χειροκίνητα το dhclient(8) είναι επειδή η προσθήκη της γραμμής ifconfig_epair0b="DHCP" στο /etc/rc.conf του jail δεν δουλεύει. Οι επιλογές αναλύονται στο jail.conf(5):

path = "/usr/local/jail/$name";
host.hostname="$name";

exec.clean;
exec.start = "/bin/sh /etc/rc";
exec.stop = "/bin/sh /etc/rc.shutdown";
allow.mount;
allow.raw_sockets = 1;
mount.devfs;
devfs_ruleset="5";
vnet;
sysvmsg=new;
sysvsem=new;
sysvshm=new;

foo {
	vnet.interface = "epair0b";
	exec.start += "dhclient epair0b";
}

Εγκατάσταση

# mkdir -p /usr/local/jail/foo
# bsdinstall jail /usr/local/jail/foo
...
# ifconfig epair0 create
# ifconfig bridge0 addm epair0a
# ifconfig epair0a up
# service jail onestart foo

Ελέγξτε ότι το jail έχει πρόσβαση στο δίκτυο:

# jexec foo ping google.com

Κατά το κλείσιμο του jail, καταστρέψτε το epair:

# service jail onestop foo
# ifconfig epair0a destroy

Διαγραφή jail

Η διαγραφή των jails δεν είναι εντελώς απλή, οπότε παραθέτω την διαδικασία:

# service jail onestop foo
# chflags -R noschg /usr/local/jail/foo
# rm -rf /usr/local/jail/foo

Επιπλέον ανάγνωση

← Προηγούμενο Ευρετήριο Επόμενο →