Samba 是 Linux/Unix 實現與 Windows 互操作文件/打印共享的標準方案。本文系統梳理 Samba 核心架構、smb.conf 關鍵參數、共享類型 (用戶家目錄、公共目錄、打印機)、用戶認證體系 (tdbsam/ldapsam/ads)、ACL 精細權限控制、SELinux 布爾值與上下文配置、客戶端掛載 (smbclient/cifs)、防火牆策略、高可用 (CTDB) 入門,構建生產級跨平台文件服務完整知識體系。
| 進程 | 功能 | 端口 | 備註 |
|---|---|---|---|
| smbd | 文件/打印共享核心服務、用戶認證、授權 | TCP 139, 445 | 每連接一進程 |
| nmbd | NetBIOS 名稱解析、瀏覽服務、主機宣告 | UDP 137, 138 | WINS 服務器/客戶端 |
| winbindd | AD 域用戶/組映射、NSS/PAM 整合、單點登入 | TCP 445 (AD) | 需加入域 |
[global]
workgroup = MYDOMAIN # 工作組/域名
realm = MYDOMAIN.COM # Kerberos Realm (AD 模式)
security = ads # 安全模式: user/ads/domain/server/share
password server = DC.MYDOMAIN.COM # AD 模式指定 DC
dedicated keytab file = /etc/krb5.keytab # AD Kerberos keytab
server string = Samba File Server %v
netbios name = FILESRV01
interfaces = lo eth0 192.168.10.0/24 # 監聽介面
bind interfaces only = yes
hosts allow = 127. 192.168.10. 10.0.0. # 白名單
hosts deny = 0.0.0.0/0
log file = /var/log/samba/%m.log
max log size = 50000
logging = file syslog@0
# 字符集
unix charset = UTF-8
dos charset = CP936
# 性能調優
socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
use sendfile = yes
aio read size = 16384
aio write size = 16384
# 文件系統特性支援
vfs objects = acl_xattr full_audit recycle
recycle:repository = .recycle/%U
recycle:keeptree = yes
recycle:versions = yes
full_audit:prefix = %u|%I|%m|%S
full_audit:success = mkdir rename unlink pwrite
full_audit:failure = none
full_audit:facility = local7
full_audit:priority = NOTICE
| 模式 | 適用場景 | 認證方式 | 優/缺點 |
|---|---|---|---|
| user (默認) | 獨立文件服務器 | 本地 tdbsam 數據庫 | 簡單、無域依賴、用戶管理分散 |
| ads | 加入 AD 域企業環境 | Kerberos + AD LDAP | 單點登入、集中管理、需 winbindd、配置複雜 |
| domain | NT4 域 (舊) | 域控制器驗證 | 已棄用 |
| server | 委託其他 Samba 服務器驗證 | 遠程 SMB 會話 | 單點故障、不推薦 |
| share | 匿名只讀共享 (極不安全) | 無認證 | 已棄用、極高風險 |
[homes]
comment = Home Directory of %U
browseable = no
read only = no
create mask = 0600
directory mask = 0700
valid users = %S
vfs objects = acl_xattr
[dept_share]
comment = Department Shared Storage
path = /srv/samba/dept
browseable = yes
read only = no
# 基於 POSIX ACL + Windows ACL 映射
vfs objects = acl_xattr
# 強制創建文件屬組
force group = @deptgroup
# 只有 @deptgroup 成員可寫,其他人只讀
write list = @deptgroup
# 訪問控制 (配合 hosts allow)
valid users = @deptgroup, @management
[software]
comment = Software Repository (Read-Only)
path = /srv/samba/software
browseable = yes
read only = yes
guest ok = yes
force user = nobody
[printers]
comment = All Printers
path = /var/spool/samba
printable = yes
browseable = no
guest ok = no
read only = yes
create mask = 0700
# 添加系統用戶 (必須先有系統賬號)
useradd -s /sbin/nologin -M smbuser1
# 設置 Samba 密碼 (獨立於系統密碼)
smbpasswd -a smbuser1
# 啟用/禁用/刪除
smbpasswd -e smbuser1
smbpasswd -d smbuser1
smbpasswd -x smbuser1
# 列出用戶
pdbedit -L -v
# 1. 確保 DNS、時間同步 (ntpdate DC_IP)
# 2. 配置 Kerberos /etc/krb5.conf
# 3. 加入域
net ads join -U administrator%Password
# 4. 啟動 winbindd
service winbindd start; chkconfig winbindd on
# 5. 配置 NSS/PAM 解析域用戶
authconfig --enablewinbind --enablewinbindauth --update
# 6. 測試
wbinfo -u # 列出域用戶
getent passwd domain\\user
# /etc/fstab 掛載選項加 user_xattr,acl
/dev/sdb1 /srv/samba ext4 defaults,user_xattr,acl 0 0
mount -o remount /srv/samba
# 目錄默認 ACL (繼承)
setfacl -R -m d:u::rwx,d:g::rwx,d:o:--- /srv/samba/dept
# 用戶/組具體權限
setfacl -R -m u:alice:rwx,g:deptgroup:rwx,o:--- /srv/samba/dept
# 查看
getfacl /srv/samba/dept
在共享定義中添加 vfs objects = acl_xattr,Samba 會自動將 Windows 客戶端通過「屬性→安全」設置的 ACL 寫入文件擴展屬性 (system.posix_acl_access/default),並反向映射給 Windows 顯示,實現雙向同步。
# 1. 共享目錄打標
semanage fcontext -a -t samba_share_t "/srv/samba(/.*)?"
restorecon -Rv /srv/samba
# 2. 開放家目錄訪問 (如需共享 ~)
setsebool -P samba_enable_home_dirs on
setsebool -P use_samba_home_dirs on
# 3. 允許匿名寫入 (如 [software] guest ok=yes 需寫入)
setsebool -P allow_smbd_anon_write on
# 4. 允許 Samba 域控制器功能 (ADS 模式)
setsebool -P samba_domain_controller on
# 5. 查看所有 Samba 相關布爾值
getsebool -a | grep samba
# 手動掛載
mount -t cifs //192.168.10.50/dept_share /mnt/share \
-o username=alice,domain=MYDOMAIN,vers=3.0,sec=ntlmssp,uid=1000,gid=1000
# /etc/fstab 自動掛載 (憑證文件避免明文密碼)
//192.168.10.50/dept_share /mnt/share cifs credentials=/etc/samba/cred,vers=3.0,sec=ntlmssp,uid=1000,gid=1000 0 0
# /etc/samba/cred (chmod 600)
username=alice
password=SecretPass
domain=MYDOMAIN
\\192.168.10.50 訪問net use Z: \\192.168.10.50\dept_share /user:MYDOMAIN\alice *
# firewalld
firewall-cmd --permanent --add-service=samba
firewall-cmd --permanent --add-service=samba-client
firewall-cmd --reload
# iptables 精細控制 (僅允許特定網段)
iptables -A INPUT -s 192.168.10.0/24 -p tcp -m multiport --dports 139,445 -j ACCEPT
iptables -A INPUT -s 192.168.10.0/24 -p udp -m multiport --dports 137,138 -j ACCEPT
iptables -A INPUT -p tcp -m multiport --dports 139,445 -j REJECT
iptables -A INPUT -p udp -m multiport --dports 137,138 -j REJECT
service iptables save
多節點 Samba 共享同一存儲 (GFS2/OCFS2/NFS),CTDB 管理 IP 漂移、TDB 數據庫同步、節點健康檢查,實現 Active-Active 文件服務高可用。核心配置:/etc/ctdb/nodes (節點私網 IP)、/etc/ctdb/public_addresses (浮動公網 IP)、共享掛載點 /etc/sysconfig/ctdb 指定。生產部署建議參考 Red Hat GFS2 + CTDB 官方文檔。
Samba 部署的核心難點在於 安全模式選型 (user vs ads)、ACL 雙向映射 (vfs acl_xattr)、SELinux 上下文與布爾值、跨平台字符集 (UTF-8/CP936)、AD 域整合 (winbindd/Kerberos)。掌握 smb.conf 結構化配置、smbpasswd/pdbedit/wbinfo 用戶管理、setfacl/getfacl 權限調試、semanage/restorecon SELinux 共存、mount.cifs 客戶端掛載參數,即可構建安全、高性能、易維護的企業級跨平台文件共享服務。