FreeBSD 使用 bastille 管理 jail
內容只要來自 bastille 的 man page 跟 bastille document。
安裝
pkg install bastille
sysrc bastille_enable=YES
sysrc bastille_rcorder=YES
sysrc 是讓 bastille 在開機的時候自動開啟。
網路
每個 jail 可以有自己的 IP 跟 FreeBSD version,這邊參考 document 的 Network Requirements 章節來講解怎麼設定網路。
- Shared Interface on Home or Small Office Network: 自己有 router,分配給你一個 private IPv4 address 還有 private IP range,也就是你可以自己使用 private IP,你可以在正在用的 network interface 在加一個 interface,假如你現在用的是 em0 網卡,並且有 192.168.1.xx range (mask 是 24),指令如下 (假如 jail 名字叫做 alcatraz)
bastille create alcatraz 13.2-RELEASE 192.168.1.50/24 em0
電腦會負責把 192.168.1.50 當作 IP alias 加到 em0 interface。
2. Public Network: 當你是直接用一個固定 IPv4 上網,所以你的那個網路界面不會有 Private IP range,這時候要用另外一個方法。你需要在 clone 一個 loopback interface,並給它指定 private ip and range,然後在容器需要對外網路時,設定防火牆規則,這種方式可以在任何網路使用。
ishmael ~ # sysrc cloned_interfaces+=lo1
ishmael ~ # sysrc ifconfig_lo1_name="bastille0"
ishmael ~ # service netif cloneup
ishmael ~ # sysrc pf_enable="YES"
上面設定在開機的時候會 clone 一個 interface,並且改名字叫做 bastille0,以及開啟防火牆 pf。防火牆規則如下
ext_if="vtnet0"
set block-policy return
scrub in on $ext_if all fragment reassemble
set skip on lo
table <jails> persist
nat on $ext_if from <jails> to any -> ($ext_if:0)
rdr-anchor "rdr/*"
block in all
pass out quick keep state
antispoof for $ext_if inet
pass in inet proto tcp from any to any port ssh flags S/SA modulate state
假設要出去的 inteface 使 vtnet0 (第一個例子可能就是 em0),”nat on $ext_if from <jails> to any -> ($ext_if:0)” 這一行,也就是用 NAT 來讓 bastille0 的流向可以到 vtnet0,並且 “rdr-anchor “rdr/*”” 讓我們可以用 bastille rdr 來決定 bastille0 的哪個 port 流量要到 vtnet0 的某個 port。
所以接下來你直接使用下面指令,就會自動附加到 bastille0 interface。
bastille create 13.2-RELEASE 192.168.1.50
Document 還有討論 VNET 的狀況,沒用到先不詳細看 …
Note
jail 預設不允許 raw_sockets,最暴力方式就是 sysrc jail_xx_parameters="allow.raw_sockets"
其中 xx 換成你的 jail name。