Abych demonstroval jednoduchost konfigurace FreeBSD a také to může pomoci někomu dalšímu, rozhodl jsem se podělit se svojí konfiguraci.
Konfiguruj síť, firewall, NAT , co se má pustit po startu a také fungování jailů (kontainery).
Vše dělám tak, aby to bylo co nejkratší, přehledné a jedna věc byla jen na jednom místě.
Důležité nastavení je pak obsaženo v těchto několika malých souborech.
/etc/rc.conf - nastavení sítě a toho co se má při startu pustit
hostname="Bdxxx"
keymap="cz.kbd"
# přejmenuji síťovku s jménem igb0, aby bylo jasné, kam připojit kabel
ifconfig_igb0_name="prostredni"
# vytvořím bridge - virtuální switch do kterého se budou zapojovat jednotlivé jaily.
cloned_interfaces="bridge0"
# přidám externí fyzickou síťovku do bridge
# pevná adresa by se dělala takto
#ifconfig_bridge0="inet 89.xxx.xxx.xx/27 addm prostredni up"
# pro získání ip adresy se použije DPHCP
ifconfig_bridge0="addm prostredni SYNCDHCP"
ifconfig_prostredni="up"
# pokud nepoužiji DHCP, musím definovat výchozí bránu
#defaultrouter="89.xxx.xxx.xx"
# sám může být router kvůli NATu
gateway_enable="YES" # sysctl -w net.inet.ip.forwarding=1
Routování mohu přidat takto
#static_routes="net1 net2"
#route_net1="-net 81.XXX.XXX.XXX/29 -interface bridge0"
#route_net2="-net 81.XXX.XXX.XXX/28 -interface bridge0"
sshd_enable="YES"
ntpd_enable="YES"
ntpd_sync_on_start="YES"
jail_enable="YES"
jail_parallel_start="NO"
# seznam kontainerů, které se mají spustit po startu systému
jail_list=""
powerd_enable="YES"
moused_nondefault_enable="NO"
dumpdev="AUTO"
zfs_enable="YES" # zfs mount -a
pf_enable="YES"
pflog_enable="YES
Syntaxe rc.conf spočívá v definování proměnných v shelu. Defaultní skripty pak testují existenci těchto proměnných a podle toho se zachovají.
Hodnoty proměnných bývají shodné s tím, jak by se stejná věc prováděla přímo z příkazové řádky. Tedy např. ipfconfig_bridge0="inet 89.xxx.xxx.xx/27 addm prostredni up" ve skutečnosti provede "ifconfig bridge0 inet 89.xxx.xxx.xx/27 addm prostredni up" . Přidá do bridge0 síťovku se jménem "prostredni" a nastaví ip adresu na virtuální síťovce bridge0.
Takže syntaxe je dobře popsána v manuálových stránkách, mohu si ji nejdříve vyzkoušet z příkazového řádku a stejnou syntaxi použít ve rc.conf. To je velké ulehčení oproti Linuxu, kdy např. konfigurační soubor sítě má úplně jinou syntaxi, než když chceme to síť nastavit ručně z příkazové řádky.
/etc/pf.conf - nastavení firewallu a NATu
# kontrola a reload firewallu: pfctl -vf /etc/pf.conf
ext_if = "bridge0"
# Tady jsou definice společné pro všechny fyzické servery
include "/etc/ovps_shared/pf.conf"
# ukázka v dokumentaci https://docs.freebsd.org/en/books/handbook/firewalls/
nat on $ext_if from 192.168.164.0/24 to any -> $ext_if
block all
pass from { self, 192.168.164.0/24 } to any keep state
# to list table content from terminal: pfctl -t ssh_access -Ts
table <ssh_access> const $ssh_access_set
pass in quick on $ext_if proto tcp from { <ssh_access> } to any port 24
pass out all
pass in inet proto icmp all icmp-type echoreq
Pokud budou mít jaily neveřejný ip adresy, budou z rozsahu 192.168.164.0/24 a fyzický stroj jim bude dělat NAT.
/etc/jail.conf - nastavení kontainerů
$bridge = "bridge0";
$epair = "epair${id}";
# jailům s neveřejnou ip adresou budu dělat NAT
$gateway = "89.XXX.XXX.XXX";
# PATH/HOSTNAME
path = "/jails/${name}/rootfs";
host.hostname = "${name}";
# VNET/VIMAGE
vnet;
# jeden ze dvou nových síťovek vložím do kontaineru
vnet.interface = "${epair}b";
# vytovří se pár síťových zařízení. Jeden se vloží do jailu jeden do bridge
exec.prestart = "ifconfig ${epair} create up";
exec.prestart += "ifconfig ${epair}a up descr jail:${name}";
exec.prestart += "ifconfig ${bridge} addm ${epair}a up";
exec.prestart += "mkdir -p ${path}/etc/ovps_shared";
# firewall pak už bude v containeru. Aby věděl, jakou má ip adresu a název síťového zařízení, vytvořím mu soubor
# pf_local_definitions, který includne
exec.prestart += "echo 'ext_if = \"${epair}b\"\next_ip = \"${ip}\"'> ${path}/etc/pf_local_definitions.conf";
# pro přehled jakou má jaký kontainer ip adresu, uložím ip do souboru v jeho adresáři se jmpénem ip
exec.prestart += "echo '${ip}'> /jails/${name}/ip";
# container má přístup k adresáři /etc/ovps_shared, kde jsou společné konfigurace a definice pro
# všechny kontainery. Nebudu se tak zbytečně opakovat a v případě změn to změním jen na jednom místě.
exec.prestart += "mount_nullfs -o ro /etc/ovps_shared ${path}/etc/ovps_shared";
# níže nastavuji síťování pro jail
exec.start = "ifconfig ${epair}b ${ip} up";
exec.start += "route add -net 81.xxx.xxx.xxx/29 -interface ${epair}b";
exec.start += "route add default ${gateway}";
exec.poststop = "ifconfig ${bridge} deletem ${epair}a";
exec.poststop += "ifconfig ${epair}a destroy";
exec.release = "umount -t nullfs ${path}/etc/ovps_shared";
# STARTUP/LOGGING
exec.start += "/bin/sh /etc/rc";
exec.stop = "/bin/sh /etc/rc.shutdown";
exec.consolelog = "/var/log/jail_console_${name}.log";
# PERMISSIONS
allow.raw_sockets;
exec.clean;
mount.devfs;
devfs_ruleset = 5;
# každý jail má také konfigurák ve svém adresáři, kde mohu nastavit jméno a ip adresu, nebo jiné
# nastavení která se liší od defaultu výše.
.include "/jails/*/config.conf";
Zde je geniální to, že nastavení, které je pro všechny jaily stejné dám do souboru /etc/jails.conf a to čím se liší dám do
/jails/nazevJailu/config.conf . Konfig jednotlivých jailů tak může být velmi krátký. Natavuji jen jméno a ip adresu.
/jails/nazevJailu/config.conf - konfigurace jednotlivých kontainerů
nazevJailu{
# NETWORKS/INTERFACES
$id = "154";
$ip = "192.168.164.${id}/24";
}
Samotný jail je pak umístěn v adresáři /jails/nazevJailu/rootfs
Pokud někdo vidí nějaké nedostatky, nebo že lze něco udělat ještě lépe, prosím napište.