Samba是在Linux和UNIX系統上實現SMB協議的一個免費軟件,由服務器及客戶端程序構成。SMB(Server Messages Block,信息服務塊)是一種在局域網上共享文件和打印機的一種通信協,下面我們來看Samba服務器的搭建理論篇
一、Samba與NFS、ftp
在了解Samba服務之前,需要先了解一下cifs協議(Common Internet File System),該協議最早是微軟搞出來的一個協議。cifs 協議最早實現的是window主機之間的文件共享與打印共享,并不支持在linux上運行,samba是由Andrew Tridgell工程師通過逆向工程實現的一個cifs協議軟件。通過該包可以實現windows和linux之間的文件共享。這和NFS的走的路剛好相反,NFS最初只支持在類unix系統上運行,后被windows也學了去,所以OS并不能簡單的說誰好誰壞,很多東西都是互相借鑒的。
Samba與NFS較ftp的一個好處就是可以將遠程盤或掛載點映射到本機上,每次可以像本地編輯一樣編輯文件。而ftp需要先下載到本地修改后再上傳。
二、samba相關包與程序
1、samba程序包
目前samba 在源里默認的是samba 4.x版本,主要使用的相關軟件包有:
- # yum list|grep samba
- samba.x86_64 4.1.12-21.el7_1 @base
- samba-common.x86_64 4.1.12-21.el7_1 @base
- samba-libs.x86_64 4.1.12-21.el7_1 @base
- samba-client.x86_64 4.1.12-21.el7_1 base
- samba-python.x86_64 4.1.12-21.el7_1 base
- samba-winbind.x86_64 4.1.12-21.el7_1 base
- samba-winbind-modules.x86_64 4.1.12-21.el7_1 base
samba服務相關的配置主要是samba、samba-common、samba-client三個包和cifs-utils包,具體三個包的作用如下:
samba:主要提供了smb服務所需的格項服務程序如smbd和nmbd及與samba相關的eventlogadm程序;
samba-client:該包主要提供了samba client掛載使用的相關程序,如smbpasswd、smbtree等;
cifs-utils:mount掛載時需要該包來支持cifs協議,不安裝該包就沒有mount.cifs命令。使用mount掛載時也會有報錯;
smba-common: 該包提供了samba服務的主配置文件smb.conf、lmhosts文件、 pdbedit用戶相關和testparm語法檢查指令等。
2、samba相關文件與程序
/etc/samba/smb.conf:samba服務的主配置文件;
/etc/samba/lmhosts:NetBIOS Name與IP的對應關系,做用類似于/etc/hosts,一般無需配置;
/etc/sysconfig/samba: smbd, nmbd服務自定義參數配置文件;
/etc/samba/smbusers:windows與linux的用戶不一致,可以通過該文件進行對應映射,在新版本中默認不存在,代替的是username map參數,通過該參數可以指定具體的映射文件;
/var/lib/samba/private/{passdb.tdb,secrets.tdb}:samba用戶和密碼數據庫文件;
/usr/bin/{tdbdump,tdbtool}: Samba 3.0以后,默認使用tdb庫(Trivial DataBase),這兩個命令用于查看和操作tdb庫,不過查看出的結果有點類似于16進制的數據,一般不使用,需安裝 tdb-tools 包;
/usr/bin/{smbpasswd,pdbedit}:smbpasswd命令用于創建samba用戶和修改密碼,類型于passwd命令的功能。Samba 3.0后使用pdb庫,pdbedit命令為新版本中的samba用戶信息管理命令;
/usr/bin/testparm:用于測試smb.conf語法的正確性。
/usr/bin/smbclient:可以交互式管理samba共享的資源,有點類似于ftp命令;
/usr/bin/nmblookup:Netblos查詢工具,類似于nslookup的功能;
/usr/bin/smbtree:查看網絡中的工作組與主機名等,有點類似于windows中的網上鄰居。
使用示例:
1、tdbdump
- # tdbdump passdb.tdb
- {
- key(13) = "RID_000003e8/00"
- data(6) = "usera/00"
- }
- {
- key(11) = "USER_usera/00"
- data(182) = "/00/00/00/00/7F/A9T|/7F/A9T|/00/00/00/00bd/F5U/00/00/00/00/7F/A9T|/06/00/00/00usera/00/04/00/00/00WWW/00/01/00/00/00/00/01/00/00/00/00/00/00/00/00/00/00/00/00/00/00/00/00/00/00/00/00/01/00/00/00/00/01/00/00/00/00/01/00/00/00/00/01/00/00/00/00/E8/03/00/00/01/02/00/00/00/00/00/00/10/00/00/00/E5/81/0F</99/AE*/BB/222/ED/84X/A6/13/09/00/00/00/00/10/00/00/00/A8/00/15/00/00/00 /00/00/00/FF/FF/FF/FF/FF/FF/FF/FF/FF/FF/FF/FF/FF/FF/FF/FF/FF/FF/FF/FF/FF/00/00/00/00/00/00/00/00/00/00/00/00/00/00/00/EC/04/00/00"
- }
- {
- key(19) = "INFO/minor_version/00"
- data(4) = "/00/00/00/00"
- }
- {
- key(9) = "NEXT_RID/00"
- data(4) = "/E9/03/00/00"
- }
- {
- key(13) = "INFO/version/00"
- data(4) = "/04/00/00/00"
- }
2、tdbtool
- # tdbtool passdb.tdb
- tdb> list
- hash=23
- rec: hash=23 offset=0x00001e38 next=0x00000000 rec_len=28 key_len=13 data_len=6 full_hash=0xc6948dbc magic=0x26011999
- hash=33
- rec: hash=33 offset=0x00001e6c next=0x00000000 rec_len=228 key_len=11 data_len=182 full_hash=0x41061b85 magic=0x26011999
- hash=52
- rec: hash=52 offset=0x00001f68 next=0x00000000 rec_len=32 key_len=19 data_len=4 full_hash=0x538a9285 magic=0x26011999
- hash=65
- rec: hash=65 offset=0x00001fd4 next=0x00000000 rec_len=20 key_len=9 data_len=4 full_hash=0x70a13a4c magic=0x26011999
- hash=103
- rec: hash=103 offset=0x00001fa0 next=0x00000000 rec_len=28 key_len=13 data_len=4 full_hash=0xf2394cd5 magic=0x26011999
- freelist:
3、smbpasswd與pdbedit
創建samba用戶前,需要用戶先在本地中存在
# useradd -G users smb1
# useradd -G users smb2
# echo 361way.com | passwd --stdin smb1
# echo 361way.com | passwd --stdin smb2
使用smbapsswd創建:
smbapsswd常用項:
-a:創建新用戶,不加-a 參數直接跟用戶為修改用戶密碼;
-c:指定密碼文件生成的位置;
-x:刪除用戶;
-d:臨時禁用一個用戶;
-e:enable一個用戶;
-D:指定debug級別;
-n:設置一個用戶的密碼為空,用戶使用空密碼需在smb.conf的global 項配置中null passwords = yes ;
# smbpasswd -a smb1
New SMB password:
Retype new SMB password:
Added user smb1.
使用pdbedit命令創建:
pdbedit常用選項:
-L :列出samba用戶與信息;
-v :需要搭配 -L 執行,可列出更多的信息;
-w :需要搭配 -L 執行,使用舊版的 smbpasswd 格式來顯示信息;
-a :新增samba用戶;
-r :修改一個用戶的信息,需搭配很多特殊參數,請man pdbedit;
-x :刪除一個可使用 用戶,可先用 -L 找到用戶后再?h除;
- # pdbedit -a -u smb2
- new password:
- retype new password:
- Unix username: smb2
- NT username:
- Account Flags: [U ]
- User SID: S-1-5-21-1462619673-710706269-1943266961-1002
- Primary Group SID: S-1-5-21-1462619673-710706269-1943266961-513
- Full Name:
- Home Directory:
- //www/smb2
- HomeDir Drive:
- Logon Script:
- Profile Path:
- //www/smb2/profile
- Domain: WWW
- 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: Sun, 13 Sep 2015 21:09:45 CST
- Password can change: Sun, 13 Sep 2015 21:09:45 CST
- //Vevb.com
- Password must change: never
- Last bad password : 0
- Bad password count : 0
- Logon hours : FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
pdbedit 是一個新的指令,但無法修改用戶密碼,所以還是無法完全替代smbpasswd的作用.
4、testparm
testparm是一個語法測試命令,具體用法如下:
- # testparm
- Load smb config files from /etc/samba/smb.conf
- rlimit_max: increasing rlimit_max (1024) to minimum Windows limit (16384)
- Processing section "[homes]"
- Processing section "[printers]"
- Processing section "[public]"
- Loaded services file OK.
- Server role: ROLE_STANDALONE
- Press enter to see a dump of your service definitions
- [global]
- workgroup = MYGROUP
- server string = Samba Server Version %v
- map to guest = Bad User
- log file = /var/log/samba/log.%m
- max log size = 50
- load printers = No
- idmap config * : backend = tdb
- cups options = raw
- [homes]
- ……………………略
5、smbclient
smbclient有兩個功能,一個是查詢功能,一個是類似于ftp交互式管理功能,如下:
smbclient查詢當前的共享信息
- # smbclient -L 192.168.0.109
- Enter root's password:
- Domain=[MYGROUP] OS=[Unix] Server=[Samba 4.1.12]
- Sharename Type Comment
- --------- ---- -------
- public Disk Public dir
- IPC$ IPC IPC Service (Samba Server Version 4.1.12)
- Domain=[MYGROUP] OS=[Unix] Server=[Samba 4.1.12]
- Server Comment
- --------- -------
類ftp交互管理的用法
- # smbclient '//192.168.0.109/public' -U smb1
- Enter smb1's password:
- Anonymous login successful
- Domain=[MYGROUP] OS=[Unix] Server=[Samba 4.1.12]
- smb: /> dir
# 我可以使用 dir, get, put 等常用的 ftp 指令來進行文件傳輸
- ? :列出所有可以用的指令,常用!
- cd :切換目錄
- del : 刪除文件
- lcd : 改變本機目錄
- ls : 查看samba共享目錄下的文件信息
- dir : 與s 相同
- get : 下載文件
- mget: 多個文件下載
- mput: 多個文件上傳
- put :單個文件上傳
- rm : 刪除文件
- exit: 退出
# 內部更多指令可以?號查看,也可以 man smbclient 獲取.
6、smbtree
- # smbtree
- Enter root's password:
- WORKGROUP
- //YNNYCSK9X26EZUE //我的win7主機在這里也查看到了
- MYGROUP
- //WWW Samba Server Version 4.1.12
7、客戶端mount
mount.cifs或mount -t cifs常用參數有(-o后面帶的部分):
username=登陸用戶名,例如 username=smb1 ;
password=登陸密碼:與上面 username 對應;
iocharset=本機的默認編碼,如utf8 或 gb2312等;
codepage=提供samba服務的遠程主機的編碼方式,例如windows下繁體中文為cp950、簡體中文為cp936 。
linux客戶端下的掛載
# mount -t cifs //192.168.1.109/smb1 /mnt/samba /
-o username=smb1,password=361way.com,codepage=cp936
windows客戶端下的掛載,也可以在開始--運行中輸入//ip
NET USE Q: //192.168.0.109/public
net use H: //192.168.0.109/shareFile "password" /user:"username"
注:需要注意的是linux與win下掛載時,使用的斜扛方向是有區別的。
8、smbstatus
用于查看當前連接到服務端的客戶端主機信息:
- # smbstatus
- Samba version 4.1.12
- PID Username Group Machine
- -------------------------------------------------------------------
- 2894 nobody nobody 192.168.0.104 (ipv4:192.168.0.104:50709)
- Service pid machine Connected at
- -------------------------------------------------------
- public 2894 192.168.0.104 Sun Sep 13 21:40:04 2015
- No locked files
三、samba服務配置
/etc/samba/smb.conf配置文件:
- [global]
- workgroup = MYGROUP //工作組
- netbios name = 361way //netbios名
- server string = Samba Server Version %v //服務器字符串,可任意寫
- unix charset = utf8 //linux下使用的編碼
- display charset = utf8 //本機顯示的編碼
- dos charset = cp936 //win下使用的編碼
- log file = /var/log/samba/log.%m //日志文件位置
- # maximum size of 50KB per log file, then rotate:
- max log size = 50
- security = user
- passdb backend = tdbsam //指定用戶名密碼存儲的數據格式
- passdb backend = tdbsam:/etc/samba/private/passdb.tdb //指定密碼文件的位置
- passdb backend = ldapsam:"
- ldap://ldap-1.example.com
- ldap://ldap-2.example.com
- " //使用ldap認證,后面的是備用節點
- map to guest = Bad User //開啟匿名訪問
- interfaces = lo eth0 192.168.12.2/24 192.168.13.2/24 //監聽的本機端口和使用IP,默認監聽所有
- hosts allow = 192.168.12. 192.168.13. EXCEPT 192.168.12.100 //允許連接的IP網段,默認允許所有
- cluster addresses = 10.0.0.1 10.0.0.2 10.0.0.3 集群設置
- username map = /usr/local/samba/lib/users.map //用戶名對應關系映射
- logon drive = K: //windows自動掛載時映射的本地盤符名
- logon script = startup.bat //客戶端訪問后自動執行的腳本程序
- time server = yes //自動讓 Windows主機 與 Samba 服務器時間同步
- admin users = root //預設的管理用戶
- logon path =
- //%N/%U/profile
- //使用者的個人化設定
- logon home =
- //%N/%U
- //使用者的家目錄位置!
- set quota command = /usr/local/sbin/set_quota //磁盤配額相關
- load printers = yes //開啟打印機共享
- cups options = raw
- # obtain a list of printers automatically on UNIX System V systems:
具體共享項的常用選項
[共享名稱]
comment=提示性信息
path=具體共享的目錄路徑
browseable=是否讓所用使用者查看,yes或no
writable=是否有寫入權限,yes或no
writelist = 使用者,@群? 除了@,還有+、&兩個符號
上面的選項中大部分我都進行了注解,這里再選取幾個典型的部分細說下.
security = user :在老的版本中,可選項中有security = share、user、domain,share即開啟匿名防問,在新的版本中該項由于安全考慮被取消掉了。默認是user,想開啟匿名防問加后面的map to guest行。新版本中的security 后面可以跟的有AUTO、USER、DOMAIN、ADS(windows AD域);
logon script = startup.bat :自動執行腳本,多用于windows客戶端訪問后,自動將訪問目錄映射為本地盤,如這里使用腳本內容為:
net time //192.168.0.109 /set /yes
net use K: /samba 或
NET USE Q: //192.168.0.109/public
需要注意的是上面的內容需要在windows下編輯,如果使用linux下編輯,需要使用unix2dos命令進行轉換。
更多配置部分請使用man smb.conf查看。
四、防火墻與selinux
防火墻上需要放行的端口有UDP 137、138--nmbd服務占用、TCP的139、445 --smbd服務使用:
- # netstat -ntlup|grep mb
- tcp 0 0 0.0.0.0:139 0.0.0.0:* LISTEN 2483/smbd
- tcp 0 0 0.0.0.0:445 0.0.0.0:* LISTEN 2483/smbd
- tcp6 0 0 :::139 :::* LISTEN 2483/smbd
- tcp6 0 0 :::445 :::* LISTEN 2483/smbd
- udp 0 0 192.168.0.255:137 0.0.0.0:* 2489/nmbd
- udp 0 0 192.168.0.109:137 0.0.0.0:* 2489/nmbd
- udp 0 0 0.0.0.0:137 0.0.0.0:* 2489/nmbd
- udp 0 0 192.168.0.255:138 0.0.0.0:* 2489/nmbd
- udp 0 0 192.168.0.109:138 0.0.0.0:* 2489/nmbd
- udp 0 0 0.0.0.0:138 0.0.0.0:* 2489/nmbd
使用用下面的命令放行:
firewall-cmd --permanent --add-port=137-138/udp
firewall-cmd --permanent --add-port=139/tcp --add-port=445/tcp
firewall-cmd --reload
selinux相關項在/etc/samba/smb.conf的注釋部分都有說明,如下:
修改共享目錄的上下文件為samba_share模式
#chcon -t samba_share_t /test
系統目錄需要讀寫時需要開啟:
# setsebool -P samba_export_all_ro on
# setsebool -P samba_export_all_rw on
home目錄共享時需要
#setsebool -P samba_enable_home_dirs on
域控制時需要使用(一般用不到)
# setsebool -P samba_domain_controller on
新聞熱點
疑難解答