FreeBSD Samba

Samba是使用SMB/CIFS协议提供文件和打印服务共享的开源软件。Samba实现了Windows系统的SMB/CIFS协议,能够在网络中提供一个像本地硬盘和本地打印机一样共享服务。

在FreeBSD上,Samba客户端使用过 net/samba416 软件包安装的,安装以后就可以作为客户端访问Windows网络的SMB/CIFS共享。在同一个samba软件包中,也提供了一个Samba服务,这样FreeBSD也能向网络提供SMB/CIFS共享服务。

备注

根据 pkg search samba 可以找到当前发行版提供了3个版本的Samba,我最初选择安装最新的 net/samba420 ,但是实践发现macos客户端访问时 smbd 会crash。网上查到的资料显示,当前FreeBSD整个系统编译都是围绕 net/samba416 完成的,所以我回退到 net/samba416 之后就能正常工作了。果然,按照官方手册是正确。

备注

根据 OpenZFS: System Administration 说明,目前只有 Illumos (也就是Solaris 11)在ZFS上完整实现了 iSCSI/NFS/SMB :

  • Linux平台OpenZFS同时实现了 NFS 和 SMB

  • FreeBSD凭爱OpenZFS只实现了 NFS

由于我是在FreeBSD上部署ZFS,所以Samba是单独安装软件包进行配置

安装

安装Samba
pkg install net/samba416

服务器配置

Samba配置文件是 /usr/local/etc/smb4.conf

/usr/local/etc/smb4.conf
[global]
workgroup = CLOUDATLAS
server string = Samba Server Version %v
netbios name = XCloud
wins support = Yes
security = user
passdb backend = tdbsam

# Example: share /usr/src accessible only to 'developer' user
[docs]
path = /zdata/docs
valid users = admin
writable  = yes
browsable = yes
read only = no
guest ok = no
public = no
create mask = 0666
directory mask = 0755
  • 设置用户密码(这里案例是 admin 用户):

设置 admin 用户密码
pdbedit -a -u admin
  • 修订 /etc/rc.conf 配置启动操作系统时启动Samba:

配置系统启动时启动Samba
samba_server_enable="YES"
  • 启动 samba:

启动Samba
service samba_server start

输出提示:

启动Samba提示信息
Performing sanity check on Samba configuration: OK
Starting nmbd.
Starting smbd.

备注

默认只启动 nmbdsmbd 服务。

如果要启动 winbindd 服务,则配置 /etc/rc.conf 添加:

添加 winbindd 服务启动
winbindd_enable="YES"

SMB/CIFS协议端口和iptables端口转发

在我的局域网实验环境中,提供Samba服务的FreeBSD(192.168.7.200)和桌面电脑(192.168.1.x)不是一个网段,所以需要通过一个Linux网关实现端口转发。

Samba所实现的SMB/CIFS协议端口可以通过 /etc/services 查到( grep -i NETBIOS /etc/services 以及 grep -i microsoft-ds /etc/services ):

Samba使用的服务端口
netbios-ns	137/tcp	   #NETBIOS Name Service
netbios-ns	137/udp	   #NETBIOS Name Service
netbios-dgm	138/tcp	   #NETBIOS Datagram Service
netbios-dgm	138/udp	   #NETBIOS Datagram Service
netbios-ssn	139/tcp	   #NETBIOS Session Service
netbios-ssn	139/udp	   #NETBIOS Session Service

microsoft-ds	445/tcp
microsoft-ds	445/udp

以上述端口 138 为例配置端口转发:

iptables端口转发案例
sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"

# 提供samba的服务器IP地址: 192.168.7.200
# 提供Linux网关转发的局域网IP地址: 192.168.7.221
sudo iptables -t nat -A PREROUTING -p tcp --dport 138 -j DNAT --to-destination 192.168.7.200:138
sudo iptables -A FORWARD -p tcp -d 192.168.7.200 --dport 138 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
sudo iptables -t nat -A POSTROUTING -p tcp -d 192.168.7.200 --dport 138 -j SNAT --to-source 192.168.7.221

为了能够快速完成设置,使用如下脚本:

iptables端口转发脚本
sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"

gw_host=192.168.7.221
smb_host=192.168.7.200

for smb_port in 137 138 139 445; do
    for protocol in tcp udp; do

        sudo iptables -t nat -A PREROUTING -p ${protocol} --dport ${smb_port} -j DNAT --to-destination ${smb_host}:${smb_port}
        sudo iptables -A FORWARD -p ${protocol} -d ${smb_host} --dport ${smb_port} -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
        sudo iptables -t nat -A POSTROUTING -p ${protocol} -d ${smb_host} --dport ${smb_port} -j SNAT --to-source ${gw_host}

    done
done

异常排查

我在使用macOS连接访问FreeBSD的samba服务,遇到非常奇怪的问题,提示连接,但是仅显示第一层目录之后就一直转菊花。观察后台

smbd.log 日志显示服务crash
[2025/06/29 10:45:27.441651,  0] ../../lib/util/fault.c:178(smb_panic_log)
  ===============================================================
[2025/06/29 10:45:27.441787,  0] ../../lib/util/fault.c:185(smb_panic_log)
  INTERNAL ERROR: async open timeout in smbd () (client [192.168.7.221]) pid 42783 (4.20.7)
[2025/06/29 10:45:27.441826,  0] ../../lib/util/fault.c:190(smb_panic_log)
  If you are running a recent Samba version, and if you think this problem is not yet fixed in the latest versions, please consider reporting this bug, see https://wiki.samba.org/index.php/Bug_Reporting
[2025/06/29 10:45:27.441875,  0] ../../lib/util/fault.c:191(smb_panic_log)
  ===============================================================
[2025/06/29 10:45:27.441910,  0] ../../lib/util/fault.c:193(smb_panic_log)
  PANIC (pid 42783): async open timeout in 4.20.7
[2025/06/29 10:45:27.443633,  0] ../../lib/util/fault.c:304(log_stack_trace)
  BACKTRACE: 20 stack frames:
   #0 0x129b613faec7 <log_stack_trace+0x37> at /usr/local/lib/samba4/private/libgenrand-private-samba.so
   #1 0x129b613faf9e <smb_panic+0xe> at /usr/local/lib/samba4/private/libgenrand-private-samba.so
   #2 0x129b55b7f324 <smbd_exit_server+0x1b4> at /usr/local/lib/samba4/private/libsmbd-base-private-samba.so
   #3 0x129b55b7f181 <smbd_exit_server+0x11> at /usr/local/lib/samba4/private/libsmbd-base-private-samba.so
   #4 0x129b5f7f1bcc <exit_server+0x1c> at /usr/local/lib/samba4/private/libsmbd-shim-private-samba.so
   #5 0x129b55b2a300 <delete_all_streams> at /usr/local/lib/samba4/private/libsmbd-base-private-samba.so
   #6 0x129b62b9bdff <tevent_common_invoke_timer_handler+0x18f> at /usr/local/lib/libtevent.so.0
   #7 0x129b62b9bfa4 <tevent_common_loop_timer_delay+0x94> at /usr/local/lib/libtevent.so.0
   #8 0x129b62b997c5 <tevent_context_same_loop+0xb15> at /usr/local/lib/libtevent.so.0
   #9 0x129b62b9536a <_tevent_loop_once+0xea> at /usr/local/lib/libtevent.so.0
   #10 0x129b62b955f2 <tevent_common_loop_wait+0x32> at /usr/local/lib/libtevent.so.0
   #11 0x129b55b44b4b <smbd_process+0x83b> at /usr/local/lib/samba4/private/libsmbd-base-private-samba.so
   #12 0x1293331ffaad <main+0x436d> at /usr/local/sbin/smbd
   #13 0x129b62b9667e <tevent_common_invoke_fd_handler+0x9e> at /usr/local/lib/libtevent.so.0
   #14 0x129b62b99a44 <tevent_context_same_loop+0xd94> at /usr/local/lib/libtevent.so.0
   #15 0x129b62b9536a <_tevent_loop_once+0xea> at /usr/local/lib/libtevent.so.0
   #16 0x129b62b955f2 <tevent_common_loop_wait+0x32> at /usr/local/lib/libtevent.so.0
   #17 0x1293331fe02f <main+0x28ef> at /usr/local/sbin/smbd
   #18 0x1293331fcc2c <main+0x14ec> at /usr/local/sbin/smbd
   #19 0x129b63c2de34 <__libc_start1+0x124> at /lib/libc.so.7
[2025/06/29 10:45:27.444092,  0] ../../source3/lib/dumpcore.c:310(dump_core)
  unable to change to %N.core
  refusing to dump core

我之前看到网上有人询问安装 net/samba419 为何会提示有软件包冲突,有人答复是因为当前整个FreeBSD系统是围绕 net/samba416 编译的依赖。果然,我回退到 net/samba416 之后就能够正常工作了。

参考