Cách thiết lập Jail với Iocage trên FreeBSD

theanh

Administrator
Nhân viên
Jail là thuật ngữ dùng để chỉ ảo hóa cấp hệ điều hành trên FreeBSD. Thuật ngữ này được Poul-Henning Kamp giới thiệu vào năm 1999 và được FreeBSD áp dụng kể từ phiên bản 4.x.

Jail cho phép quản trị viên hệ thống tạo một hệ thống nhỏ hoặc 'jail' độc lập và riêng biệt bên trong hệ thống FreeBSD. 'Jail' có hệ thống gốc và cấu hình riêng, và rất hữu ích nếu bạn muốn triển khai ứng dụng trong môi trường riêng biệt.

Iocage là trình quản lý jail FreeBSD được viết bằng Python. Trình quản lý này đơn giản và có cú pháp lệnh dễ sử dụng. Trình quản lý jail Iocage dành riêng cho tập dữ liệu ZFS bên trong jail và cho phép bạn tạo một jail dựa trên các ngăn xếp mạng ảo 'VNET' và/hoặc jail dựa trên 'Shared IP'. Với Iocage, bạn có thể tạo mẫu jail, jail cơ sở và jail thông thường.

Hướng dẫn này sẽ chỉ cho bạn cách thiết lập và cấu hình jail FreeBSD bằng Iocage Jail Manager. Chúng tôi sẽ cài đặt Iocage trên FreeBSD, thiết lập một jail mới sử dụng IP được chia sẻ, thiết lập tường lửa pf, sau đó cài đặt máy chủ web nginx bên trong jail để thử nghiệm.

Điều kiện tiên quyết

Đối với hướng dẫn này, bạn sẽ được yêu cầu cài đặt và cấu hình Iocage Jail Manager trên hệ thống FreeBSD được cài đặt trên ZFS (Z File System). Và hãy đảm bảo rằng bạn đã bật Tường lửa pf trên hệ thống FreeBSD của mình.

Dưới đây là hướng dẫn cài đặt FreeBSD trên ZFS và cấu hình tường lửa pf.

Cách cài đặt FreeBSD 12.0 trên ZFS
Cách thiết lập Tường lửa pf trên FreeBSD

Những gì chúng ta sẽ làm:

  1. Cài đặt Trình quản lý Iocage Jail
  2. Tải xuống Bản phát hành FreeBSD
  3. Thiết lập IP được chia sẻ và Tường lửa pf
  4. Tạo Jail mới bằng Iocage
  5. Kiểm tra

Bước 1 - Cài đặt Iocage trên FreeBSD​

Đầu tiên, chúng ta sẽ cài đặt và cấu hình trình quản lý Iocage Jail trên hệ thống FreeBSD. Iocage được viết bằng Python và có sẵn trong kho lưu trữ gói nhị phân FreeBSD.

Cài đặt Iocage vào hệ thống FreeBSD bằng lệnh pkg bên dưới.
Mã:
pkg install py36-iocage
Nhập 'y' để chấp nhận cài đặt gói python Iocage và quá trình cài đặt sẽ bắt đầu.

Sau khi quá trình cài đặt hoàn tất, hãy kiểm tra nhóm ZFS khả dụng trên hệ thống bằng lệnh zpool bên dưới.
Mã:
zpool list
Bây giờ hãy chọn nhóm ZFS để cài đặt Iocage. Đối với hướng dẫn này, chúng tôi sẽ sử dụng nhóm ZFS mặc định cho FreeBSD được cài đặt có tên là 'zroot'.

Kích hoạt nhóm 'zroot' để sử dụng Iocage bằng lệnh bên dưới.
Mã:
iocage activate zroot
Bây giờ quá trình cài đặt Iocage trên FreeBSD 12.0 đã hoàn tất và bạn có thể sử dụng dòng lệnh iocage để tạo và quản lý FreeBSD jail.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22218%22%3E%3C/svg%3E


Ngoài ra, bạn có thể bật jail khi khởi động hệ thống bằng cách thêm dịch vụ iocage vào tệp '/etc/rc.conf' bằng lệnh sysrc bên dưới.
Mã:
sysrc iocage_enable=yes

Bước 2 - Tải xuống FreeBSD Phát hành​

Để tạo một jail mới, bạn sẽ cần tải xuống FreeBSD Release. Và bạn có thể tạo một jail mới là phiên bản khác của phiên bản FreeBSD lưu trữ của bạn.

Kiểm tra các phiên bản Release khả dụng bằng lệnh iocage bên dưới.
Mã:
iocage fetch
Bây giờ, bạn sẽ nhận được một phiên bản Release khác. Chọn phiên bản bạn cần và nhập số. Chọn số '2' để tải xuống phiên bản Phát hành mới nhất.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22352%22%3E%3C/svg%3E


Đợi ảnh phát hành FreeBSD được tải xuống.

Nếu bạn muốn tải xuống một ảnh khác, bạn có thể sử dụng lệnh sau.
Mã:
iocage fetch 11.3-RELEASE
Kết quả là, Đã tải xuống ảnh phát hành FreeBSD cho jail.

Bước 3 - Thiết lập IP chia sẻ và tường lửa Pf​

Sau khi tải xuống ảnh nguồn cho jail, chúng tôi sẽ cấu hình mạng và tường lửa pf trên hệ thống. Chúng tôi sẽ tạo một giao diện mạng mới có tên là 'bridge0' với địa chỉ IP mạng là '10.8.8.1/24' và nó sẽ được jail sử dụng.

Thêm cấu hình mới vào tệp '/etc/rc.conf' bằng cách chạy lệnh sau.
Mã:
sysrc cloned_interfaces+="bridge0"
sysrc ifconfig_bridge0="10.8.8.1/24"
Tạo một giao diện 'bridge0' mới với địa chỉ IP mạng '10.8.8.1/24'.
Mã:
ifconfig bridge0 create
ifconfig bridge0 10.8.8.1/24 up

data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22207%22%3E%3C/svg%3E


Bây giờ giao diện 'bridge0' đã được tạo, hãy kiểm tra nó bằng lệnh sau.
Mã:
ifconfig bridge0
Và bạn sẽ nhận được kết quả như bên dưới.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22262%22%3E%3C/svg%3E


Tiếp theo, chúng ta sẽ cấu hình tường lửa pf và thêm cấu hình mới cho môi trường jail. Chúng tôi đang sử dụng cấu hình tường lửa pf đơn giản trong hướng dẫn này.

Cách thiết lập tường lửa pf trên FreeBSD 12.0

Vào thư mục '/usr/local/etc' và chỉnh sửa tệp cấu hình 'pf.conf'.
Mã:
cd /usr/local/etc/
vim pf.conf
Thêm giao diện mạng nội bộ 'bridge0' và địa chỉ IP của nó là 'int_if' và 'localnet' biến.
Mã:
# Internal interface
int_if = "bridge0"
localnet = $int_if:network
Bây giờ hãy xác định địa chỉ IP của máy chủ jail và các cổng sẽ được chuyển tiếp đến jail. Chúng tôi sẽ chuyển tiếp các kết nối HTTP và HTTPS trên giao diện bên ngoài của hệ thống đến địa chỉ IP của máy chủ jail là '10.8.8.5'.
Mã:
# Port-Forward http and https to Jail '10.8.8.5'
ports_to_forward="{ 80, 443 }"
forward_host="10.8.8.5"
Bật nat trên giao diện bên ngoài 'ext_if' cho biến 'localnet' của jail, sau đó bật chuyển hướng cổng từ biến 'ports_to_forward' đến máy chủ 'forward_host'.
Mã:
# nat jail to internet and internet to jail (http and https only)
nat on $ext_if inet from $localnet to any -> ($ext_if)
rdr on $ext_if proto tcp from any to any port $ports_to_forward -> $forward_host
Bây giờ hãy chuyển tất cả kết nối từ giao diện 'bridge0' và chuyển kết nối đến trên giao diện bên ngoài đến 'ports_to_forward' HTTP và HTTPS.
Mã:
pass from { self, $localnet } to any keep state
pass in on $ext_if proto {udp, tcp} from any to any port $ports_to_forward keep state
Lưu và đóng.

Bây giờ hãy kiểm tra cấu hình tường lửa pf và đảm bảo không có lỗi, sau đó tải lại pf dịch vụ.
Mã:
service pf check
service pf reload
Sau đó, kiểm tra tất cả các quy tắc trên tường lửa pf bằng lệnh sau.
Mã:
pfctl -s rules
Và bạn sẽ nhận được kết quả như bên dưới.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22397%22%3E%3C/svg%3E


Ngoài ra, bạn có thể kiểm tra trạng thái nat trên tường lửa pf.
Mã:
pfctl -v -s nat

data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22271%22%3E%3C/svg%3E


Kết quả là giao diện mới 'bridge0' đã được tạo và tường lửa pf đã được cấu hình. Và chúng ta đã sẵn sàng để tạo nhà tù đầu tiên mới.

Dưới đây là cấu hình tường lửa pf đầy đủ.
Mã:
cat /usr/local/etc/pf.conf
Mã:
# Define External Interface and IP Address
ext_if="vtnet0"
ext_ip="198.13.39.207"
# Define TCP and UDP Services
ext_tcp_ports="{ ssh, smtp, smtps, imaps, http, https, domain }"
ext_udp_ports="{ domain, ntp }"
# Internal interface
int_if = "bridge0"
localnet = $int_if:network
# Port-Forward http and https to Jail '10.8.8.5'
ports_to_forward="{ 80, 443 }"
forward_host="10.8.8.5"
# Skip the localhost
set skip on lo0
# Log interface
set loginterface $ext_if
# nat jail to internet and internet to jail (http and https only)
nat on $ext_if inet from $localnet to any -> ($ext_if)
rdr on $ext_if proto tcp from any to any port $ports_to_forward -> $forward_host
# Default Policy
block in all
pass out all keep state
# Allow Ping
pass inet proto icmp icmp-type echoreq
pass from { self, $localnet } to any keep state
pass in on $ext_if proto {udp, tcp} from any to any port $ports_to_forward keep state
# Allow Services
pass in proto tcp from any to any port $ext_tcp_ports
pass in proto tcp from any to any port $ext_udp_ports
# Log access for ssh and http
pass log quick proto tcp from any to any port { ssh,http }

Bước 4 - Tạo nhà tù mới bằng Iocage​

Sau khi cấu hình mạng và tường lửa pf trên hệ thống FreeBSD, chúng ta đã sẵn sàng tạo một jail mới bằng iocage.

Tạo một jail mới có tên là 'jail01' với bản phát hành FreeBSD '12.0-RELEASE' bằng lệnh iocage bên dưới.
Mã:
iocage create -n jail01 -r 12.0-RELEASE
Bây giờ hãy thêm địa chỉ IP và cổng định tuyến mặc định của jail. Chúng tôi sẽ cấp cho 'jail01' địa chỉ IP là 10.8.8.5' và cổng định tuyến mặc định là địa chỉ IP máy chủ 'bridge0' là '10.8.8.1'.
Mã:
iocage set ip4_addr="bridge0|10.8.8.5" jail01
iocage set defaultrouter="10.8.8.1" jail01
Cho phép jail khởi động khi khởi động.
Mã:
iocage set boot=on jail01
Bây giờ hãy kiểm tra danh sách jail.
Mã:
iocage list
Và bạn sẽ nhận được 'jail01' với địa chỉ IP '10.8.8.5' và dựa trên bản phát hành FreeBSD '12.0'.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22476%22%3E%3C/svg%3E


Tiếp theo, khởi động 'jail01' bằng lệnh bên dưới.
Mã:
iocage start jail01
Sau khi jail khởi động, hãy truy cập jail bằng lệnh sau.
Mã:
iocage console jail01
Bạn sẽ nhận được một shell mới bên trong jail01, như hiển thị bên dưới.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22598%22%3E%3C/svg%3E


Bên trong jail, hãy kiểm tra địa chỉ IP của giao diện 'bridge0' trên 'jail01'.
Mã:
ifconfig bridge0
Và bạn sẽ nhận được giao diện 'bridge0' có địa chỉ IP '10.8.8.5' như đã cấu hình.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22241%22%3E%3C/svg%3E


Kết quả là, một jail mới có tên là 'jail01' đã được tạo.

Bước 5 - Kiểm tra​

Trong bước này, chúng ta sẽ kiểm tra 'jail01' bằng cách cài đặt máy chủ web Nginx trên đó và sau đó thử truy cập Nginx từ bên ngoài mạng và kết nối sẽ được chuyển hướng đến 'jail01'.

Đầu tiên, hãy cập nhật các gói nhị phân trên jail bằng lệnh pkg bên dưới.
Mã:
pkg update

data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22309%22%3E%3C/svg%3E


Sau đó, cài đặt máy chủ web nginx bên trong jail bằng gói sau lệnh.
Mã:
pkg install nginx
Sau khi cài đặt hoàn tất, hãy thêm dịch vụ nginx vào hệ thống khởi động và khởi động dịch vụ nginx.
Mã:
sysrc nginx_enable=yes
service nginx start
Bây giờ hãy kiểm tra danh sách cổng mở trên 'jail01'.
Mã:
sockstat -l4
Và bạn sẽ thấy dịch vụ Nginx đang hoạt động ở cổng HTTP '80'.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22284%22%3E%3C/svg%3E


Tiếp theo, chúng ta sẽ thay đổi trang index.html mặc định trên 'jail01'.

Đi đến Thư mục '/usr/loca/www/' và chỉnh sửa tệp 'index.html'.
Mã:
cd /usr/local/www/
edit nginx-dist/index.html
Thực hiện một số thay đổi và thoát.
Mã:
cat nginx-dist/index.html

data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22623%22%3E%3C/svg%3E


Bây giờ hãy truy cập địa chỉ IP bên ngoài của máy chủ từ trình duyệt web của bạn.


Và bạn sẽ nhận được trang nginx index.html bên trong 'jail01'.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22262%22%3E%3C/svg%3E


Kết quả là, 'jail01' đã hoạt động và được cài đặt Nginx. Tất cả các kết nối HTTP và HTTPS tới máy chủ sẽ được chuyển hướng đến 'jail01'.

Tham khảo​

 
Back
Bên trên