پرش به محتوا

Jail در FreeBSD: سرویس جداگانه با IP اختصاصی

از فایل base رسمی یک jail بسازید، آن را با jail.conf و IP جداگانه تعریف کنید، خودکار اجرا کنید و داخلش Nginx نصب و به‌روزرسانی کنید.

FreeBSD 15سطح: متوسطبه‌روزرسانی: ۱۷ آبان ۱۴۰۵

jail قدیمی‌ترین روش کانتینر در دنیای یونیکس است. هر jail فایل‌سیستم، کاربران، فرایندها و IP خودش را دارد، ولی هسته را با میزبان به اشتراک می‌گذارد.

۱. ساخت پوشه‌ی jail

اگر ZFS دارید، هر jail یک dataset باشد تا بتوانید جداگانه از آن snapshot بگیرید:

shell
zfs create -o mountpoint=/usr/local/jails tank/jails
zfs create tank/jails/www

۲. نصب سیستم پایه در jail

shell
REL=$(freebsd-version -u | sed 's/-p[0-9]*$//')     # e.g. 15.0-RELEASE
fetch -o /tmp/base.txz "https://download.freebsd.org/releases/amd64/${REL}/base.txz"
tar -xf /tmp/base.txz -C /usr/local/jails/www --unlink
cp /etc/resolv.conf /usr/local/jails/www/etc/
cp /etc/localtime /usr/local/jails/www/etc/

۳. تعریف در jail.conf

/etc/jail.conf:

exec.start = "/bin/sh /etc/rc";
exec.stop = "/bin/sh /etc/rc.shutdown";
exec.clean;
mount.devfs;
devfs_ruleset = 4;

www {
    host.hostname = "www.corp.sahor.ir";
    path = "/usr/local/jails/${name}";
    ip4.addr = "vtnet0|192.168.10.31/24";
    allow.raw_sockets = 0;
}

نام کارت شبکه (vtnet0) را با خروجی ifconfig جایگزین کنید. IP جداگانه روی همان کارت به‌صورت alias اضافه می‌شود.

۴. اجرا

shell
sysrc jail_enable=YES
sysrc jail_list+=www
service jail start www
jls

۵. کار داخل jail

shell
jexec www sysrc nginx_enable=YES
jexec www env ASSUME_ALWAYS_YES=yes pkg bootstrap
jexec www pkg install -y nginx
jexec www service nginx start
fetch -qo - http://192.168.10.31/ | head -3

پیکربندی Nginx داخل jail در مسیر /usr/local/jails/www/usr/local/etc/nginx/ روی میزبان قابل ویرایش است.

اگر فایروال PF روی میزبان دارید، برای IP جدید jail قانون pass اضافه کنید.

۶. به‌روزرسانی

shell
# Base system of the jail
freebsd-update -b /usr/local/jails/www fetch install
# Packages inside the jail
pkg -j www upgrade -y
service jail restart www

۷. snapshot پیش از تغییر

shell
zfs snapshot tank/jails/www@before-upgrade
# if something breaks:
service jail stop www && zfs rollback tank/jails/www@before-upgrade && service jail start www

برای مدیریت ده‌ها jail، ابزارهایی مثل bastille (از pkg) ساخت و به‌روزرسانی را ساده‌تر می‌کنند. ولی دانستن روش دستی بالا برای عیب‌یابی ضروری است.