如何在Linux下部署Samba服務?

上古南城發表於2021-07-02

    

Samba簡介

  • Samba是在Linux和UNIX系統上實現SMB協議的一個免費軟體,由伺服器及客戶端程式構成。SMB(Server Messages Block,資訊服務塊)是一種在區域網上共享檔案和印表機的一種通訊協議,它為區域網內的不同計算機之間提供檔案及印表機等資源的共享服務。SMB協議是客戶機/伺服器型協議,客戶機通過該協議可以訪問伺服器上的共享檔案系統、印表機及其他資源。通過設定“NetBIOS over TCP/IP”使得Samba不但能與區域網路主機分享資源,還能與全世界的電腦分享資源。
  • Samba最大的功能就是可以用於Linux與windows系統直接的檔案共享和列印共享,Samba既可以用於windows與Linux之間的檔案共享,也可以用於Linux與Linux之間的資源共享。
  • Samba由兩個主要程式組成,它們是smbd和nmbd。這兩個守護程式在伺服器啟動到停止期間持續執行,功能各異。Smbd和nmbd使用的全部配置資訊全都儲存在smb.conf檔案中。Smb.conf向smbd和nmbd兩個守護程式說明輸出什麼以便共享,共享輸出給誰及如何進行輸出。
    • nmbd :這個 daemon 是用來管理工作組啦、NetBIOS name 啦等等的解析。主要利用 UDP 協議開啟 port 137, 138 來負責名稱解析的任務;
    • smbd :這個 daemon 的主要功能就是用來管理 SAMBA 主機分享的目錄、檔案與印表機等等。 主要利用可靠的 TCP 協議來傳輸資料,開放的埠為 139 及 445(不一定存在) 。
  • Samba提供了基於CIFS的四個服務:檔案和列印服務、授權與被授權、名稱解析、瀏覽服務。前兩項服務由smbd提供,後兩項服務則由nmbd提供。 簡單地說,smbd程式的作用是處理到來的SMB軟體包,為使用該軟體包的資源與Linux進行協商,nmbd程式使主機(或工作站)能瀏覽Linux伺服器。

在本教程中,將展示如何在CentOS 7上安裝Samba並將其配置為獨立伺服器,以通過網路在不同作業系統之間提供檔案共享。

環境準備

屬性 Samba服務端 Samba客戶端
節點 wencheng-smb windows10
系統 CentOS Linux release 7.5.1804 (Minimal) windows10 企業版
核心 3.10.0-862.el7.x86_64 windows10 企業版2019 x64
IP地址 172.16.70.185 172.16.70.50
SELinux setenforce 0 | disabled  

檢查安裝Samba

[root@wencheng-smb ~]# rpm -qa | grep samba
[root@wencheng-smb ~]# yum install -y samba
[root@wencheng-smb ~]# smbd -V
Version 4.10.16

 設定防火牆允許Samba策略

[root@wencheng-smb ~]# firewall-cmd --add-service samba --permanent
[root@wencheng-smb ~]# firewall-cmd --zone=public --add-port=137/udp --permanent
[root@wencheng-smb ~]# firewall-cmd --zone=public --add-port=138/udpp --permanent
[root@wencheng-smb ~]# firewall-cmd --zone=public --add-port=139/tcp --permanent
[root@wencheng-smb ~]# firewall-cmd --zone=public --add-port=445/tcp --permanent
[root@wencheng-smb ~]# firewall-cmd --reload
[root@wencheng-smb ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens33
  sources:
  services: ssh dhcpv6-client samba
  ports: 139/tcp 137/tcp 138/tcp 445/tcp
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

 情景一:配置匿名訪問, 任何人都可以訪問的共享目錄(允許上傳、刪除、修改檔案)。

[root@wencheng-smb ~]# mv /etc/samba/smb.conf /etc/samba/smb.conf_bak
[root@wencheng-smb ~]# vim /etc/samba/smb.conf
# See smb.conf.example for a more detailed config file or
# read the smb.conf manpage.
# Run 'testparm' to verify the config is correct after
# you modified it.

[global]
        workgroup = SAMBA    # 設定Samba Server所要加入的工作組或者域
        security = user     # 安全性等級share<user<domain 
        map to guest = Bad User  # 允許匿名使用者訪問
        log file = /var/log/samba/log.%m  # 日誌檔案路徑,巨集%m表示客戶端主機的Netbios名
        max log size = 50   # 每個log日誌的最大容量為50K ,單位是kb ,0代表不做限制
        display charset = UTF8

[public]
        comment = Share Directories  # 共享的描述
        path = /data/samba/shares/public  # 共享目錄的路徑
        public = yes    # 開啟共享
        writeable = yes  # 開啟寫許可權,預設只讀許可權
        create mask = 0640
        directory mask = 0755

[root@wencheng-smb ~]# testparm  # 測試smb.conf語法的正確性
Load smb config files from /etc/samba/smb.conf
Unknown parameter encountered: "max log siza"
Ignoring unknown parameter "max log siza"
Loaded services file OK.
Server role: ROLE_STANDALONE

Press enter to see a dump of your service definitions  # 直接回車

# Global parameters
[global]
    log file = /var/log/samba/log.%m
    map to guest = Bad User
    max log size = 50
    security = USER
    workgroup = SAMBA
    idmap config * : backend = tdb

[public]
    comment = Public Directories
    create mask = 0640
    writeable = yes
    path = /data/samba/shares/public
  read only = No
  • 建立共享資料夾,並設定許可權。
[root@wencheng-smb ~]# mkdir -p /data/samba/shares/public
[root@wencheng-smb ~]# mkdir /data/samba/shares/public/public{1..3}
[root@wencheng-smb ~]# touch /data/samba/shares/public/public{4..6}
[root@wencheng-smb ~]# ls /data/samba/shares/public/
public1  public2  public3  public4  public5  public6

[root@wencheng-smb ~]# chown nobody.nobody /data/samba/shares/public/
[root@wencheng-smb ~]# ls -ld /data/samba/shares/public/
drwxr-xr-x. 5 nobody nobody 96 May 25 16:07 /data/samba/shares/public/
  • 啟動Samba服務。
[root@wencheng-smb ~]# systemctl start smb.service nmb.service
[root@wencheng-smb ~]# systemctl enable smb.service nmb.service

[root@wencheng-smb ~]# netstat -nutpl | grep -E 'smbd|nmbd'
tcp        0      0 0.0.0.0:445             0.0.0.0:*               LISTEN      130587/smbd
tcp        0      0 0.0.0.0:139             0.0.0.0:*               LISTEN      130587/smbd
tcp6       0      0 :::445                  :::*                    LISTEN      130587/smbd
tcp6       0      0 :::139                  :::*                    LISTEN      130587/smbd
udp        0      0 172.16.70.255:137       0.0.0.0:*                           130591/nmbd
udp        0      0 172.16.70.185:137       0.0.0.0:*                           130591/nmbd
udp        0      0 0.0.0.0:137             0.0.0.0:*                           130591/nmbd
udp        0      0 172.16.70.255:138       0.0.0.0:*                           130591/nmbd
udp        0      0 172.16.70.185:138       0.0.0.0:*                           130591/nmbd
udp        0      0 0.0.0.0:138             0.0.0.0:*                           130591/nmbd

Win10客戶端測試連線。

  • Win + R 組合鍵,調出執行視窗 。

    

  •  輸入Samba伺服器IP。

    

  •  再次按 Win + R 組合鍵,調出執行視窗,並輸入:gpedit.msc 命令,確定或回車,可以快速開啟本地組策略編輯器。

    

  • 本地組策略編輯器視窗中,依次展開到:計算機配置 - 管理模板 - 網路 - Lanman 工作站,找到並雙擊開啟“啟用不安全的來賓登入”選項,並啟用。

    

  •  再次訪問Samba伺服器IP。

    

    

  •  可執行寫入,刪除操作。

    

 

情景二:配置使用者可以訪問多個部門的共享目錄。

[root@wencheng-smb samba]# cat smb.conf
# See smb.conf.example for a more detailed config file or
# read the smb.conf manpage.
# Run 'testparm' to verify the config is correct after
# you modified it.

[global]
	workgroup = SAMBA
	server string = WenCheng Samba Server Version %v
	netbios name = WenChengSamba
	security = user
	log file = /var/log/samba/log.%m
	max log size = 50
	map to guest = Bad User
	display charset = UTF8

[public]
	comment = Public Directories
	path = /data/samba/shares/public
	public = yes
	writeable = no    # 關閉匿名使用者寫許可權
	create mask = 0644
	directory mask = 0755
     write list = samba   # 只允許samba管理員使用者寫

[devops]
        comment = Devops Directories
        path = /data/samba/shares/devops
        public = no
	writable = yes
        create mask = 0640
        directory mask = 0750
	admin users = devops
        valid users = @devops,samba
        write list = @devops,samba

[market]
        comment = Market Directories
        path = /data/samba/shares/market
        public = no
	writable = yes
        create make = 0640
        directory mask = 0750
	admin users = market
        valid users = @market,samba
	write list = @market,samba

共享目錄說明:
  public :所有匿名使用者只可讀,samba管理員使用者可讀可寫
  devops : 只允許@devops,@samba組使用者可讀可寫
  market : 只允許@devops,@samba組使用者可讀可寫
  •  驗證smb.conf配置檔案,並重啟smb和nmb服務。
[root@wencheng-smb samba]# testparm
Load smb config files from /etc/samba/smb.conf
Unknown parameter encountered: "display charset"
Ignoring unknown parameter "display charset"
Unknown parameter encountered: "create make"
Ignoring unknown parameter "create make"
Loaded services file OK.
Server role: ROLE_STANDALONE

Press enter to see a dump of your service definitions

# Global parameters
[global]
    log file = /var/log/samba/log.%m
    map to guest = Bad User
    max log size = 50
    netbios name = WENCHENGSAMBA
    security = USER
    server string = WenCheng Samba Server Version %v
    workgroup = SAMBA
    idmap config * : backend = tdb

[public]
    comment = Public Directories
    create mask = 0640
    guest ok = Yes
    path = /data/samba/shares/public
    write list = samba

[devops]
    admin users = devops
    comment = Devops Directories
    create mask = 0644
    path = /data/samba/shares/devops
    read only = No
    valid users = @devops @samba
    write list = @devops @samba

[market]
    admin users = market
    comment = Market Directories
    path = /data/samba/shares/market
    read only = No
    valid users = @market @samb

[root@wencheng-smb ~]# systemctl restart smb nmb
  • 建立普通使用者及管理員賬號; 建立共享目錄;並分配給目錄相關許可權。
[root@wencheng-smb ~]# useradd -M -s /sbin/nologin samba      # Samba管理員
[root@wencheng-smb ~]# useradd -M -s /sbin/nologin devops      # devops部門管理員
[root@wencheng-smb ~]# useradd -M -s /sbin/nologin market      # market部門管理員
[root@wencheng-smb ~]# useradd -M -s /sbin/nologin -g devops user1  # devops部門使用者
[root@wencheng-smb ~]# useradd -M -s /sbin/nologin -g market user2  # market部門使用者

[root@wencheng-smb ~]# id samba
uid=1000(samba) gid=1000(samba) groups=1000(samba)
[root@wencheng-smb ~]# id devops
uid=1001(devops) gid=1001(devops) groups=1001(devops)
[root@wencheng-smb ~]# id market
uid=1002(market) gid=1002(market) groups=1002(market)
[root@wencheng-smb ~]# id user1
uid=1003(user1) gid=1001(devops) groups=1001(devops)
[root@wencheng-smb ~]# id user2
uid=1004(user2) gid=1002(market) groups=1002(market)

[root@wencheng-smb ~]# mkdir -p /data/samba/shares/{public,devops,market}
[root@wencheng-smb ~]# mkdir /data/samba/shares/public/public{1..3}
[root@wencheng-smb ~]# mkdir /data/samba/shares/devops/devops{1..3}
[root@wencheng-smb ~]# mkdir /data/samba/shares/market/market{1..3}
[root@wencheng-smb ~]# touch /data/samba/shares/market/market{4..6}
[root@wencheng-smb ~]# touch /data/samba/shares/devops/devops{4..6}
[root@wencheng-smb ~]# touch /data/samba/shares/public/public{4..6}
[root@wencheng-smb ~]# ls /data/samba/shares/*
/data/samba/shares/devops:
devops1  devops2  devops3  devops4  devops5  devops6
/data/samba/shares/market:
market1  market2  market3  market4  market5  market6
/data/samba/shares/public:
public1  public2  public3  public4  public5  public6

# 修改屬主屬組幾許可權
[root@wencheng-smb ~]# chown samba.samba /data/samba/shares/
[root@wencheng-smb ~]# chown devops.devops /data/samba/shares/devops/
[root@wencheng-smb ~]# chmod 775 /data/samba/shares/devops/
[root@wencheng-smb ~]# chown market.market /data/samba/shares/market/
[root@wencheng-smb ~]# chmod 775 /data/samba/shares/market/
[root@wencheng-smb ~]# chown nobody.nobody /data/samba/shares/public/
[root@wencheng-smb ~]# chmod 775 /data/samba/shares/public/

[root@wencheng-smb ~]# setfacl -m u:samba:rwx /data/samba/shares/*

[[root@wencheng-smb ~]# ls -ld /data/samba/shares/
drwxr-xr-x. 5 samba samba 48 May 28 10:09 /data/samba/shares/
[root@wencheng-smb ~]# ls -ld /data/samba/shares/*
drwxrwxr-x+ 5 devops devops 143 May 28 17:02 /data/samba/shares/devops
drwxrwxr-x+ 5 market market 143 May 28 17:02 /data/samba/shares/market
drwxrwxr-x+ 5 nobody nobody  96 May 28 10:06 /data/samba/shares/public

[root@wencheng-smb ~]# getfacl /data/samba/shares/*
getfacl: Removing leading '/' from absolute path names
# file: data/samba/shares/devops
# owner: devops
# group: devops
user::rwx
user:samba:rwx
group::rwx
mask::rwx
other::r-x

# file: data/samba/shares/market
# owner: market
# group: market
user::rwx
user:samba:rwx
group::rwx
mask::rwx
other::r-x

# file: data/samba/shares/public
# owner: nobody
# group: nobody
user::rwx
user:samba:rwx
group::rwx
mask::rwx
other::r-x

將現有的使用者新增到組。
usermod [-G] [GroupName] [UserName]
將現有的使用者新增到多個組
usermod [-G] [GroupName1,GroupName2] [UserName]

將現有使用者從組中移除。
gpasswd [-d] [UserName] [GroupName]
將現有多個使用者新增到組。
gpasswd [-M] [UserName1,UserName2] [GroupName]

pdbedit命令解析

pdbedit 命令用於管理Samba服務的帳戶資訊資料庫,格式為:"pdbedit [選項] 帳戶"
第一次把使用者資訊寫入到資料庫時需要使用-a引數,以後修改使用者密碼、刪除使用者等等操作就不再需要了。
 
 pdbedit -L :檢視samba使用者
 pdbedit -a -u user:新增samba使用者
 pdbedit -r -u user:修改samba使用者資訊
 pdbedit -x -u user:刪除samba使用者
 
 samba服務資料庫的密碼也可以用 smbpasswd 命令 操作
 smbpasswd -a user:新增一個samba使用者
 smbpasswd -d user:禁用一個samba使用者
 smbpasswd -e user:恢復一個samba使用者
 smbpasswd -x user:刪除一個samba使用者
  •  將使用者新增為Samba使用者,這裡以samba使用者為例,其他使用者類同,不再贅述。
[root@wencheng-smb ~]# pdbedit -a -u samba
Unknown parameter encountered: "display charset"
Ignoring unknown parameter "display charset"
new password:              # 登入samba密碼
retype new password:          # 再次確認輸入
Unix username:        samba
NT username:
Account Flags:        [U          ]
User SID:             S-1-5-21-2219792021-1567261761-1612575661-1000
Primary Group SID:    S-1-5-21-2219792021-1567261761-1612575661-513
Full Name:
Home Directory:       \\wenchengsamba\samba
HomeDir Drive:
Logon Script:
Profile Path:         \\wenchengsamba\samba\profile
Domain:               WENCHENGSAMBA
Account desc:
Workstations:
Munged dial:
Logon time:           0
Logoff time:          Wed, 06 Feb 2036 23:06:39 CST
Kickoff time:         Wed, 06 Feb 2036 23:06:39 CST
Password last set:    Fri, 28 May 2021 12:24:14 CST
Password can change:  Fri, 28 May 2021 12:24:14 CST
Password must change: never
Last bad password   : 0
Bad password count  : 0
Logon hours         : FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

[root@wencheng-smb ~]# pdbedit -L    # 檢視samba使用者
Unknown parameter encountered: "display charset"
Ignoring unknown parameter "display charset"
samba:1000:
devops:1001:
market:1002:
user1:1003:
user2:1004:
  •  Win10測試連線Samba共享目錄。

     

  •  “public”資料夾允許所有使用者可直接開啟,但無法上傳,刪除操作。

    

  • 訪問“devops”資料夾需賬號密碼。

    

Win10本機訪問samba時用切換另一個使用者登入。

方法如下:
1)按鍵ctrl+r,開啟"執行",輸入"cmd"
2)輸入命令"net use * /delete",接著輸入"Y",即先取消所有的net 連線

     

  •   “devops”資料夾只允許devops使用者及其組的使用者(user1),samba管理員上傳,刪除操作。

    

  •  “market”資料夾只允許market使用者及其組的使用者(user2),samba管理員上傳,刪除操作。

    

  • “pbulic”資料夾只允許samba管理員上傳,刪除操作。

    

 至此,已實現Samba + Windows 檔案共享。

相關文章