Na FreeBSD používám jako firewall projekt PF. Vyvstal problém, jak správně nastavit firewall na stroji s jaily a Sambou.

Prvním problémem k řešení je umravnit sambu tak, aby neposlouchala na IP, kterou jsou přiřazené jailům. Ve výchozím stavu samba ochotně naslouchá na všech dostupných IP. V konfiguračním souboru /usr/local/etc/smb4.conf nastavíme v sekci [global]:

bind interfaces only = Yes
interfaces = 192.168.xx.xx/32

Pozor na subnet /32, potřebujeme definovat konkrétní IP a nikoliv síť.

Po restartu service samba_server restartsockstat -l ukazuje binding pouze na konkrétní IP:

root     smbd       36586 34 tcp4   192.168.xx.xx:445     *:*
root     smbd       36586 35 tcp4   192.168.xx.xx:139     *:*
root     nmbd       36581 15 udp4   *:137                 *:*
root     nmbd       36581 16 udp4   *:138                 *:*
root     nmbd       36581 17 udp4   192.168.xx.xx:137     *:*
root     nmbd       36581 18 udp4   192.168.xx.255:137    *:*
root     nmbd       36581 19 udp4   192.168.xx.xx:138     *:*
root     nmbd       36581 20 udp4   192.168.xx.255:138    *:*

Z toho současně vidíme, které porty je nutno povolit. Jsou to tcp: 139, 445, udp: 137, 138. Ale pozor, UDP porty poslouchají jednak na konkrétní IP, ale také na broadcast adrese 255.

Většina návodů tohle neřeší, protože radí povolit porty 137, 138, 139, 445 pro tcp i udp a považují to za vyřešené. Pokud na daném stroji nemáme jaily nebo portforward na tyto porty, lze to jistě takto nechat. Pokud však potřebujeme nastavit přístup pouze na konkrétní IP, musíme povolit i broadcast.

Pravidla pro pf (v souboru /etc/pf.conf potom budou vypadat takto:

# samba
pass in on $iface proto tcp to 192.168.xx.xx port { 139, 445 }
pass in on $iface proto udp to { 192.168.xx.xx, 192.168.xx.255 } port { 137, 138 }

Pokud nepovolíme adresu broadcastu, připojení na sambu stále funguje, ale nefunguje vyhledávání strojů na síti. Pokud to adminovi nevadí, nebo to dokonce považuje za výhodu, může broadcast nepovolit.