在一般的區域網路中 (LAN) 如果都是 Windows 電腦,那麼使用『網路上的芳鄰』這個功能,就可以讓不同的 Windows 電腦分享彼此的檔案囉!那麼萬一這個 LAN 裡面有個 Linux 主機時,我怎麼讓 Linux 也加入這個 Windows 電腦當中的『網路上的芳鄰』呢?!也就是說,讓 Windows 電腦可以透過『網路上的芳鄰』來存取 Linux 主機上面的檔案!呵呵!那就是 SAMBA 這個伺服器的主要目的了!SAMBA 是很有用的一個伺服器,他可以讓您的 Linux 剎那間成為一個檔案伺服器 ( File Server ),並提供整個 LAN 裡面的 Windows 很簡單的就可以對 Linux 主機進行檔案的存取動作。不僅如此, SAMBA 也可以讓 Linux 上面的印表機成為印表機伺服器 (Printer Server) ,鳥哥個人覺得, SAMBA 對於整個 LAN 的貢獻真的是很大!那麼就趕緊來玩一玩吧! ^_^ |
原理:
:SAMBA 的發展歷史與名稱的由來
:SAMBA 的應用功能
:NetBIOS 通訊協定
:SAMBA 使用的 daemons
:連線模式的介紹 ( peer/peer, domain model )
套件安裝:
:使用 RPM
:使用 Tarball
Server 端的設定:
:SAMBA 的套件結構
:主機的規劃技巧建議
:基礎的設定流程與 smb.conf 的主要規劃
:沒有防備的 SAMBA 分享檔案設定 ( testparm )
:設定需要使用者登入的 Workgroup ( smbpasswd )
:設定較大型網域的 Linux Samba PDC ( Primary Domain Controller )主機
:設定成為印表機伺服器 ( Printer Server + LPRng 系統)
:設定成為印表機伺服器 ( Printer Server + CUPS 系統)
Client 端的設定:
:在 Windows 上瀏覽 Linux 分享檔案的設定
:在 Linux 上瀏覽 Windows 分享檔案的設定
安全相關方面:
:配合 quota 來規範使用者的使用空間
:如何設定防火牆 iptables
:如何設定 daemons 的抵擋功能 ( hosts allow 項目 )
:要備份些什麼咚咚?
問題克服:
:重點在登入者身份的確認與該身份的 Linux 檔案權限吶!
:什麼是 SWAT ( Samba Web Administration Tool )
重點回顧
本章與 LPI 的關係
參考資源:
本章習題練習
原理:
- 在這個章節中,我們要教大家跳的是熱情有勁的巴西 SAMBA
舞蹈.....喔不~搞錯了~是要向大家介紹 SAMBA
這個好用的伺服器啦!咦!怪了!怎麼伺服器的名稱會使用 SAMBA 呢?還真是怪怪的呢!那麼這個
SAMBA 伺服器的功能是什麼呢?另外,他最早是經由什麼樣的想法而開發出來的呢?呵呵!底下就讓我們慢慢的談一談吧!
- 分享檔案與印表機服務;
- 可以提供使用者登入 SAMBA 主機時的身份認證,以提供不同身份者的個別資料;
- 可以進行 Windows 網路上的主機名稱解析 (NetBIOS name)
- 可以進行裝置的分享 ( 例如 Zip, CDROM... )
- 當我們想要登入某部 Windows 主機使用他所提供的檔案資料時,必需要加入該 Windows 主機的群組 ( Workgroup ),並且我們的機器也必需要設定一個主機名稱,注意喔,這個主機名稱跟 Hostname 是不一樣的,因為這個主機名稱是架構在 NetBIOS 協定上的,我們可以簡單的稱呼他為 NetBIOS Name 好了。在同一個群組當中,NetBIOS Name 必需要是獨一無二的喔!
- 好了,等到我們登入該主機之後,能不能使用該主機所提供的檔案資料還要看 Windows 主機有沒有提供我們使用的權限吶!所以,並不是登入該 Windows 主機之後,我們就可以無限制的取用該主機的檔案資源了。也就是說,如果對方主機允許你登入,但是卻沒有開放任何資源讓您取用,呵呵,登入主機也無法查看對方的硬碟裡面的資料的啦!
- smbd :這個 daemon 的主要功能就是用來管理 SAMBA 主機分享什麼目錄、檔案與印表機等等的內容。
- nmbd :這個 daemon 則是用來管理群組啦、NetBIOS name 啦等等的解析。
- peer/peer ( Workgroup model ) :
- domain model :
SAMBA 的發展歷史與名稱的由來
在早期的網路世界當中,檔案資料在不同主機之間的傳輸大多是使用 FTP 這個好用的伺服器軟體來進行傳送。不過,使用 FTP 傳輸檔案卻有個小小的問題,那就是您無法直接修改主機上面的檔案資料!也就是說,您想要更改 Linux 主機上面的某個檔案時,必需要由 Server 端將該檔案下載到您工作的 Client 端後才能修改,也因此該檔案在 Server 與 Client 端都會存在。這個時候,萬一如果有一天您修改了某個檔案,卻忘記將資料上傳回主機,那麼等過了一陣子之後,呵呵,您如何知道那個檔案才是最新的?!
既然有這樣的問題,那麼好吧,我可不可以在 Client 端的機器上面直接取用 Server 上面的檔案,如果可以在 Client 端直接進行 Server 端檔案的存取,那麼我在 Client 端就不需要存在該檔案資料囉,也就是說,我只要有 Server 上面的檔案資料存在就可以啦!有沒有這樣的檔案系統啊 ( File System ) ,呵呵!很高興的是,前面我們已經提過的 Network File System, NFS 就是這樣的檔案系統之一啦!我只要在 Client 端將 Server 所提供分享的目錄掛載進來,那麼在我 Client 的機器上面就可以直接取用 Server 上的檔案資料囉,而且,該資料就像是我 Client 端上面的 partition 一般,真是好用!而除了可以讓 Unix Like 的機器互相分享檔案的 NFS 伺服器之外,在微軟 ( Microsoft ) 上面也有類似的檔案系統,那就是 Common Internet File System, CIFS 這個咚咚啦!CIFS 最簡單的想法就是目前常見的『網路上的芳鄰』咯! Windows 系統的電腦可以透過桌面上『網路上的芳鄰』來分享別人所提供的檔案資料哩!真是方便。不過,NFS 僅能讓 Unix 機器溝通, CIFS 只能讓 Windows 機器溝通。傷腦筋,那麼有沒有讓 Windows 與 Unix-Like 這兩個不同的平台相互分享檔案資料的檔案系統呢?
在 1991 年一個名叫 Andrew Tridgwell 的大學生就有這樣的困擾,他手上有三部機器,分別是跑 DOS 的個人電腦、DEC公司的 Digital Unix 系統以及 Sun 的 Unix 系統。在當時, DEC 公司有發展出一套稱為 PATHWORKS 的軟體,這套軟體可以用來分享 DEC 的 Unix 與個人電腦的 DOS 這兩個作業系統的檔案資料,可惜讓 Tridgwell 覺得較困擾的是,Sun 的 Unix 無法藉由這個軟體來達到資料分享的目的。這個時候 Tridgwell 就想說:『咦!既然這兩部系統可以相互溝通,沒道理 Sun 就必需這麼苦命吧?可不可以將這兩部系統的運作原理找出來,然後讓 Sun 這部機器也能夠分享檔案資料呢?』,為了解決這樣的的問題,他老兄就自行寫了個 program 去偵測當 DOS 與 DEC 的 Unix 系統在進行資料分享傳送時所使用到的通訊協定資訊,然後將這些重要的資訊擷取下來,並且基於上述所找到的通訊協定而開發出Server Message Block (SMB) 這個檔案系統,而就是這套 SMB 軟體就能夠讓 Unix 與 DOS 互相的分享資料囉!( 註:再次的給他強調一次,在 Unix Like 上面可以分享檔案資料的 file system 是 NFS,那麼在 Windows 上面使用的『網路上的芳鄰』所使用的檔案系統則稱為 Common Internet File System, CIFS )
既然寫成了軟體,想一想,嗯!總是需要註冊一下商標吧!因此 Tridgwell 就去申請了 SMBServer ( Server Message Block 的簡寫 ) 這個名字來做為他撰寫的這個軟體的商標,可惜的是,因為 SMB 是沒有意義的文字,因此沒有辦法達成註冊。既然如此的話,那麼能不能在字典裡面找到相關的字詞可以做為商標來註冊呢?翻了老半天,呵呵!這個 SAMBA 剛好含有 SMB ,又是熱情有勁的拉丁舞蹈的名稱,不然就用這個名字來做為商標好了!哈哈!這成為我們今天所使用的 SAMBA 的名稱由來啦! ^_^
SAMBA 的應用功能
由上面說明的 SAMBA 發展緣由,您就應該不難知道咯, SAMBA 最初發展的主要目就是要用來溝通 Windows 與 Unix Like 這兩個不同的作業平台,這麼做有什麼好處呢?剛剛我們上面不就已經說過了,最大的好處就是您不必讓同樣的一份資料放置在不同的地方,搞到後來都不曉得哪一份資料是最新的!而且也可以透過這樣的一個檔案系統上 Linux 與 Windows 的檔案傳輸變得更為簡單!也就是說,您以後可以透過『網路上的芳鄰』來進行 Linux 與 Windows 檔案的傳輸啦!那麼 SAMBA 可以進行哪些動作呢?
底下我們來談幾個 SAMBA 伺服器的應用實例吧!
應用實例一:以鳥哥為例,由於我都是使用 Windows 系統來編輯我的網頁畫面,然後再傳到我的 Linux 機器上。一開始,鳥哥也是以 FTP 來傳送我的網頁的,後來發現,這樣在我的 Windows 上面需要有一份網頁資料,然後修改完成之後又要傳到 Linux 上面,如此便有兩個相同的檔案,最麻煩的是,有時候下載下來的檔案已經經過好多修改了,卻在下次的 FTP 作業,不小心又下載一次舊資料,結果將已經修改過的資料覆蓋過去~天吶!又要重寫一遍.....真是討厭!後來,鳥哥就安裝了 SAMBA 伺服器,將 Linux 上我的網頁目錄打開成可以資源分享,如此一來,鳥哥就可以直接透過 Windows 的『網路上的芳鄰』來修改我的網頁資料囉!而且,這就有點像是『線上編修』呢,一修改完成,在 Internet 上面可以立刻檢驗,方便的很吶!
應用實例二:在我們實驗室中,由於電腦數量不多,研究生常常會使用到不同的電腦 ( 因為大家都得搶沒有人用的電腦啊! ),此外,也常常有研究生拿自己的 NoteBook 來工作,因此,有些團隊的資料就分散在各個電腦當中,使用上相當的不方便。這個時候,我就使用 SAMBA 將硬碟空間分享出來,由於使用者要登入 SAMBA 這個伺服器主機時需要輸入使用者資料 ( 帳號與密碼 ),而不同的登入者會取得不一樣的目錄資源,所以,可以避免自己的資料在公用電腦上面被窺視,此外,在不同的公用電腦上面都可以登入 SAMBA 主機,資料的使用上面真是相當的棒啊!
應用實例三:SAMBA 除了分享檔案系統外,也可以分享印表機喔,我們研究室好幾部電腦就是直接以 Linux 分享的印表機來印製報告的。您會說『啊 Windows 也可以辦的到啊!沒有什麼了不起的!』是啊。但是因為 Linux 做為伺服器主機時,鳥哥認為 Linux 畢竟還是比較穩定一點,可以 24 小時且全年無休的努力工作吶。此外,因為目前透過『網路上的芳鄰』來攻擊區域網路的 Windows 作業系統的電腦病毒實在是太多了,防不勝防, Linux 對於這樣的攻擊並沒有很大的影響 (因為常見的攻擊手法均針對 Windows 而來~),所以也比較安全一些說~
SAMBA 的應用挺廣泛的,尤其對於區域網路內的電腦來說,更是一項不可多得的好用的伺服器,更多的應用您可以自行發掘吶!
NetBIOS 通訊協定
事實上,就像 NFS 是架構在 RPC Server 上面一樣, SAMBA 這個檔案系統是架構在 NetBIOS ( Network Basic Input/Output System, NetBIOS )這個通訊協定上面所開發出來的。既然如此,我們當然就要瞭解一下 NetBIOS 囉!最早 IBM 發展出 NetBIOS 的目的僅是要讓區域網路內少數電腦進行網路連結的一個通訊協定而已,所以考慮的角度並不是針對大型網路,因此,這個 NetBIOS 是無法跨路由的 (Router/Gateway)。這個 NetBIOS 在區域網路內 ( Local Area Network, LAN ) 實在是很好用,所以微軟的網路架構就使用了這個咚咚來進行溝通的吶!而 SAMBA 最早發展的時候,其實是想要讓 Linux 系統可以加入 Windows 的系統當中來分享使用彼此的檔案資料的,所以當然 SAMBA 就架構在 NetBIOS 發展出來囉。
不過,如果單純的使用 NetBIOS 而已,偏偏 NetBIOS 是無法跨路由的,那麼該伺服器的使用範圍不就受限相當的多了?好在,我們還有所謂的 NetBIOS over TCP/IP 的技術呢!這是什麼樣的技術啊?!舉個例子來說好了,我們知道 TCP/IP 是目前網路連接的基本協定,現在,我們將 NetBIOS 想成是一封明信片,這個明信片只能讓您自己欣賞而已,如果今天我們要將這個明信片送到遠方的朋友那邊時,呵呵!就需要透過郵件系統 ( 例如郵局啦、國際快遞啦等等的 ) 來傳送了!這個 TCP/IP 就可以視為郵件傳遞系統啦!透過這個 NetBIOS over TCP/IP 的技術,我們就可以跨路由的使用 SAMBA 伺服器所提供的功能咯!當然啦,目前 SAMBA 還是比較廣泛的使用在 LAN 裡面說。
註:或許您會發現在 Windows 網路設定裡面常常看到
NetBEUI 這個咚咚,那是什麼呢?事實上,那個是 NetBIOS Extened User Interface
的簡寫,也是 IBM 在 NetBIOS 發展出來之後的改良版本。雖然這兩者的技術不太相同,不過,我們只要知道一些簡單的概念就可以了!所以,在這裡我們不針對
NetBEUI 來介紹。
SAMBA 使用的 daemons
知道了 SAMBA 的主要目的是讓 Linux 主機加入 Windows 的網路系統當中來分享使用彼此的資料,而 Windows 使用的是 NetBIOS 這個通訊協定,所以說,SAMBA 主要是使用 NetBIOS over TCP/IP 的技術。好了,我們再來談一談,那麼 SAMBA 在 Linux 作業系統上面工作時,需要啟用什麼服務呢 ( daemons )?讓我們先以 Windows 的『網路上的芳鄰』來做簡單的說明:
瞭解了呴,同樣的 SAMBA 主機就使用兩個 daemons 來管理這兩個不同的服務:
所以囉, SAMBA 每次啟動至少都需要有這兩個 daemons 喔!這可不要忘記囉! ^_^而當我們啟動了 SAMBA 之後,主機系統就會啟動 137, 138, 139 三個 port ,且同時會有 UDP/TCP 的監聽服務喔!這可不要忘記了!因為後面設定防火牆的時候,還會使用到這三個 port 的呢!
連線模式的介紹 ( peer/peer, domain model )
SAMBA 主機的應用相當的廣泛,而且可以依照不同的網域連線與使用者帳號、密碼的控管方式不同,來加以不同的類別應用,例如最常見的 Workgroup 及 Domain 兩種方式的連線模式呢!底下我們就是要來談一談這兩種最常見的區域網路的連線模式 peer/peer 及domain model。
peer 有同等、同輩的意思存在,那麼 peer/peer 由字面上的解釋來看,當然就是同等地位的 PC 架構了!這是什麼意思呢?簡單的來說,在區域網路裡面的所有 PC 均可以在自己的電腦上面管理自己的帳號與密碼,同時每一部電腦也都具有獨力可以執行各項軟體的能力,只是藉由網路將各個 PC 連結在一起而已的一個架構,所以,每一部機器都是可以獨立運作的喔!而在這樣的架構下,如果有兩部電腦,電腦名稱假設為 pc1 與 pc2 好了,那麼當您要坐在 pc1 這部電腦前使用 pc1 的資源時,就必須要知道登入 pc1 的使用者名稱與密碼,才能夠登入使用。而如果您想由 pc1 經過網路連線到 pc2 來使用 pc2 的檔案資源時,就必須要知道 pc2 的帳號與密碼才可以順利的登入 pc2 吶!
這樣的架構在目前小型辦公室裡面是最常見的。例如辦公室裡面有十個人,每個人桌上可能都安裝有一套 Windows 作業系統的個人電腦,而這十部電腦都可以獨立進行辦公室軟體的執行啊、獨立上網啊、獨立玩遊戲啊等等的,因為這十部電腦都可以獨立運作,所以不會有一部電腦關掉,其他的電腦就無法工作的情況發生,這就是 peer/peer 的典型架構。
以下圖的架構為例,在這樣的架構下,假設 A 君寫了一個報告書,而 B 君想要以網路直接取用這個報告書時,他就必須要知道 A 君使用的電腦的帳號與密碼,並且 A 君必須要在 PC A 上面啟用 Windows 的『資源分享(或者是共用)』之後,才能夠讓 B 君連線進入喔 ( 此時 PC A 為 Server ) !而且, A 君可以隨時依照自己的喜好來更改自己的帳號與密碼,而不受 B 君的影響,不過, B 君就得要取得 A 君同意取得新的帳號與密碼後,才能夠登入 PC A 喔!反過來說,同樣的, A 要取得 B 的資料時,同樣需要取得 PC B 的帳號與密碼後,才能夠順利登入啊 ( 此時 PC A 為 Client 喔 )!因為 PC A, PC B, PC C 的角色與地位都同時可以為 Client 與 Server ,所以就是 peer/peer 的架構了!

生活周遭中,哪裡看到的這種 peer/peer 的架構呢?!想起來了嗎?!沒錯!就是藉由 Windows 的『網路上的芳鄰』所達成的『工作群組(workgroup)』的架構,那就是典型的 peer/peer 架構啦!所以, peer/peer 也可以直接說成 workgroup 的連線架構喔。
使用 peer/peer 的架構的好處,是每部電腦均可以獨立運作,而不受他人的影響!不過,缺點就是當整個網域內的所有人員都要進行資料分享時,光是知道所有電腦裡面的帳號與密碼,就會很傷腦筋了!所以, Peer/Peer 的架構是比較適合 (1)小型的網域,或者是 (2)沒有需要常常進行檔案資料分享的網路環境,或者是 (3)每個使用者都獨自擁有該電腦的擁有權(就是說,該電腦是使用者的,而不是公用的啦!)!而,如果該單位的所有 PC 均是公有的,而且您需要統一控管整個網域裡面的帳號與密碼的話,那就得使用底下的 domain models 了!
假設今天您服務的單位有 10 部電腦,但是您的單位有 20 個員工,這也就是說,這 20 個員工輪流搶著用這 10 部電腦。如果每部電腦都如同 peer/peer 的架構時,那麼每部電腦都需要輸入這 20 個員工的帳號與密碼來提供他們登入喔,而且,今天假如有個員工想要變更自己的密碼時,就需要到 10 台電腦上面進行密碼變更的作業!否則他就必須要記得這 10 部電腦裡面,那一部電腦是記憶那一個密碼.....好煩那~
如果上述是這樣的情況,使用 peer/peer 架構就不是一個好方法了!這個時候就需要藉由 domain model 來達成您的需求啦!所謂的 domain model 概念其實也很簡單,既然使用電腦資源需要帳號與密碼,那麼我將所有的帳號與密碼都放置在一部主控電腦 ( Primary Domain Controller, PDC ) 上面,在我的網域裡面,任何人想要使用任何電腦時,都需要在螢幕前方輸入帳號與密碼,然後通通藉由 PDC 主機的辨識後,才給予適當的使用權限,也就是說,不同的身份還具有不一樣的電腦資源使用權限就是了!例如底下的圖示:

PDC 主機控管整個網域裡面的各個機器 (PC A ~ PC D) 的帳號與密碼的資訊,假如今天有個使用者帳號名稱為 Ken ,且密碼為 mypasswd 時,他不論使用哪一部電腦 (PC A ~ PC D) 只要在螢幕前方輸入 ken 與他的密碼,則該機器會先到 PDC 上面查驗是否有 ken ,以及 ken 的密碼,並且 PDC 主機會給予 ken 這個使用者相關的電腦資源使用權限。當 ken 在任何一部主機上面登入成功後,他就可以使用相關的電腦資源了!
這樣的架構比較適合人來人往的企業架構,當系統管理員要控管新進人員的電腦資源使用權時,可以直接針對 PDC 來修改就好了,不需要每一部主機都去修修改改的,對於系統管理員來說,這樣的架構在控管帳號資源上,當然是比較簡單的啦!
各種架構適用的環境與適用的人都不相同,並沒有那個是最好啦!請依照您的工作環境來選擇連線的模式囉!當然, SAMBA 可以達到上述兩種模式的啦!底下我們會分別來介紹喔!
套件安裝:
- 事實上, SAMBA 的安裝一點也不難,而且這個咚咚在各主要 distribution
上面都有提供,也都大同小異,所以,比較建議使用您自己的
distribution 所提供的 RPM 檔案來安裝喔!當然啦,您也可以自行使用
Tarball 來安裝的啦!
- samba:這個套件主要包含了 SAMBA 的主要 daemon 檔案 ( smbd 及 nmbd )、 SAMBA 的文件檔 ( document )、以及其他與 SAMBA 相關的 logrotate 設定檔及開機預設選項檔案等;
- samba-common:這個套件則主要提供了 SAMBA 的主要設定檔 (smb.conf) 、 smb.conf 語法檢驗的測試程式 ( testparm )等等;
- samba-client:這個套件則提供了當 Linux 做為 SAMBA Client 端時,所需要的工具指令,例如掛載 SAMBA 檔案格式的執行檔 smbmount 等等。
使用 RPM 來安裝
使用 RPM 來安裝真是一點都不難啦!不過,要注意一下安裝的套件名稱就是了,因為不同的 distribution 對於 RPM 檔案的命名都不太一樣!舉個例子來說, Red Hat 9 對於 SAMBA 這個伺服器總共需要至少三個套件,分別是:
不過,在 Mandrake 9.1 當中,則將 samba 這個套件又分為 samba-server 與 samba-doc 兩個套件,所以在 MDK 9.1 則有四個套件需要安裝: samba-server, samba-doc, samba-common, samba-client 。
RPM 的安裝不用再介紹了吧?!請拿出您的光碟, mount 上他,然後再將裡頭的 samba 套件給他 RPM 上去即可!在最後檢驗的時候,您的系統應該有點像底下這個樣子(以 Red Hat 9 為例):
[root@test
root]# rpm -qa | grep samba
samba-common-2.2.7a-8.9.0 redhat-config-samba-1.0.4-1 samba-2.2.7a-8.9.0 samba-client-2.2.7a-8.9.0 注意一下,上面顯示的例子是 Red Hat 9 的檔案,其中那個 redhat-config-samba 是 Red Hat 額外提供的設定功能,可以不用安裝他啦! |
使用 Tarball 來安裝
一般來說,因為各個 distribution 提供的 SAMBA 的功能都差不多,所以實在沒有必要使用 Tarball 來進行額外的安裝與設定,不過,如果您還是想要自己建置自己的 SAMBA 的話,可以到 SAMBA 的官方網站上下載 samba 的原始程式碼,然後在自己的機器上面編譯。不過,連到國外去總是有點慢,建議可以到中山大學下載最新的 SAMBA 原始碼:
目前 ( 2003/07/20 ) 最新的版本是 2.2.8a 這個版本,您可以下載 samba-2.2.8a.tar.gz 這個檔案,然後將他解開,解開後,記得察看一下 samba-2.2.8a 裡面的 README 喔!接下來,您就可以這樣編譯看看:(註:底下的測試是在 Red Hat 9 上面進行的,如果您的系統並不是 Red Hat 9 時,請注意 source 那個目錄底下的 config.log 那個檔案,裡面會記錄相關的錯誤訊息喔!)
[root@test
root]# wget http://ftp.nsysu.edu.tw/Unix/Samba/samba-2.2.8a.tar.gz
註:上面的網址只是一個範例,請自行到中山大學下載! [root@test root]# cd /usr/local/src [root@test src]# tar -zxvf /root/samba-2.2.8a.tar.gz 這個時候會有一個目錄跑出來: /usr/local/src/samba-2.2.8a [root@test src]# cd samba-2.2.8a #(在這個目錄中察看一下 README 喔!) [root@test samba-2.2.8a]# cd source [root@test source]# ./configure --prefix=/usr/local/samba > --with-automount --with-smbmount --with-pam > --with-mmap --with-quotas --with-libsmbclient 還是要重複的給他強調一下: 1. 請先以 ./configure --help 察看一下 configure 的一些相關的參數用法 2. 如果發生任何錯誤,請不要往下進行 make 的動作,因為還是不對的! 3. 萬一發生任何錯誤時,通常是由於一些函式庫找不到的緣故,請參考此目錄 下的 config.log 這個檔案的內容,裡面會記錄一些錯誤的歷程。 [root@test source]# make #(開始進行編譯!) 這個過程會花一些時間,因為他會將原始碼 (source code) 以您剛剛的設定 並以 gcc 這個 compiler 來進行編譯喔!所以會花一些時間的啦! [root@test source]# make install 將剛剛編譯完成的可執行 binary 檔案安裝到 /usr/local/samba 裡面去! 在這個例子當中,未來您在設定 SAMBA 時,必需要到 /usr/local/samba 當中喔! |
一般來說,除非您的 Linux distribution 已經相當的老舊了 (例如 Red Hat 6.x 以前的版本),並且在舊的系統上面正在正常的運作一些服務,而僅想要增加 SAMBA 的服務,那就只好使用 Tarball 的方式來安裝 SAMBA ,否則的話,蠻強烈的建議直接以 RPM 的方法來安裝您的 SAMBA 伺服器軟體即可!因為既簡單方便,又容易統一設定喔! ^_^
Server 端的設定
- 由於 SAMBA 幾乎一定包含在各個主要的 Linux distribution 當中,並且不同版本之間的功能差異也不是很大,所以,底下的介紹我們都以
RPM 安裝的 SAMBA 套件來進行說明。當然啦,即使同樣是 RPM 的檔案,但是在各個
Linux distribution 當中, SAMBA 的主要檔案放置的目錄還是可能會不太一樣。不過,因為
SAMBA 的設定檔檔名都是不變的 ( smb.conf ),所以,雖然底下我們是以
Red Hat 9 為範例,不過,您依舊可以使用 locate, find, whereis 等指令在不同的
distribution 系統下找出 SAMBA 主要的設定檔與執行檔喔! ( 這就是為什麼我們喜歡教大家使用
vi 以及純文字模式學習 Linux 的原因,因為一法通,萬法通啊!)
- SAMBA 的設定檔:
- /etc/samba/smb.conf:這個就是 SAMBA 最主要的設定檔了!在較為簡單的設定當中,這也是唯一的一個設定檔!此外,這個檔案本身就含有相當豐富的說明,所以,在設定之前,請使用 vi 好好的詳細的觀看一下這個檔案吧!這個設定檔主要的設定分為兩部份,分別是 [global] 這個設定主機功能的項目,以及接下來的每個分享出去的目錄的屬性設定。我們會在後續的部分進行更多的說明。
- /etc/samba/lmhosts:這個檔案的主要目的在對應 NetBIOS name 與該主機名稱的 IP ,事實上,他有點像是 /etc/hosts 的功能!只不過這個 lmhosts 對應的主機名稱是 NetBIOS name 喔!不要跟 /etc/hosts 搞混了!由於目前 SAMBA 的功能越來越強大,所以通常只要您一啟動 SAMBA 時,他就能自己捉到 LAN 裡面的相關電腦的 NetBIOS name 對應 IP 的資訊,因此,這個檔案通常可以不用設定了!
- /etc/samba/smbpasswd:這個檔案預設並不存在啦!他是 SAMBA 預設的使用者密碼對應表。當我們設定的 SAMBA 伺服器是較為嚴密的,需要使用者輸入帳號與密碼後才能登入的狀態時,使用者的密碼預設就是放置在這裡咯 ( 當然囉,您可以自行在 smb.conf 裡面設定密碼放置的地方及密碼檔名,不過,我們這裡都以預設的狀態來說明 ) 。比較需要注意的是,這個檔案因為包含了使用者的密碼,所以,當然權限方面要較為注意啦!這個檔案的擁有者需要是 root ,且權限設定為 600 才行喔!
- SAMBA 的執行檔:
- smbd 與 nmbd:還記得我們在原理部分提到的 SAMBA 需要啟動的 daemons 吧?!呵呵!這兩個執行檔就是那兩個主要的 daemons 囉!每次啟動 SAMBA 都會使用到的兩個執行檔啦!
- testparm:當我們設定完成了 smb.conf 這個主要設定檔之後,而想要查看一下 SAMBA 的所有設定參數與 smb.conf 的設定項目是否正確時,就需要使用這個 testparm 來查看囉 ( 其實就是 test parameters 的簡寫!)!所以說,每次在修改完 smb.conf 之後,請務必要使用 testparm 查看看是否有設定錯誤喔!
- smbpasswd:如果您的 SAMBA 設定的較為嚴格,需要規定使用者的帳號與密碼,那麼那個密碼檔案的建立就需要使用 smbpasswd 來建置才可以的喔!所以這個指令與建立 SAMBA 的密碼有關咯!
- smbclient:當你的 Linux 主機想要藉由『網路上的芳鄰』的功能來查看別台電腦所分享出來的目錄與裝置時,就可以使用 smbclient 來查看啦!這個指令也可以使用在自己的 SAMBA 主機上面,用來查看是否設定成功哩!
- smbmount:在 Windows 上面我們可以設定『網路磁碟機』來連接到自己的主機上面,同樣的,在 Linux 上面,我們可以透過 smbmount 來將遠端主機分享的檔案與目錄掛載到自己的 Linux 主機上面哪!不過,其實我們也可以直接使用 mount 這個指令來進行同樣的功能就是了。
- SAMBA 的相關目錄:
- /usr/share/doc/samba:這個目錄包含了 SAMBA 的所有相關的技術手冊喔!也就是說,當您安裝好了 SAMBA 之後,您的系統裡面就已經含有相當豐富而完整的 SAMBA 使用手冊了!值得高興吧! ^_^,所以,趕緊自行參考喔!
- /var/log/samba:這個目錄就是 SAMBA 預設的登錄檔放置目錄了!如果您的 SAMBA 老是設定不起來,又或者懷疑被人家以 port 137~139 入侵的話,就到這裡來觀察吧!
- /usr/share/samba/codepages:這個目錄裡面放置的就是各個語言的支援格式。舉例來說,想讓您的 SAMBA 支援中文嗎?那麼就需要 codepage.950 這個檔案的支援囉!當然啦,在 smb.conf 裡面設定即可!
- 在安裝 Linux 的時候,建議不需要安裝 X Window ;
- 在規劃 Linux 時,/home 最好獨立出一個 partition ,而且硬碟空間最好能夠大一些;
- /home 獨立出來的 partition 可以單獨進行 quota 的作業,以規範每個使用者能夠使用的最大硬碟容量;
- 由於 SAMBA 可以做為印表機伺服器,所以建議印表機可以直接連接在 Linux 主機的列印埠 (LPT1);
- 由於 SAMBA 一般來說都僅針對內部 ( LAN ) 主機進行開放,所以,可能的話, SAMBA 主機直接使用內部保留 IP 來設定即可 (Private IP),當然啦, SAMBA 是否使用 private IP 還得視您的整個網域的 IP 網段的特性來規劃。以我們研究室來說,因為實驗室所有電腦的 IP 都是 Public IP,那麼 SAMBA 如果使用 Private IP ,當然大家都無法連接上啊! ^_^
- 如果您的 SAMBA 主機使用 Public IP 時,請特別留意規範好防火牆的設定,盡量僅讓 LAN 內的電腦可以連線進來即可,不要對 Internet 開放喔!
另外,我一開始的範例當中都是針對沒有設定防火牆的情況下所進行設定與測試,如果您的環境裡面已經有架設防火牆的話,那麼您應該要先瞭解防火牆的架構,並將 SAMBA 需要的 port 給他開放,否則很難測試成功喔!或者直接察看本章節較後面專門談安全的部分,尤其是 iptables 與 /etc/hosts.allow(deny) 這部份喔!
SAMBA 的套件結構
我們這裡以 Red Hat 9 的 SAMBA 套件來介紹他相關的一些設定檔與執行檔,不過,如果您的 distribution 並不是 Red Hat 9 ,那也沒有關係,因為都是大同小異的啦!善用 locate 這個指令去搜尋喔!
在較早期的版本中, SAMBA 的設定檔都直接放置在 /etc 底下,後來的版本則將設定檔通通放置到 /etc/samba 底下去了 ( 有的 distribution 放在 /etc/smb 有的則是 /etc/samba.d ,請使用 locate 搜尋! )。在 /etc/samba 底下的幾個重要的設定檔有:
SAMBA 的執行檔可就多了!一般來說,做為 SAMBA Server 的執行檔有 testparm, smbd, nmbd, smbpasswd,至於做為 SAMBA Client 的執行檔主要則是:smbmount, smbclient。
這部份需要較為注意的應該算是 SAMBA 的『登錄檔』吧!因為最近以來,利用『網路上的芳鄰』來進行破壞的病毒是越來越多了!而且也有越來越多的搞怪者會以網路上的芳鄰的相關漏洞進行入侵的伎 倆,所以囉,瞭解一下登錄檔放置的地點,並且加以分析,呵呵!可以得到不小的監測呢!
主機的規劃技巧建議
如果您的 Linux 主機單純要用來做為檔案伺服器的話 (File Server) ,那麼建議您 Linux 主機就不要安裝 X Window 的咚咚,以節省一些硬碟的空間。此外,如果您想要針對不同的使用者開放不同的登入權限,那表示您的 SAMBA 主機將會有很多人物同時進進出出的存取資料檔案。為了避免某些使用者佔用了大部分的硬碟空間,也為了維護上的便利,這個時候挺建議您將 /home 這個目錄獨立出一個 parition ,此外,空間也要大一點,因為每個使用者登入 SAMBA 系統的時候,預設都是會進入到個人的家目錄的,而 Linux 預設的個人家目錄就在 /home 底下,所以吶, /home 是需要大一些些的。
基礎的設定流程與 smb.conf 的主要規劃
在開始設定 SAMBA 這個伺服器之前,我們先來談一談應該如何較為簡單的設定 SAMBA 吧!因為 SAMBA 的功能很強大,可以做為簡單的單一主機控管自己分享出去的資料,也可以做為整個區域內所有電腦的帳號管理主機 ( Primary Domain Controller, 這部份我們會在後面進行介紹喔! )。不過,整個 SAMBA 的設定流程倒是沒有多大的差異性!嗯!既然 SAMBA 是要讓 Linux 加入 Windows 網路上的芳鄰的一項工具,那麼我們就先來談一談,在 Windows 上面,您要如何分享你機器上面的目錄給大家使用呢?
- 先在自己的電腦上面安裝必要的協定:那就是 NetBIOS ( 有時候會是 NetBEUI 喔!)的安裝咯!直接在網路設定裡面設定好即可;
- 再來則是在檔案總管裡面設定好要分享的目錄、磁碟或者是裝置(如印表機);
- 然後,給這個分享出來的咚咚一組帳號及密碼(如果需要的話),讓外部使用者可以使用這組帳號密碼登入 Windows 主機;
- 然後就開始運作了!
整個流程大概就是這麼簡單吧!事實上,在 Linux 底下的設定也是這麼簡單的啦!
- 先參考 區域網路的設定 那一章節,先搞定硬體的連線吧!
- 之後,先在 linux 上面的 SAMBA 設定檔 smb.conf 裡面設定好主機所支援的各項功能,例如是否需要密碼、是否支援 PDC 等等;
- 然後在 smb.conf 的後半部當中設定好想要分享的目錄與該目錄的屬性;
- 如果在步驟 2 裡面的 smb.conf 檔案內設定的分享方法是需要帳號與密碼的登入時,就以 smbpasswd 建立使用者的帳號與密碼;
- 啟動 smb 的服務,開始運轉囉!
呵呵!所以會動到的設定檔幾乎就是只有 smb.conf 這個 SAMBA 的設定檔,當然啦,還需要
smbpasswd 來建立使用者的帳號與密碼就是了! ^_^既然這個 smb.conf 這麼重要,我們就得瞭解一下
smb.conf 囉!
smb.conf 這個檔案裡面主要是以 [global/share directory] 開始一個主要設定的內容,這個檔案裡面,『
# 』與『 ; 』都是註解的意思喔!我們先來談一談比較重要的 [global] 這個牽涉到
SAMBA 主機的主要設定的內容吧!
[root@test
root]# cp /etc/samba/smb.conf /etc/samba/smb.conf.bak.raw
[root@test root]# vi /etc/samba/smb.conf # 這個檔案本身就是很詳細的說明檔,限於篇幅,我們沒有將註解的部分寫下來, # 這裡的目的是想讓大家瞭解 smb.conf 的內容規劃咯! [global] workgroup = birdhouse server string = Linux Samba Server netbios name = birdlinux client code page = 950 printcap name = /etc/printcap load printers = yes printing = lprng log file = /var/log/samba/log.%m max log size = 500 # 那個 500 數字是 Kb 喔! security = user encrypt passwords = yes smb passwd file = /etc/samba/smbpasswd socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192 # 上面的幾行當中,注意 [global] ,由 [global] 到底下的 [Webpage] 之間的設定 # 都是 [global] 的設定項目!而 [global] 的主要內容都是與主機的設定有關! # 比較重要的有底下幾個設定值: # workgroup 工作群組:同一個區域網路內,要具有相同的 workgroup # netbios name 主機名稱:這個主機名稱就是 netbios 的名字!請注意,如果你 # 沒有設定 netbios name 的話,預設的 NetBIOS name 會以 # HOSTNAME 來替代! # server string 這個是主機的說明,隨便寫寫沒關係! # security 這個重要,是用來規定 SAMBA 主機的安全登入項目,有底下幾種: # share :不進行安全登入,亦即沒有設定帳號與密碼 # user :設定主機的密碼檔作為登入的驗證檔案,這與底下的 # smb passwd file 有關喔! # domain :就是讓您的 SAMBA 作為 PDC 囉! # log file 登錄檔放置的目錄所在喔! # 其他相關的幾個設定項目請參考 man 5 smb.conf 我們底下也會列出幾個常用的 # 設定項目說~ [Webpage] comment = My Home Page path = /var/www/html read only = no public = yes writable = yes create mode = 0664 directory mode = 0775 # 這個部分則是針對每個分享的目錄或者是裝置進行權限方面的規定了! # 幾個簡單的設定項目有: # comment :這個目錄的說明! # path :這個項目真正的 Linux 檔案系統裡面的目錄,請看底下的說明 # read only:是否唯讀? # public :是否讓所有可以登入的使用者看到這個項目? # writable :是否可以寫入?!這裡需要注意一下喔!那個 read only 與 writable # 不是兩個蠻相似的設定值嗎?如果 writable 在這裡設定為 no ,亦即 # 不可寫入,那跟 read only 不就互相抵觸了?!那個才是正確的設定? # 答案是:最後出現的那個設定值為主要的設定! # create mode 與 directory mode 都與權限有關的咯! |
注意一下,在上面的案例中,我們只有兩個主要的設定群:
- 一個是 [global] 的主機相關設定,這個是每個 SAMBA 主機都需要設定的喔!裡面的規定都與 SAMBA 主機的環境有關!
- 至於 [Webpage] 呢?他是什麼玩意~這裡我們舉個實際的例子好了,當您在區域網路內以網路上的芳鄰登入某部主機之後,不是會看到該主機所提供的『目錄或者裝置的名稱』嗎?!那個 Webpage 就是名稱啦!也就是說,當您以網路上的芳鄰登入 linux 時,看到的 Linux 所分享出來的目錄名稱就是『Webpage』啦!不過,這個 Webpage 只是在 SAMBA 服務當中所顯示的名稱而已,並不是真正的 Linux 檔案系統上面的目錄!這個 Webpage 所代表的真正的目錄要看底下設定項目的『path』設定項目才行!這也就是說,當您在網路上的芳鄰登入 Linux 後,看到 Webpage 這個目錄,用滑鼠將他點下去,接下來看到的內容就是 /var/www/html 這個真正 Linux 檔案系統裡面的資料咯!
在上面的例子當中,我們有看到一個比較有趣的設定是『log
file = /var/log/samba/log.%m』,怎麼會有個
%m 啊?!呵呵!那個就是 SAMBA 裡面的變數值啦!在 SAMBA 當中,為了便利使用者的設定,所以會有許多的變數值提供給系統管理員來使用,主要的變數有底下幾個:
- %S:取代目前的設定項目值,所謂的『設定項目值』就是在 [ ] 裡面的內容!舉例來說:
- %m:代表 Client 端的 NetBIOS 主機名稱喔!例如上面案例的登錄檔!
- %M:代表 Client 端的 Internet 主機名稱喔!就是 HOSTNAME。
- %L:代表 SAMBA 主機的 NetBIOS 主機名稱。
[homes]
valid users = %S .... |
- %H:代表使用者的家目錄。
- %U:代表目前登入的使用者的使用者名稱
- %g:代表登入的使用者的群組名稱。
- %h:代表目前這部 SAMBA 主機的 HOSTNAME 喔!注意是 hostname 不是 NetBIOS name 喔!
- %I:代表 Client 的 IP 咯。
- %T:代表目前的日期與時間
至於相關的變數運用,我們會在底下的設定當中略做介紹喔!
沒有防備的 SAMBA 分享檔案設定
所謂的『沒有防備的 SAMBA 分享檔案』就是你啟用了一個
SAMBA Server ,設定了分享的目錄,但是卻完全沒有規範權限,也就是任何人都可以登入這個系統的意思啦!事實上是不太應該介紹這個沒有防備的
SAMBA 主機的!因為.....太過於危險了!不過,有些沒有連上 Internet 的區域網路內還是可以嘗試看看的。所以這裡我們先以較為簡單的無防備
SAMBA 主機作為第一個 SAMBA 的設定介紹吧!
- 主機預計分享的狀況:
- 設定 lmhosts :
- 開始設定 smb.conf:
- 測試 smb.conf 設定值與啟動 SAMBA :
- Client 端的測試:
在整個 LAN 裡面的工作群組 ( workgroup )為:birdhouse
我的 Linux 主機 NetBIOS 名稱為 ( netbios name ):birdhome
安全設定為沒有防備的 share (share 為 smb.conf 裡面 security 的設定值)
僅僅分享 /tmp 這個目錄而已~
事實上,這個檔案目前是可以不用設定了!不過,如果保險一點來看,設定一下也沒有什麼不好的!在這個檔案當中,您要設定的資料很簡單,就是每一部 PC 的 NetBIOS name 以及對應的 IP 即可!以我為例:
[root@test
root]# vi /etc/samba/lmhosts
127.0.0.1 localhost 192.168.0.100 birdhome 192.168.0.110 birdbrother1 192.168.0.120 birdbrother2 |
在這個例子當中,我們僅分享出 /tmp 而已,並且沒有設定任何的登入權限的限制喔!而因為 smb.conf 原本的設定當中就已經開放出很多的目錄,所以您必須要將其他的分享先關閉!關閉的方法有很多,您可以將 smb.conf 備份後移除,重新建一個,或者是將沒有用到的那一行以『;』或者是『#』將他註解掉喔!(比較詳細的說明請參考前幾個章節的『基礎設定流程』裡面的介紹!)
[root@test
root]# cd /etc/samba
[root@test samba]# cp smb.conf smb.conf.bak # 玩伺服器最重要的一個概念就是『有備無患』啊! # 所以,先將重要的資料給他備份下來! ^_^ [root@test samsa]# vi smb.conf # 底下的設定為最基礎的設定值!最重要的地方在於 security = share 的地方! [global] workgroup = birdhouse netbios name = birdhome server string = Bird's testing SAMBA Server client code page = 950 # 這個 client code page 的設定有趣的很!因為 SAMBA 支援多語系的編碼, # 我們習慣的編碼為 cp590 亦即是 code page 950 這個編碼,所以, # 想要讓您的 SAMBA 可以正確的在 Windows 上面顯示出中文,就得加入 # client code page = 950 喔! (如果沒有設定,那麼預設值是 850 呢!) # 如果 max log size = 0 的話,那表示登錄檔檔案大小沒有限制! log file = /var/log/samba/log.%m max log size = 0 security = share socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192 interfaces = 192.168.0.100 dns proxy = no [tmp] comment = Temporary file space path = /tmp # 真正的開放出來的路徑在這裡! read only = no public = yes # 上面兩個設定在告訴大家,不但可以存取(read only = no) # 也可以讓大家查詢(public = yes)! [root@test samba]# grep -v '^#' smb.conf |grep -v '^;'|grep -v '^$' # 這個動作在確認一下上面的設定是否相同,因為有時候可能會忘記將某個 # 設定給註解掉呢! ^_^ |
設定好了最主要的設定檔 smb.conf 之後,接下來就得要開始測試與啟動 SAMBA 囉!動作也是很簡單的:
[root@test
samba]# testparm
Load smb config files from /etc/samba/smb.conf Processing section "[tmp]" Loaded services file OK. Press enter to see a dump of your service definitions <==這裡按下 Enter # Global parameters [global] client code page = 950 code page directory = /usr/share/samba/codepages workgroup = birdhouse netbios name = birdhome netbios aliases = netbios scope = server string = Bird's test SAMBA Server interfaces = 192.168.0.100 bind interfaces only = No security = SHARE encrypt passwords = No ..... [tmp] comment = Temporary file space path = /tmp read only = No guest ok = Yes # 你應該會看到如上的畫面,這個 testparm 可以用來察看所有 SAMBA 的屬性, # 這些屬性很多都是預設值!如果沒有 smb.conf 裡面設定時,就是預設值, [root@test samba]# /etc/rc.d/init.d/smb restart Shutting down SMB services: [ OK ] Shutting down NMB services: [ OK ] Starting SMB services: [ OK ] Starting NMB services: [ OK ] # 請注意,上面 /etc/rc.d/init.d/smb 這個檔名是 Red Hat 的設定值, # 很多其他的套件不見得是使用這個檔名的!例如 OpenLinux 使用 samba 這個, # 所以請您務必使用 RPM 的相關指令來檢驗一下檔案名稱,或者使用 # # 另外,如前所說的, SAMBA 會啟用兩個 daemons ,所以這裡顯示兩個 OK! [root@test samba]# netstat -tlunp | grep ':13' tcp 0 0 0.0.0.0:139 0.0.0.0:* LISTEN 4307/smbd udp 0 0 192.168.0.100:137 0.0.0.0:* 4311/nmbd udp 0 0 0.0.0.0:137 0.0.0.0:* 4311/nmbd udp 0 0 192.168.0.100:138 0.0.0.0:* 4311/nmbd udp 0 0 0.0.0.0:138 0.0.0.0:* 4311/nmbd # 如果看到這樣,呵呵!就應該沒有問題啦! |
Client 端的測試在 Windows 或 Linux 當中都差不多,所以我將他獨立到另一個章節來說明,底下僅列出在本機上面的自我測試(亦即本機是主機,同時也是 client 就是了!)
[root@test
root]# smbclient -L //birdhome
added interface ip=192.168.0.100 bcast=192.168.0.255 nmask=255.255.255.0 Password: <==這裡按 Enter Domain=[birdhouse] OS=[Unix] Server=[Samba 2.2.7a-security-rollup-fix]
Sharename Type
Comment
Server
Comment
Workgroup
Master
|
這樣就簡單的設定完畢了!大家都可以使用網路上的芳鄰登入您的 Linux 主機,並且使用
/tmp 這個目錄喔!而,如果您想要增加其他的目錄開放給大家使用時,就請自行模仿
[tmp] 底下的設定值,
不過,需要特別留意的僅是 Linux 的檔案權限與
SAMBA 設定的權限關係!這個問題我們會在安全性與問題克服裡面進行詳細的說明喔!
(註:這個問題最常發生在使用者身上,因為『即使
SAMBA 主機設定您可以無限制的使用某個目錄下的檔案,但是是否能夠使用,仍然得視登入
SAMBA 的該使用者對於 Linux 的檔案系統是否有存取的權限』喔!)
設定需要使用者登入的 Workgroup
上面介紹了沒有防備的 SAMBA 主機之後,您是否覺得:『呵呵!SAMBA 還真是不錯用』啊!是沒錯啦!設定方面確實很簡單,然而還是有缺點的,就是萬一有外人不小心在網路上的芳鄰上面點一點、按一按,剛好進入到您的主機系統當中,由於您的主機系統是沒有防備的,所以他可以自由的進出您的主機,也可以隨意的將資料下載(或者是上傳)到您的
SAMBA 主機上面,更可能由於區域網路內有 Nimda 等網路芳鄰攻擊型病毒,而將病毒硬塞一份到您的
SAMBA 主機當中,使得您的區域網路裡面的網路頻寬被吃掉之外,還可能使其他的區域網路內的
Windows PC 作業系統被搞破壞掉~哇!真是問題多多啊!所以囉!不建議在公共的場合底下設定無防備的
SAMBA ,即使是私人單位內部,還是不建議架設上面的沒有任何防備措施的 SAMBA
主機喔!
所以呢,接下來,我們要介紹的就是需要使用者提供帳號密碼才能登入 SAMBA
主機的設定方法咯!使用者必須要能夠提供帳號與密碼供主機判定身份,若身份合格,才能夠使用主機的相關資源喔!底下我們要介紹的是比較簡單的
peer/peer
的連線 ( 相關的連線模式,請參考前面的連線模式一節
),此外,使用的還是 workgroup 的方式來設定的喔!
- 主機預計分享的狀況:
- 設定 lmhosts:
- 開始設定 smb.conf 並檢驗 smb.conf 的設定參數:
- 設定使用者帳號與密碼:
在整個 LAN 裡面的工作群組 ( workgroup )為:birdhouse
我的 Linux 主機 NetBIOS 名稱為 ( netbios name ):birdhome
安全設定為工作群組類型 user
分享家目錄與特定目錄 /home/public 給所有使用者使用
同樣的,我有三部主機,請參考上一章節的設定值:
在這個案例當中,我們要分享的資料有(1)每個人的家目錄;(2) /home/public 這個特定目錄。我們知道 smb.conf 有個 path 來指定給 SAMBA 真正取用的目錄,但是在這個案例中,我們要指定的是每個人的家目錄吶!怎麼設定好家目錄呢?呵呵!就使用變數來給他設定好啊!例如底下的說明:
[root@test
samsa]# vi smb.conf
[global] # 底下為一般設定項目(主機名稱、工作群組等) workgroup = birdhouse netbios name = birdhome server string = Bird's testing SAMBA Server client code page = 950 # 與安全有關的登入資訊項目,這個 security = user 一定要設定, # 而密碼需加密,此外,密碼檔案放置在 /etc/samba/smbpasswd 裡面, # 這個檔案需要自行設定起來喔!等一下會介紹! security = user encrypt passwords = yes smb passwd file = /etc/samba/smbpasswd # 一些與安全性有關的設定,其中, hosts allow 較為有趣一點! # 當您設定了 hosts allow 之後,未在 hosts allow 裡面規定的 IP # 將無法登入 Linux 的 SAMBA 主機喔!特別留意吶!如果您想要完全開放 IP, # 或者使用防火牆管理,那就不要設定 hosts allow 了! hosts allow = 192.168.0. 127. log file = /var/log/samba/%m.log max log size = 0 socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192 interfaces = 192.168.0.100 dns proxy = no # 底下則設定每個使用者的家目錄! [homes] comment = Home Directories browseable = no writable = yes valid users = %S create mode = 0664 directory mode = 0775 # create mode 指的是新建立檔案的權限,而 directory mode 則是新建目錄的權限 # 至於 valid users 則是有權限進入者,這裡設定為 %S 喔!所以, # 每個使用者就可以進入自己的家目錄了! [public] comment = Public Stuff path = /home/public public = yes writable = yes [root@test samba]# grep -v '^#' smb.conf |grep -v '^;'|grep -v '^$' # 這個動作在確認一下上面的設定是否相同,因為有時候可能會忘記將某個 # 設定給註解掉呢! ^_^ [root@test samba]# mkdir -p /home/public # 上面既然有提到要開放 /home/public ,當然,這個目錄就必須要存在啊! |
設定使用者帳號是很重要的一環,因為設定錯誤的話,當然也就任何人都沒有辦法登入的!在這裡我們必須先要說明一下 Linux 的檔案系統與 SAMBA設定的使用者登入權限的相關係!
- 在 Linux 這個系統下,任何程序都需要取得 UID 與 GID ( User ID 與 Group ID ) 的身份之後,才能夠擁有該身份的權限,也才能夠適當的進行存取檔案等動作!
- 關於 Linux 這個系統的 UID 與 GID 與帳號的相對關係,通通記錄在 /etc/passwd 這個檔案當中;
- SAMBA 僅只是 Linux 底下的一套軟體,使用 SAMBA 來進行 Linux 檔案系統時,還是需要以 Linux 系統下的 UID 與 GID 為準則!
如果上面這幾點說明您沒有問題了,現在就來看一下當我們在 Windows 電腦上面以網路上的芳鄰來連接
Linux 並且進行資料的存取時,會是怎樣的一個情況呢?
- 我們需要透過 SAMBA 所提供的功能來進行 Linux 的存取,而 Linux 的存取是需要取得 Linux 系統上面的 UID 與 GID 的,因此,我們登入 SAMBA 主機時,所利用 SAMBA 取得的其實是 Linux 系統裡面的相關帳號!這也就是說,在 SAMBA 上面的使用者帳號,必須要是 Linux 帳號中的一個!
如果上面您可以理解了,那麼就可以知道底下的這個基本規則:『在 SAMBA 主機所提供能夠登入的帳號,必須要在 /etc/passwd 裡面存在!』,也就是說,如果您想要使用 ken 登入 SAMBA 主機,那麼在 Linux 上面就必須要存在有 ken 這個帳號,如此一來,當您以 ken 登入 SAMBA 主機時, SAMBA 才能夠去 /etc/passwd 找到相對應的 UID 與 GID ,來提供您登入 SAMBA 之後取得的程序的相關權限!這個咚咚相當的重要,如果這裡搞不清楚,在後面的一些目錄權限的設定就會通通搞亂掉了!
所以說,如果您需要以 bird 這個帳號登入 SAMBA 時,並且 Linux 本身並沒有 bird 這個使用者,呵呵!那麼您就必須要使用 useradd 來使 Linux 系統多出一個名為 bird 的帳號,然後才可以讓該帳號登入 SAMBA 伺服器喔!並且,並不是所有在 /etc/passwd 裡面的帳號都可以用來登入 SAMBA 主機,必須要使用 SAMBA 的相關功能 (就是 smbpasswd 這個指令) 所新增到 SAMBA 密碼設定檔裡面的帳號才可以使用 SAMBA 登入喔!廢話不多說,來假設一個例子吧!假設 Linux 已經具有 bird, bigbird, smallbird 三個帳號,而我只想要讓 bird 使用 SAMBA 而已,其他兩個帳號不想開放,那麼我就只要這麼做即可:
0. 根據 smb.conf
的設定,建立一個密碼檔!
如果您是第一次建立 SAMBA 的使用者,才需要進行這個動作: 因為我們在 smb.conf 裡面設定密碼 smb passwd file = /etc/samba/smbpasswd [root@test root]# cd /etc/samba [root@test samba]# touch smbpasswd [root@test samba]# chown root:root smbpasswd; chmod 600 smbpasswd # 請注意, smbpasswd 這個檔案記錄了能夠使用 SAMBA 伺服器的使用者帳號 # 與密碼,所以當然只有 root 才能夠進行讀寫了!特別留意其權限啊! 1. 開始建立密碼: [root@test samba]# smbpasswd -a bird New SMB password: <==在這裡輸入 bird 的密碼 Retype new SMB password: <==再輸入一遍 bird 的密碼 Added user test. # 請特別留意, SAMBA 的密碼是放在 /etc/samba/smbpasswd 這個檔案內,當然, # 您可以更改這個檔名 (在 smb.conf 裡面改),但是, Linux 系統的帳號密碼 # 是放在 /etc/shadow ,這也就是說, SAMBA 伺服器的密碼與 Linux 底下的 # 帳號密碼並不一定要相同的!至於 smbpasswd 的使用大致上有幾個參數: 2. smbpasswd 之語法解釋 語法:smbpasswd [-adem] username 參數: : 如果都沒有加上任何一個參數,亦即『smbpasswd bird』時,這表示: 修改 SAMBA 密碼檔(/etc/samba/smbpasswd)裡面的 bird 這個帳號的密碼! 也就是說,密碼檔裡面已經存在一個 bird 的帳號了! -a : 在 smbpasswd 密碼檔裡面新增一個使用者 -d : 讓在 smbpasswd 密碼檔裡面的某個帳號的使用者暫時無法使用 SAMBA 當多了 -d 的參數時,在 smbpasswd 裡面某個欄位會多出一個 D 的參數, 代表該帳號目前無法使用喔! -e : 與 -d 參數相反,讓某個帳號恢復使用! -m : 該 username 為機器代碼(Machine Account),這個與 domain model 有關! 範例: [root@test samba]# more smbpasswd bird:1001:01FC5A6BE7BC6929AAD3B435B51404EE:0CB6948805F797BF2A82807973B89537:[UX ]:LCT-3F1ECFE6: [root@vbird samba]# smbpasswd -d bird Disabled user bird. [root@vbird samba]# more smbpasswd bird:1001:01FC5A6BE7BC6929AAD3B435B51404EE:0CB6948805F797BF2A82807973B89537:[DUX ]:LCT-3F1ED105: # 特別留意,當使用 -d 之後,該帳號會在密碼檔案裡面的中括號之特殊欄位中, # 多出一個 D 的參數,讓該帳號暫時無法使用喔! |
重新啟動 SAMBA 很簡單啊,還是使用 /etc/rc.d/init.d/smb 來動作,至於 client 端的測試就需要其他的要求了!
[root@test
samba]# testparm
[root@test samba]# /etc/rc.d/init.d/smb restart [root@test samba]# smbclient -L //127.0.0.1 added interface ip=192.168.0.100 bcast=192.168.0.255 nmask=255.255.255.0 Password: <==直接按 Enter Anonymousloginsuccessful Domain=[BIRDHOUSE] OS=[Unix] Server=[Samba 2.2.7a-security-rollup-fix] Sharename Type Comment --------- ---- ------- public Disk Pulic Stuff IPC$ IPC IPC Service (Bird's testing SAMBA Server) ADMIN$ Disk IPC Service (Bird's testing SAMBA Server) ...(略)... # 注意看上面,因為我們沒有在 smbclient 指定登入者,所以登入 # 後的身份會被指名為匿名者 anonymous 喔!由於我們有開放 public 給大家 # 瀏覽,所以還是看的到咚咚的!(註:我有省略一些輸出!) [root@test samba]# smbclient -L //127.0.0.1 -U bird added interface ip=192.168.0.100 bcast=192.168.0.255 nmask=255.255.255.0 Password: <==這裡請務必輸入正確的 bird 的 SAMBA 密碼! Domain=[BIRDHOUSE] OS=[Unix] Server=[Samba 2.2.7a-security-rollup-fix] Sharename Type Comment --------- ---- ------- public Disk Pulic Stuff IPC$ IPC IPC Service (Bird's testing SAMBA Server) ADMIN$ Disk IPC Service (Bird's testing SAMBA Server) bird Disk Home Directories ...(略)... # 仔細分辨一下上下兩個不同點。在多加了 -U username (-U bird 那個地方) # 由於登入者的身份變成 bird 了,因此我們就可以看到 bird 的家目錄了! # 也就是粗體字那一行啊!這樣可以清楚的知道了?! |
由前面在介紹 smbpasswd 時,您大概已經可以知道 SAMBA 帳號(在 /etc/samba/smbpasswd
裡面)與 Linux 帳號(在 /etc/passwd 裡面)的差異咯,若當我們以 SAMBA 登入
Linux 主機後,會取得一個使用者的相關權限,此外,SAMBA 也有自訂的權限(writable,
read only, public 等等的參數,均會影響登入者的權限喔!),這些權限的相關性為何?!反正有個大前提一定要知道的,無論您使用任何
process 在 Linux 上面,該程序都需要符合 Linux 系統的權限概念,也就是說,
Linux 本身的檔案權限大於 SAMBA 對於使用者所設定的權限!
舉上面的例子來說好了,那個 /home/public 我們在 SAMBA 中設定的是 writable
喔!所以,當我以 bird 登入 SAMBA 伺服器後,對於 /home/public 應該是具有可以讀寫的能力的!但是,偏偏剛剛我是以
root 的身份來建立 /home/public ,因此該目錄僅有 root 可以寫入(權限為 755
),因此, bird 是無法在 /home/public 底下進行寫入的動作的!所以,當我以網路上的芳鄰並以
bird 登入 Linux 的 SAMBA 伺服器,結果想要將資料傳輸到 /home/public ,螢幕就會顯示『您沒有權限寫入』之類的字眼~不要懷疑,絕對就是『Linux
權限的問題』啦!因此,這個時候請利用你的 chown 或者 chmod 指令來修改一下該目錄的權限吧!重要重要喔!
上面的設定案例應該蠻足以提供一般家庭用的環境中進行設定了!如果您還要擴充分享的目錄與能夠登入的使用者,可以這樣做:
- 利用編輯 smb.conf 來多開放其他的目錄,並且特別注意 Linux 在該目錄下的權限喔!請使用 chown 與 chmod 吧!
- 利用 smbpasswd 來新增其他使用者到 /etc/samba/smbpasswd 裡面去,如果該帳號並沒有出現在 /etc/passwd 裡面,請先以 useradd 新增該帳號;
- 不論進行完任何的設定,請先以 testparm 進行確認,之後以 /etc/rc.d/init.d/smb restart 來重新啟動!
事實上,SAMBA 的一般用途就是在這個連線的模式中!多使用 SAMBA 來分享您的資源吧!我都是使用
SAMBA 來做為遠端伺服器與我的工作機互通有無的重要媒介說~
設定較大型網域的 Linux Samba PDC ( Primary Domain Controller )主機
上面介紹了兩種方法,比較常用的還是那個需要使用者登入資訊的工作群組方法,該方法相當的適合小型的網域呢!但是,如果是比較大型的網域,那就比較傷腦筋了~就如同在原理部分我們提到的連線方法裡面的
domain
model 的模式(請參考原理部分的說明)。一般來說,如果在比較大型的網域系統當中,通常系統管理員都會選擇
domain model 的連線模式,如此一來在使用者帳號與密碼以及登入後取得的電腦資源控管上顯的相當的容易。不過,這種
domain model 比較常見於 Windows NT 的架構當中,也就是說,控管整個 domain
裡面的使用者帳號與密碼,其實是由 Windows NT 伺服器來管理的吶!所以說,現在如果我們想要使用
SAMBA 主機作為整個 domain 裡面的的一員,並且 SAMBA 主機本身並不管理自己的帳號與密碼,那麼
SAMBA 自然就得要將帳號與密碼的查詢轉給另一部提供帳號、密碼查詢的主機來服務與辨識身份啦!當然囉,
如果您的網域當中並沒有 Windows NT 的 PDC 主機,那麼使用 SAMBA 作為 PDC
主機,以提供整個網域的帳號與密碼的驗證工作,也是一個可行的方案!底下我們要介紹的,就是以
SAMBA 當作 PDC 的一個簡易的設定!請留意喔,我們底下說明的是一個簡單的
PDC 主機,如果您還需要額外的磁碟分享,請發揮您自己的創意喔!(修改 smb.conf
)
- 預計達成的架構:

- 需要有每一部在這個網域內的 PC 的機器代號 (Machine account),這個 Machine account 就是各個主機的 NetBIOS 名稱,也就是 bird2000, bird98 等主機名稱。不過,請特別留意,在各個 PC 上面的主機名稱為 bird2000 與 bird98,但是在 PDC 的帳號名稱上面,需要加上 $ 在後端,也就是在 PDC 上面需要設定 machine account 成為 bird2000$, 與 bird98$ 才行!
- 由於 Windows NT ( 例如 Windows 2000 這個作業系統 )第一次登入 PDC 時,需要使用系統管理員的身份建立連線,所以, PDC 需要設定 root 這個使用者帳號才行!此外, PDC 會去搜尋每部 PC 要登入 PDC 時,他的 machine account ,所以,在 /etc/passwd 與 /etc/sabma/smbpasswd 裡面需要同時具有:(1)每個 machine account 的帳號; (2)root 這個帳號需要加入 smbpasswd 裡面; (3)任何想要使用 PDC 登入的該網域的使用者帳號,例如我們這個案例的 bird 這個使用者。所以囉,在這個案例中, /etc/passwd 與 /etc/samba/smbpasswd 需要有底下的帳號:bird2000$, bird98$, bird, root 至少要有這些帳號喔!如果還需要讓 bird2, bird3... 等人登入的話,就需要使用 useradd 及 smbpasswd 新增使用者囉!(註:特別特別注意,那個 root 的帳號只有在您的網域當中有 Windows 2000 或者是 Windows XP 的作業系統 時才需要加入 /etc/samba/smbpasswd 裡面!這是因為第一次登入 PDC 時,需要以 root 的身份來設定好總總的連線才行!)
- 在 SAMBA 這部 PDC 上面需要開放的目錄有哪些呢?
/home/samba/netlogon:當使用者在其他 PC 登入 PDC 的身份認證時,PDC 會依據使用者的設定檔(profile)來配置給這位登入者相關目錄與權限的開放,這個目錄就是在放置使用者的設定檔了!設定檔的檔名通常為 username.bat ,不過我這裡設定每個人都使用類似的 profile ,所以檔名統一為 startup.bat 喔!請注意,這個檔案必須是 DOS 的檔案!
/home/user:使用者的家目錄啊!
/home/samba/profiles:每個使用者在登入 SAMBA 所模擬的 PDC 之後,還可以取得『自己的 Windows 設定值』喔!這包含了『我的最愛、每個 Windows 軟體的相關設定、通訊錄....一大堆資料』。都可以在這個地方給他寫入呢!
如果一切設定都沒有問題,那麼當使用者在 bird2000 這部個人電腦以網域的型態登入時,
PDC 會主動的依據 /home/samba/startup.bat 裡面的使用者設定資料,配置『網路磁碟機』到
bird2000 那部電腦上面去,以及將 /home/profiles/user 的個人設定值載入到
bird2000 去!所以 bird 這個使用者就可以在 bird2000 這部電腦上面使用 SAMBA
上頭的資料了!而且使用的桌面設定啦、我的最愛啦等等的資料都是 SAMBA 上面的喔!同樣的,未來如果
bird 這個使用者在 bird98 這部電腦登入到 PDC 時,仍然會得到 bird 個人的網路磁碟機
( 就是 /home/bird ),啊哈!那麼 bird 不論在哪裡都可以自由自在的使用自己在
Linux SAMBA 伺服器上面的資料啦! ^_^
我們預計分享的目錄與權限就如同上一個步驟的說明,不過,我還想要額外的分享出 /tmp 這個目錄就是了!那麼整個 smb.conf 的簡易設定可以是這樣的!
[root@test
samsa]# vi smb.conf
[global] #1.底下為一般設定項目(主機名稱、工作群組等) workgroup = birdhouse netbios name = birdhome server string = Bird's testing SAMBA Server client code page = 950 #2.密碼與登錄檔相關的資訊! security = user encrypt passwords = yes smb passwd file = /etc/samba/smbpasswd log file = /var/log/samba/%m.log max log size = 0 socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192 #3.其他與 domain 有關的參數 os level = 64 preferred master = yes domain master = yes local master = yes domain logons = yes logon script = startup.bat ; logon script = %U.bat logon path = \%LProfiles%U wins support = yes dns proxy = no time server = yes # 在上面的設定當中,都是與 domain model 有關的參數 # os level 表示與其他主機相比,這部 SAMBA 機器的管理等級,設高一點 # domain logons 表示這部 SAMBA 主機可以提供 Widnows 登入的服務 (PDC) # logon script 表示當使用者登入之後,要到哪裡去執行他的 profile 設定檔, # 我這裡將每個使用者登入時,都要去執行 startup.bat 這個檔案, # 這個檔案放置的地方其實就是底下 [netlogon] 的 path # 設定的目錄,請特別留意 domain 與 netlogon 的關係! # 底下則設定每個使用者的家目錄! [homes] comment = Home Directories browseable = no writable = yes valid users = %S create mode = 0664 directory mode = 0775 # 有特定帳號者可以使用底下這個設定 [netlogon] comment = Network Logon Service path = /home/samba/netlogon writable = no write list = bird root follow symlinks = yes guest ok = yes # 沒有特定帳號者,例如 Windows 98 的使用者,會使用底下的路徑! [Profiles] path = /home/samba/profiles read only = no create mask = 0600 directory mask = 0700 browseable = no [tmp] comment = Temporary file space path = /tmp read only = no public = yes [root@test samba]# grep -v '^#' smb.conf |grep -v '^;'|grep -v '^$' # 這個動作在確認一下上面的設定是否相同,因為有時候可能會忘記將某個 # 設定給註解掉呢! ^_^ [root@test samba]# testparm | more [root@test samba]# /etc/rc.d/init.d/smb restart |
在這邊的設定當中,最重要的地方在於 [global] 裡面的 logon script 以及 [netlogon]
的設定了!這兩個設定請特別留意不要設定錯誤了!否則會真的很麻煩~在這個案例當中,我讓每個使用者登入
PDC 辨識身份後,都去執行 /home/samba/netlogon/startup.bat 這個檔案就是了!與剛剛我們上面建議的每個使用者使用不同的
scripts 是不一樣的設定值喔!請稍微留意一下吶!好了,在這樣的設定值之後,我們就可以直接重新啟動
smb 了!並且也可以提供 Windows 來登入我們的 PDC 囉!
剛剛上面我們設定了很多的不同的資料目錄,在這裡我們得要好好的給他建立起來!
[root@test
root]# mkdir /home/samba
[root@test root]# mkdir /home/samba/netlogon [root@test root]# mkdir /home/samba/profiles [root@test root]# cd /home/samba/netlogon [root@test netlogon]# vi startup.tmp net time \birdhome /set /yes net use U: \birdhomehomes net use T: \birdhometmp # net 是 Windows NT 網域的相關指令用法: # net time :表示目前 (client) 使用的時間要與 \server (在這裡是 birdhome) # 同步的意思!有時候因為 Server 與 Client 不同步,某些程式 # 會有問題! # net use [device:] [directory] # device: 那個 device 是 Windows 的磁碟槽啦! # directory 是 SAMBA 主機相對的目錄! # 在我這個案例當中,每個使用者登入之後,他會在檔案總管當中, # 發現有個 U 槽,而且內容是 \birdhomehomes 相同; # 發現有個 T 槽,內容則是 /tmp 喔! # 特別留意, startup.bat 必須要是 DOS 的格式,所以在 Linux 上編輯時, # 還要加上一些特殊的轉換動作! [root@test netlogon]# cat -A startup.tmp | tr '$' 'r' > startup.bat [root@test netlogon]# cat -A startup.bat net time \birdhome /set /yes^M$ net use U: \birdhomehomes^M$ net use T: \birdhometmp^M$ # 看到了嗎?!每一行的最後面要加上有 ^M 這個 Windows 的傑作才可以! # 除此之外,我們還要將原先在 bird2000 上的 bird 這個使用的個人設定值 # 給他複製過來 SAMBA 主機上面喔!在 Windows 2000 預設的情況下, bird # 這個人的設定值會是在: C:Documents and Settingsbird # 請將這個 bird 目錄完整的給他複製到 /home/profiles/bird 當中,也就是說, # 在 SAMBA 主機內的 /home/profiles/bird 裡面就有原先 Windows 2000 內的 開始 Application Data Favorites My Documents .... # 等等的檔案資料喔!然後這樣做: [root@test netlogon]# cd /home/samba/profiles [root@test profiles]# chown bird -R bird/ # 這個時候您應該已經將原先 Windows 的 bird 這個人的設定值給他複製到 # /home/samba/profiles/bird 當中了才對! |
在上面我們建立了 SAMBA 所需要的目錄,尤其是那個 netlogon !然後,還需要建立每個使用者登入都會去讀取的
startup.bat 那個檔案,注意啊!那個檔案是 Windows 的格式,所以如果您在 Linux
上面編輯的話,不要忘記了加上特殊動作來轉換格式!當然啦!如果您是在 Windows
的系統上面編輯 startup.bat 的話,那麼特殊動作就不需要進行了!此外,由於我們想要讓
bird 這個使用者『不論在哪一部 Windows 2000 的機器上面,都可以套用同一組的個人設定值』,這個時候就得要讓
/home/samba/profiles 內部存有與使用者帳號相同的目錄了,也就是 /home/samba/profiles/bird
這個目錄喔!在這個目錄下就具有 bird 的我的最愛啦、我的文件夾啦等等的資料!因為是
bird 的啊!所以記得要將該目錄的所有人設定為 bird 才行喔!(註: /home/samba/profiles/user
每個使用者的設定值最好不要太大,鳥哥曾經測試過,以我的 Windows 2000 原本的設定值完整的給他複製到
SAMBA 主機上,結果竟然發現有 300MB 這麼大,導致我每次在 Windows 2000 登入
PDC 主機來取得我的 Profile 都要等大約 10 分鐘左右,因為要將 profile 完整的讀過來啊!(要傳
300MB 的資料量啊!)
重要的工作來啦!我們要為 PDC 建立與 Client 主機的相關性!也就是在剛剛上面第一個步驟當中,我們提到的 Client 的機器代碼 (Machine account),在我們的案例當中,需要多了個 bird2000$ 與 bird98$ 兩個機器代碼,您必須要在 /etc/passwd 與 /etc/samba/smbpasswd 裡面同時增加這兩個機器代碼才行!除此之外,因為 bird2000$ 與 bird98$ 其實只是要給 SAMBA 用的帳號而已,所以我們不需要給他家目錄與 Shell 啊!而且,在 /etc/samba/smbpasswd 當中,還要告訴 SAMBA 這兩個帳號是機器代碼喔!所以您應該這樣做:
[root@test
root]# groupadd smbmachine
# VBird 有時候會有點龜毛,既然我的 /etc/passwd 裡面會有 SAMBA 用的機器碼, # 那麼我就將這幾個機器代碼歸類在特定的 group 之內,那就自訂一個名為 # smbmachine 的 Machine group 好了! ^_^ [root@test root]# useradd -g smbmachine -d /dev/null -s /bin/false bird2000$ [root@test root]# useradd -g smbmachine -d /dev/null -s /bin/false bird98$ [root@test root]# smbpasswd -a -m bird2000$ [root@test root]# smbpasswd -a -m bird98$ # 注意啊!多了一個 -m 的參數,這個參數代表後面接的為 Machine account , # 而不是一般設定的 User account 喔! [root@test root]# usradd bird [root@test root]# smbpasswd -a bird # 假設 bird 這個使用者還沒有被建立,那麼您應該這樣建立他! [root@test root]# smbpasswd -a root # 記得要將 root 的身份設進去 smbpasswd 裡面喔! # 不過,只要在 Windows 2000 的登入設定完成之後,就可以將 root 取消掉了! |
特別的再給他注意喔!因為 bird2000$ 與 bird98$ 只是 machine account ,所以不需要提供
Linux 的密碼啊!也就是不需要 passwd bird2000$ 喔!不要去更動 /etc/shadow
的意思啦! ^_^
要使用 Windows 2000 登入 SAMBA 做成的 PDC 比較麻煩一點~因為首先我們必須要『先以
root 登入 SAMBA 的 PDC 主機,設定好連線之後,才算成功』的啦!所以說,我們的
/etc/samba/smbpasswd 裡面才需要那個 root 使用者!要用 Windows 2000 登入
Linux 的步驟是這樣的:
- 『開始』=>『設定』=>『控制台』,在出現的視窗中選擇雙擊『網路和撥號連線』,出現如下視窗:
- 在上面的視窗當中,選擇『網路識別』,之後出現底下的視窗喔:
- 由於我們在這個設定中,需要的主機名稱為 bird2000 而網域為 birdhouse ,所以,萬一您的 Windows 2000 原本設定並不是這樣的網路識別狀態,那麼請選擇上面圖示的『內容』在出現的視窗當中填入正確的主機名稱與工作群組!選擇『確定』然後重新開機吧!
- 重新開機完成之後,還是回到『網路識別』(第二個步驟,也就是上上個圖示)的地方,按下『網路識別』,會出現歡迎畫面,在按下『下一步』之後,會出現如下的圖示:
- 上面的圖示請選擇『這台電腦是公司網路的一部分』才行!然後選擇『下一步』出現如下畫面:
- 上面的圖示請選擇『我的公司使用一個或多個網域的網路』才行!然後按下下一步,會出現一個警告的訊息,告訴您,您必須要有的資料,這包含了電腦名稱、網域使用者名稱等等!在按下下一步之後,會出現如下畫面:
- 這裡請注意啊!第一次登入時,需要在使用者名稱的地方輸入 root 才行喔!那個『密碼』是由 smbpasswd 設定的密碼,並不是 root 在 Linux 系統 (/etc/shadow) 裡面的密碼喔!不要搞錯了!按下下一步吧!
- 由於可能會出現一些小問題,所以這個畫面會重複的給他出現的啦!重新輸入一下我們的網域與主機名稱吧!按下下一步:
- 再次的輸入 root 與 root 的密碼 ( /etc/samba/smbpasswd 裡面的密碼資料!),網域填寫正確喔!然後按下確定:
- 看到這個畫面時,您應該要很高興的啦! ^_^!因為這就是正確的顯示已經登入了 PDC 主機啦!咦!怎麼會有新增使用者呢?!是的,因為 SAMBA 可以提供一個功能 ( 在 smb.conf 裡面設定 add user script 的項目,請參考 man 5 smb.conf ) 來讓第一次登入 PDC 的 Windows 2000 可以使用 SAMBA 提供的功能來使 Linux 主機增加使用者(同時新增在 /etc/passwd 與 /etc/samba/smbpasswd )!不過,我不太建議這樣做啦!因為要新增使用者,只要網管人員登入 SAMBA 主機,使用 useradd 與 smbpasswd 即可,多了這個功能,覺得有點危險就是了 @_@!所以,通常我就直接按下『此時不新增使用者』,呵呵!這樣就已經是 OK 啦!
- 萬一在您的設定過程當中,老是出現底下的畫面:










真是太可惡了!果真如此的話,那麼建議您可以這樣做看看:
- 先察看一下 /var/log/samba 裡面的登錄檔資訊,尤其是 bird2000.log 是關於 bird2000 這部主機的資訊吶!
- 如果還是無法解決,可以在 lmhosts 裡面增加 bird2000 的 IP 與主機名稱的對應,然後將 samba 整個關掉『/etc/rc.d/init.d/smb stop』,等待一段時間讓 NetBIOS 的名稱解析時間逾時,再重新啟動 samba 『/etc/rc.d/init.d/smb start』,然後再重新做一次輸入 root 的密碼那個動作!
在我嘗試過的案例中,上面第二個步驟挺有效的!不過,還是得要察看 /var/log/samba 裡面的登錄資訊才行喔!
- 使用者名稱:這個名稱可以(1)填入本機Windows 2000的使用者名稱,也可以 (2)填入 PDC 上面的使用者名稱,例如 bird ;
- 密碼:這個密碼也要對應上面輸入的使用者,看是本機或者是 PDC 主機的使用者相對應的密碼;
- 登入到:這裡可以選擇您所需要登入的是本機還是 PDC 網域吶!也需要與上面兩個項目對應說!

所以,我就可以自由自在的使用我自己的網路磁碟啦!不論在那個電腦上面,都可以使用同一個
SAMBA 機器上的目錄,並且使用的都是同一組密碼 (因為記錄在 PDC 主機上面),修改密碼也很簡單啊!
^_^
經過上面的設定之後,如此一來,您就可以讓使用者在各個 Widnows 2000 的環境當中使用您的網路磁碟機囉!
^_^
在 Windows 98 上面登入 PDC 要比 Windows 2000 來的簡單一些些說~整個作法可以這樣來:
- 先清除桌面,然後在桌面將滑鼠指標移動到『網路上的芳鄰』上頭,按右鍵,選內容,會出現如下畫面:

務必確認在上面的視窗當中,最上頭的空白部分含有:
- TCP/IP 的協定:這個用來設定你的 IP 以及網路參數
- NetBEUI 的協定
然後特別留意喔!在底下的空格上面,必須要是『Client
for Microsoft Networks』的主網路登錄模式,之後,請在上方的空格處,雙擊『Client
for Microsoft Networks』,會出現如下畫面:


只要填入正確的 PDC 上面的 ID 與密碼,加上正確的網域,就可以登入了!而在啟動
Windows 的畫面時,會有一些程序在跑,那就是我們剛剛在 /home/samba/netlogon/startup.bat
所建立的批次檔囉!跑完之後,您可以開啟檔案總管,就會發現如下畫面喔:
沒錯!多了兩個磁碟分割槽出來囉!恭喜您,又連線上囉!
所以說, Windows 98 要連上 PDC 很容易吧!幾個動作就搞定了!
好了,關於 SAMBA 的 PDC 作法我們就談到這裡,還有更多的資訊您可以前往這個章節最後面的『參考資源』所列出的網址去查閱,因為還有很多的作法吶!關於
PDC ,事實上,我覺得在一個網域當中,如果有多部的 Windows NT 主機,例如
Windows 2000 這一類的比較穩定的個人使用桌面版本時,使用 PDC 就很有用了!因為
Windows 2000 也是一個多人的作業系統,不像 Windows 98 是單人的作業系統,所以,當使用
Windows 2000 而無法登入 PDC 時,基本上,您是無法使用 Windows 2000 上面的任何的資訊的,但是在
Windows 98 上面若無法正確的登入,您仍然具有該電腦的主控權喔!所以,我個人是覺得
PDC 在 Windows 2000 主機比較多的環境下,用途會更廣喔!如果只是 Windows
98 的環境,那麼.....或許 PDC 還是不要玩吧!我覺得對於新手來說,好難吶!
@_@
設定成為印表機伺服器 (printer server)
剛剛上面的說明大部分都是針對磁碟與目錄的分享來進行 SAMBA 的設定,那麼
SAMBA 有沒有可能分享出裝置呢?舉個例子來說,例如那個我們在辦公室都會用到的印表機
( Printer ) 呢?如果說,能夠讓我們辦公室的 File Server 同時提供印表機列印的功能,如此一來,藉由
Linux 這個作業系統可以 24 小時開機的穩定功能,我們就可以隨時進行列印囉!沒錯!這真是個重要的任務啊!所以,底下我們就以
SAMBA 進行印表機列印功能的提供者的角度,來介紹這個 smb.conf 的設定喔!
事實上,在 Linux 底下的列印工作,是統一交由標準列印介面(或者說是程式)來進行資料與印表機之間的傳輸的,而這個列印的介面目前主要有兩個,一個是比較老牌的
LPRng
,另一個則是功能較為強大的 CUPS ( Common Unix Printing
System, CUPS ) 介面。因為 LPRng 的設定比較簡單,而且功能也不差,所以這裡我們主要是以
LPRng 這個列印管理程式來進行說明的喔!底下就是 LPRng 這個列印管理程式的一般工作流程:

整個列印流程是這樣的:(1)當我們在 Windows 底下進行列印時 (就是按下列印按鈕後),
(2)經由網路傳輸功能將列印的工作傳至 Linux 系統下的 LPRng 這個列印程序來接管,
(3)之後經過一些轉換程序( 轉成正確的列印格式 )以及濾鏡 ( filter ) 功能,將資料轉換成可以經由印表機輸出的格式後,
(4)最後就可以由印表機 ( /dev/lp0 )
來印出了!請注意喔,在 Linux 底下,印表機的裝置代號為 /dev/lp0
,第二部印表機則是 /dev/lp1 以此類推!
經過上面的程序說明後,我們知道要以 SAMBA 進行印表機的分享工作,實在很簡單!您可以這樣一步一步的進行喔!
- 確定印表機可以正確輸出:
既然要分享印表機,當然就需要在 Linux 上面的印表機可以正確的列印咯!請這樣做:
- 將印表機接在 Linux 主機的 LPT 列印埠上 ( 就是 25 針的那個插槽 );
- 打開印表機的電源 (以後就不要關了吧! ^_^ );
- 在 Linux 主機上面開一個終端機 ( Terminal ) ,然後輸入:
[root@test root]# echo "Hello world" > /dev/lp0 |
如果在印表機上面印出了 Hello world 時,就表示印表機已經準備妥當了!接下來就是各種設定囉!
LPRng 是 Red Hat 主要的套件之一,所以如果您是 Red Hat 這個 Linux distribution 的使用者,請拿出您的原版光碟,然後就可以使用 RPM 來安裝 LPRng 了!不過,如果您不是使用 Red Hat 的話,那麼很可能因為您的 distribution 僅提供 CPUS 而已,所以就必須要手動的安裝 LPRng 囉!安裝的方法可以這樣做:
- 先到 LPRng 的官方網站下載最新的 LPRng 套件:
- 將捉下來的套件到 /usr/local 底下解壓縮,並且開始設定與安裝!( 因為我沒有使用 SSL 加密以及 Kerberos 等功能,所以直接將他拿掉了!詳細的功能參數請自行讀取該目錄下的 INSTALL !)
官方網站:http://www.lprng.com
FTP 網站:ftp://ftp.lprng.com/pub/LPRng/LPRng/
在我這個例子當中,主要是以 LPRng-3.8.21.tgz 這個套件為準喔!
[root@test
root]# cd /usr/local/src
[root@test src]# tar -zxvf /root/LPRng-3.8.21.tgz .....(會產生一個名為 LPTng-3.8.21 的檔案)... [root@test src]# cd LPRng-3.8.21 [root@test LPRng-3.8.21]# ./configure --prefix=/usr/local/LPRng > --disable-keros_checks --disable-ssl --enable-nls ....( 花一段時間來進行系統確認! ).... 建議可以使用 ./configure --help 來察看每一個設定項目的說明! [root@test LPRng-3.8.21]# make clean all ....再花一段時間來等待~ [root@test LPRng-3.8.21]# make install # 開始給他安裝下去! 這個時候, LPRng 套件的所有資料都放置在/usr/local/LPRng 裡面了! [root@test LPRng-3.8.21]# vi /etc/man.config # 在這個檔案當中加入一行 MANPATH /usr/local/LPRng/man # VBird 2003/07/20 # 這樣未來在進行資料的 man 時,就可以直接查到 LPRng 的相關參數了! # 例如 man checkpc、 man lprm ... [roo@test LPRng-3.8.21]#vi
/etc/profile
|
安裝好了 LPRng 之後,接下來就是要使用 LPRng 的設定檔來設定好您的印表機了!由於使用 RPM 安裝與 Tarball 安裝時,一些檔案放置的地點不一樣,所以,底下的設定在不同的系統當中可能會有點小差異喔!請依照您的系統作一下設定更改吧! ( 我這裡分別以 Red Hat 9 這個使用 RPM 安裝與 Mandrake 9.1 以 Tarball 安裝時的設定為主 )
0. 先確認 lp
這個系統帳號是否存在?
[root@test root]# id lp uid=4(lp) gid=7(lp) groups=7(lp) 萬一出現了『 id: lp: No such user 』時, 請務必進行底下的動作,以新增印表機管理員帳號: groupadd lp useradd -s /sbin/nologin -d /var/spool/lpd -g lp -r lp mkdir -p /var/spool/lpd/lp0 chown lp:lp -R /var/spool/lpd 如果您的系統當中早就已經有了 lp 這個帳號,那麼上面的動作就不需要進行! 1. 先設定好 printcap 這個主要設定檔! [root@test root]# cp /etc/printcap /etc/printcap.bak.raw#只是備份 [root@test root]# vi /etc/printcap # 如果是使用 Tarball 安裝的,這個檔案在 /usr/local/LPRng/etc/printcap lp0|HP-LaserJet-1100: :sh: :ml=0: :mx=0: :sd=/var/spool/lpd/lp0: :lp=/dev/lp0: #上面說明的是: # lp0 為印表機在 Linux 的名稱,HP-LaserJet-1100 為印表機 lp0 的別名 # 請注意, HP-LasetJet-1100 可以隨意設定,但是 lp0 最好保留, # 因為未來比較容易處理一些突發狀況! # sh 為是否印出標頭,這裡我們沒有設定標頭喔! # ml, mx 為印表機能夠接受的訊息,這裡我們不加限制! # sd 為列印工作的佇列(列印檔案暫存的目錄) # lp 就是印表機的實際裝置代號了! # 事實上,重點僅在於 lp 與 sd 而已~ ^_^ [root@test root]#
checkpc -f
|
啟動印表機實在很簡單:
[root@test
root]# /etc/rc.d/init.d/lpd start
[root@test root]# netstat -tln tcp 0 0 0.0.0.0:515 0.0.0.0:* LISTEN [root@test root]# echo "/etc/rc.d/init.d/lpd start" >> /etc/rc.d/rc.local |
如果有出現 printer 或者是 515 這個 port number 的話,那就表示 lpd 應該已經在
LISTEN 了!如果確定該程式沒有問題,就可以將他寫入開機時啟動的設定檔當中囉!
既然印表機已經 ready 了,接下來就是要重新的給他設定好 smb.conf 囉!您可以這樣加入一段支援:
[root@test
root]# vi /etc/samba/smb.conf
# 不管在哪裡,找到 smb.conf 然後編輯他就是了!然後加入底下這一段: [global] printcap name = /etc/printcap load printers = yes printing = lprng # 上面這三行預設應該會存在 smb.conf 當中,只要找到這三行, # 並將行首的 ; 拿掉即可!注意,這三行是新增的! # 特別給他留意一下,印表機的分享是經由 [printers] 相關的設定來提供的! [printers] comment = HP LaserJet 1100 printable = yes browsable = no public = no validusers = bird puma addida amani pada printing = lprng path = /var/spool/lpd/samba # 注意一下,上面重要的地方在於: # printable 需要啟動為 yes # validusers 有需要的話就請自行設定,我這裡僅允許五位使用者登入而已! # printing 設定成使用 lprng 這個管理程式 # path 這個就是印表機佇列,我將他設定在 /var/spool/lpd/samba 中 [root@test root]# mkdir -p /var/spool/lpd/samba [root@test root]# chown root:root /var/spool/lpd/samba [root@test root]# chmod 777 /var/spool/lpd/samba [root@test root]# testparm [root@test root]# /etc/rc.d/init.d/smb restart |
如此一來,在同一個網域的朋友就可以看到我這一部 Linux 分享的印表機了,並且,印表機的名稱為
HP LaserJet 1100 喔!很方便吧!
由上面的步驟進行來看,這個時候您的 Linux 主機應該已經可以分享您的印表機了!很開心吧! ^_^ !不過,我們還是得要稍微熟悉一下在 Linux 底下管理印表機的手段喔!為什麼呢?想像一個畫面,今天,您已經在 Windows 上面按下『列印』按鈕,偏偏竟然是印錯了檔案,這個檔案還有 100 頁之多~因為 SAMBA 會先將列印資料佇列在 /var/spool/lpd/samba 當中,所以,這個時候使用 Windows 並不能管理該印表機~哇!難道我要癡癡的等待 100 頁印完嗎?!呵呵!當然不需要!您可以登入 Linux 來控管您的列印資料呢!前提之下是,您必須使用與 SAMBA 相同的使用者登入系統喔!
[root@test
root]# lpq
# 可以察看印表機的狀態 Printer: lp0@test 'HP-LaserJet-1100' Queue: no printable jobs in queue Status: job 'cfA209test.vbird.idv.tw' removed at 13:29:24.163 [root@test root]# lprm all # 將所有印表機的等待列印的資料通通刪除! |
基本上,我最常下達的指令就是 lprm all 了!因為印表機出現問題時,使用這個指令可以將印表機等待中的資料通通殺掉,然後重新啟動印表機,就可以恢復正常的列印囉!
所以將您的 SAMBA 設定成為印表機伺服器也不難吧! ^_^
設定成為印表機伺服器 ( Printer Server + CUPS 系統)
除了 LPRng 這個列印程式之外,我們還可以使用較新的 CUPS 系統 ( Common
Unix Printer System ) 來做為我們的列印程序喔!底下我以 Red Hat 9 為例來設計
CUPS + SAMBA 的設定方式:
- 安裝 CPUS 的相關套件:
- 設定 CUPS 的設定檔 cupsd.conf 並啟動 cups:
- 設定您的第一部印表機:
- 編寫 smb.conf ,加入印表機的支援:
安裝的套件就是 CUPS 咯!檢查一下吧!
[root@test
root]# rpm -qa | grep cups
cups-libs-1.1.17-13.3 cups-1.1.17-13.3 qtcups-2.0-15 |
由於 CUPS 是一個服務,他可以對 Internet 提供列印的服務喔!所以,未來啟動 cups 之後,會產生一個監聽的介面,而誰可以登入這個監聽的介面呢!?呵呵!沒錯,就是需要在這個 cupsd.conf 檔案內設定啦!我們假設我們的 CUPS 是對內部的 192.168.0.0/24 這個網域開放的,所以:
[root@test
root]# vi /etc/cups/cupsd.conf
# 其實這個檔案的設定很類似 httpd.conf 呢!我們只要針對兩個參數來設定即可, # 分別是 / 與 /admin 喔!設定只有 192.168.0.0/24 可以登入! AuthType Basic AuthClass User Order Deny,Allow Deny From All Allow From 192.168.0.0/24 # 注意一下,上面的 AuthClass User 這個設定值,可以讓您以 Linux 上面的 # User 身份來登入 CUPS 以設定 Printer 喔! # 這個 /admin 的設定內容主要與『印表機管理員』有關的設定 Order Deny,Allow Deny From All Allow From 192.168.0.0/24 # 這個 / 設定值則是決定誰可以登入使用 Printer 呢! [root@test root]# /etc/rc.d/init.d/cups start [root@test root]# netstat -utln | grep 631 tcp 0 0 0.0.0.0:631 0.0.0.0:* LISTEN udp 0 0 0.0.0.0:631 0.0.0.0:* # 請注意到,啟動了 CUPS 之後,會產生這個 631 的埠口吶! |
好了,既然 CUPS 這樣就可以設定成功了,接下來當然就是需要設定我們的印表機了!設定印表機可以很簡單的以 lpadmin 來設定,也可以使用 Web 介面來設定喔!在文字介面下,假設您的印表機是 HP 的雷射印表機 (lasetjet),例如鳥哥研究室的 hp 1100 laserjet ,我可以這樣設定:
[root@test
root]# lpadmin -p HP-1100-LaserJet -m laserjet.ppd
-E
> -v parallel:/dev/lp0 # 參數說明: # -p 後面接印表機名稱,名稱可以隨便取! # -m 後面接印表機的介面模組檔案(module interface file) # -E 則是說,這個印表機可以用來進行列印之意! # -v 後面接的則是『序列埠 parallel』或者是『網路 socket 』! # 以 lpadmin 設定好印表機後,整個印表機的狀態列其實被放置在 # /etc/cups/printers.conf 裡面喔! |

注意一下,如果如同上面的圖示中,出現了『file:/dev/null』呵呵!那就表示『您的印表機發生錯誤了』,因為一般來說,Linux 本機印表機應該是會出現:『parallel:/dev/lp0 』才對喔!在上面的圖示當中,您可以選擇『Modify Printer』或者是『Configure Printer』來最佳化您的印表機吶! ^_^
既然印表機已經 ready 了,接下來就是要重新的給他設定好 smb.conf 囉!您可以這樣加入一段支援:
[root@test
root]# vi /etc/samba/smb.conf
# 不管在哪裡,找到 smb.conf 然後編輯他就是了!然後加入底下這一段: [global] printcap name = cups load printers = yes printing = cups [printers] comment = HP LaserJet 1100 printable = yes browsable = no public = no validusers = bird puma addida amani pada printing = cups path = /var/spool/lpd/samba [root@test root]# mkdir -p /var/spool/lpd/samba [root@test root]# chown root:root /var/spool/lpd/samba [root@test root]# chmod 777 /var/spool/lpd/samba [root@test root]# testparm [root@test root]# /etc/rc.d/init.d/smb restart |
Client 端的設定:
- 整個 SABMA 的主要目的其實是針對區域網路來達成更便利的資料傳輸的手段,而既然是針對區域網路
( LAN ) 的話,那麼整個區域網路的 Windows 與 Linux 電腦的設定就得好好的搞定一番啦!因為整個
LAN 裡面使用最多的大概就是那個 NetBIOS ( 一般常見的是後來的升級版,也就是
NetBEUI ),所以,您必須要在 Windows 裡面至少設定兩個通訊協定才行:
- TCP/IP
- NetBEUI
- 所有的電腦都是同一個『工作群組, Workgroup 』
- 所有的電腦都有獨特的『NetBIOS 主機名稱』。
關於 Windows 的通訊協定設定方法,我們已經在前面的『區域網路簡介』裡面提過了,這裡不再贅述,請自行前往參考。除了這個協定的設定之外,在同一個網域之內,要將電腦以 LAN 兜在一起,最好還需要網路識別的方式:
還是得再次的強調,NetBIOS 主機名稱與 Internet 上面使用 DNS 解析的主機名稱不同!假設這個設定的項目通過了,那麼該如何在 Windows 與 Linux 之間分享檔案呢?
在 Windows 上瀏覽 Linux 分享檔案的設定
在 Windows 之間分享檔案真的是很簡單,只要設定好『資源分享』或者是 Windows NT 系列的所謂的『共用』那麼就可以使用彼此的檔案囉!而要在 Windows 上面瀏覽 Linux 的 SAMBA 主機,那也很簡單,只要知道 Linux 的 NetBIOS Name 之後,直接在『網路上的芳鄰』去點選,也可以利用『開始』=>『搜尋』=>『電腦』=>填寫入 Linux 的 NetBIOS Name ,如果一切連線都沒有問題,就可以連接上 SAMBA 主機啦!因為實在太簡單了!所以這裡我們就不再強調了!(註:事實上,使用檔案總管就可以進行很多分享的工作了!尤其是『連線網路磁碟機』的項目喔!)
在 Linux 上瀏覽 Windows 分享檔案的設定
既然 Windows 可以瀏覽 Linux 的檔案,沒道理 Linux 不能瀏覽 Windows 的檔案吧!呵呵!這麼說真是不錯啊!這裡我們介紹幾個 Samba 提供的指令,來讓您輕鬆的使用 Windows 的資源喔!
smbclient 語法介紹:
1. 察看 NetBIOS 主機分享的目錄狀態: [root@test root]# smbclient -L \netbiosname [-U username] # 這個 -L 的參數主要的目的在於察看 netbiosname 那部主機有提供什麼目錄, # 比較需要留意的是,如果沒有加上 -U username 時,那麼預設是以匿名者 # anonymous 來登入該 NetBIOSname 的,所以能看到的目錄或許就會被限制喔! # 另外,NetBIOS 主機名稱在 Linux 底下,需要在前面加上『 \ 』喔! 範例: [root@test root]# smbclient -L \bird2000 -U bird added interface ip=192.168.1.2 bcast=192.168.1.255 nmask=255.255.255.0 Password: Domain=[BIRDHOUSE] OS=[Windows 5.0] Server=[Windows 2000 LAN Manager]
Sharename Type
Comment
Server
Comment
Workgroup
Master
Sharename Type
Comment
Server
Comment
Workgroup
Master
# 先以 -L 的參數察看一下
127.0.0.1 這個 IP 的分享情況,發現 bird 可以登入
|
事實上,使用 smbclient 一點也不方便,因為使用的是 ftp 的功能語法,有點怪怪的~能不能像 Windows 那樣,可以直接連線網路磁碟機啊?!這當然沒有問題!不過就需要藉由 smbmount 來協助了!smbmount 可以將遠端主機分享出來的目錄整個給他 mount 到本機的 mount point (某個目錄),如此一來,遠端主機的目錄就好像在我們本機的一個 partition 一樣喔!可以直接執行複製、編輯等動作!這可就好用的多了!底下我們來談一談怎麼用這個 smbmount 吧!
smbmount 語法介紹:
[root@test root]# smbmount \netbiosnamedirectory [-o options] 參數說明: netbiosname :可以是 IP 也可以是網芳上面的NetBIOS主機名稱 -o 後面接的參數 options 常用的有底下這些參數: username=你的登入帳號:例如 username=bird password=你的登入密碼:需要與上面 username 相對應啊! codepage=語言格式:這個可以設定支援的語系,例如繁體中文:codepage=cp950 範例: # 假設我要以 bird 身份,密碼為 mypasswd 掛載遠端主機 \birdhometmp # 那個目錄,並且掛載到我 Linux 的 /home/birdhome 這個目錄,如何做? [root@test root]# smbclient -L \birdhome -U bird # 先以 smbclient 找出可以掛載的目錄!在這個案例中,我有 \birdhometmp # 可以掛載! [root@test root]# smbmount '\birdhometmp' /home/birdhome > -o username='bird',password='mypasswd',codepage='cp950' # 再次給他強調一下,因為 在 bash 當中是特殊字元,所以掛載時請特別 # 使用 ' 來將 設定成為一般字元!還有,在 -o 後面的各項參數中, # 中間都是以逗號來隔開的!並且設定值最好也使用單引號 ' 來設定! [root@test root]# df //birdhome/tmp 3020160 186880 2833280 7% /home/birdhome # 如上所示,你應該就可以看到目錄對應 mount point 啦! |
經由 smbmount 的動作,我們就可以輕易的將遠端分享出來的咚咚給他掛載到自己 Linux 本機上面!好用的很~事實上,原本 mount 這個指令如果有支援 smbfs 的話,那也就可以直接掛載 網路上的芳鄰 分享出來的目錄了!例如上面的例子當中,我們也可以這樣下達指令:
[root@test
root]# mount -t smbfs '\birdhometmp' /home/birdhome
> -o username=bird,password='mypasswd',iocharset='cp950' # 上面那個 iocharset 與 codepage 都是用來設定語系的! |
更詳細的 mount 用法,請 man mount 或者看考『鳥哥的 Linux 私房菜 -- 基礎學習篇』的內容喔! ^_^
安全相關方面
- 使用 SAMBA 其實也是挺有一定的危險性的!因為近期來利用 NetBIOS 來進行攻擊的病蟲實在是不少,而且,也有很多坊間的書籍在告訴大家『入侵的手段』啊!所以,我常常告誡我的朋友們,在
Windows 上面,資源分享完畢之後,應該立即將該分享的權限取消!以避免不小心被入侵或者被感染病毒的機會啊!此外,如果您是學校單位的話,那麼利用
SAMBA 分配給每的班級自己的網頁空間,應該是不錯的想法,不過,如果有某個班級一下子就用掉您的大部分硬碟空間,這樣對其他的使用者來說,有點不太公平~因此,利用
quota 來限制每個使用者(班級)的硬碟使用空間,也是一個很可行的方案啊! ^_^
- 編輯修改 /etc/fstab ,使得 /dev/hda2 這個 partition 成為如下模樣:
- 上述動作確定沒有問題之後,請重新開機啟動 quota 的支援:
- 執行底下的指令,建立 quota 所需要的設定檔案:
- 啟動 quota 囉:
- 設定 bird 的磁碟配額:
- 僅針對 192.168.0.0/24 這個網域開放 SAMBA;
- SAMBA 的 port 有 137~139 tcp/udp;
- SAMBA 主機的網路卡為 eth0
- /etc (因為含有 /etc/passwd 以及 /etc/samba 裡面的資料,所以建議可以全部給他備份下來 )
- /home (還是可以察看一下,是否有其他非必要的!不過,一般來說,都會是備份的個人資料比較多啦!)
- 其他由 smb.conf 裡面設定開放的目錄。
配合 quota 來規範使用者的使用空間
quota 是磁碟配額限制的一個 daemon ,您可以依據不同的使用者來加以限制他們能夠使用的硬碟空間,前提是『該磁碟空間必須是一個獨立的 partition 』才行,不建議針對根目錄『 / 』進行 quota !這也是為什麼我們在主機規劃時特別建議大家獨立出一個 partition 來進行硬碟規劃的原因!關於 quota 的詳細用法在『鳥哥的 Linux 私房菜--基礎學習篇』裡面已經談得很清楚了,這裡我們不再詳談!只給大家來做個練習就是了!
/dev/hda2 /home ext3 defaults,usrquota,grpquota 1 1 修改完畢之後,請千萬記得使用 mount -a 查詢看看有沒有設定錯誤 (上面總共只有六個欄位喔!),這個動作如果發生錯誤,那麼請記得再次的進行 /etc/fstab 的修改!請特別留意啊!因為寫錯的話,很容易造成無法正常開機的窘境! sync; sync; sync; reboot quotacheck -avug 特別注意,如果上述的動作發生『找不到設定檔』的意思的訊息時,您可以這樣做: touch /home/aquota.user; touch /home/aquota.group 然後在進行一次 quotacheck 即可! quotaon -av edquota -u bird Disk quotas for user test (uid 501): Filesystem blocks soft hard inodes soft hard /dev/hdb2 32 40000 50000 8 0 0 因為我們只針對硬碟空間,不針對 inode 做限制,所以只要前面的數字修訂即可!請注意,數字的單位為 kbytes ! |
如何設定防火牆 iptables
如果您的主機環境本身已經具有防火牆了,而且是較為嚴密的防火牆,那麼 SAMBA 所需要的 port 應該會被您擋住才對~這個時候,請特別在您的防火牆規則中開放出 SAMBA 所需要的 port 與針對的 IP 網域喔!一般來說,因為 SAMBA 越來越不安全了(前面說過,病毒的問題很嚴重),所以,通常我們會建議大家 SAMBA 僅針對我們自己的網域來開放即可!甚至僅針對少部分主機來開放即可呢!
要設定防火牆,請務必具有 iptables 的基本觀念,在 認識網路安全 的章節當中我們已經談過了,請自行前往參考喔!在這裡,我們僅針對 SAMBA 所需要的 port 與 IP 網段進行說明。
假設:
- /sbin/iptables
-A INPUT -p tcp -i eth0 -s 192.168.0.0/24 --dport 137:139 -j ACCEPT
/sbin/iptables -A INPUT -p udp -i eth0 -s 192.168.0.0/24 --dport 137:139 -j ACCEPT
當然啦!這是很簡單很簡單的防火牆規則,您必須要依據您的環境自行修改(通常修改那個 192.168.0.0/24 網段即可!)。除了 iptables 必須要開放之外,您還需要將管制 daemon 是否能夠進出的 TCP Wrappers 開放才行吶!如果萬一您看到 /etc/hosts.deny 裡面多了這一行:
- ALL : ALL
不要懷疑,很可能會造成不只 SAMBA 不能動作而已~連其他的 daemon 都可能會無法動作呢!所以,請將這一行拿掉吧!或者是將適合的 daemon 開放在 /etc/hosts.allow 檔案裡面喔!
如何設定 daemons 的抵擋功能 ( hosts allow 項目 )
除了 iptables 與 TCP Wrappers 這兩個 Linux 本身的防火牆機制之外,其實 SAMBA 本身也就提供了防火牆的機制啦!那就是在 /etc/samba/smb.conf 這個檔案裡面的 hosts allow 與 hosts deny 的項目了!這兩個設定是在 [global] 裡面的設定,一般來說,只要設定 hosts allow 那一項就可以了!因為沒有被設定到裡面的 IP 都無法使用 SAMBA 喔!以上面的防火牆例子來說,我們僅開放 192.168.0.0/24 這個網域可以使用 137~139 的 port ,不過,在這個網域當中,我們又僅針對五部電腦開放服務,例如 192.168.0.1~192.168.0.5 ,那麼我可以在 smb.conf 裡面多加這一行:
- hosts allow = 192.168.0.1
192.168.0.2 192.168.0.3 192.168.0.4 192.168.0.5
各個 IP 之間都以空格隔開即可!此外,如果您想要針對整個網域來開放,例如本機的 127.0.0.0/8 這個網域,那麼可以再加入:
- hosts allow = 192.168.0.1
192.168.0.2 192.168.0.3 192.168.0.4 192.168.0.5 127.
這樣就可以了!如此一來,雖然本機所在的網段 192.168.0.0/24 都可以嘗試登入 SAMBA ( 因為可以通過 iptables 的規則 ),不過卻會被 SAMBA 本身的設定擋住!這有什麼好處啊?!好處就是在網段裡面嘗試登入 SAMBA 但是卻遭 SAMBA 拒絕的 IP 與原因,都會被紀錄到登錄檔裡面去,如此一來,我們可以被動的利用分析 SAMBA 的登錄檔,以發現是否有人想要入侵或者是有某部電腦是否已經被不正常的病毒所感染呢!
要備份些什麼咚咚?( /home, 開放的咚咚, smb.conf, smbpasswd...)
跟 SAMBA 最有關的當然就是使用者的資訊囉!所以,您應該要備份的就是使用者的資料,以及 Samba 相關的設定資料了!比較相關的有幾個咚咚:
無論如何,備份還是挺重要的!
問題克服
- 通常我們在設定 SAMBA 的時候,如果是以 Workgroup 的方式來進行 smb.conf
的設定時,幾乎很容易就可以設定成功了!並沒有什麼很困難的步驟!不過,萬一還是無法成功的設定起來,請務必察看登錄檔,也就是在
/var/log/samba 裡面的資料!在這裡面的資料當中,您會發現:咦!怎麼這麼多檔案啊!因為我們在
smb.conf 裡面設定了:
- log file = /var/log/samba/%m.log
那個 %m 是指 Client 的 NetBIOS Name 的意思,所以,當有個 bird2000 的主機來登入我們的 birdhome 主機時,那麼登入的資訊就會被紀錄在 /var/log/samba/bird2000.log 檔案喔!而如果萬一來源 IP 並沒有 Netbios name 的時候,那麼很可能是一些錯誤訊息,這些錯誤訊息就會被紀錄到 log.smbd 裡面去了!所以,如果您要察看某部電腦連上您的 SAMBA 主機發生了什麼問題時,特別要留意這個登錄檔的形式喔!
另外,如果您的 SAMBA 明明已經啟動完成了,卻偏偏老是無法成功,又無法查出問題時,建議先關閉 Samba 一陣子,再重新啟動:
- /etc/rc.d/init.d/smb stop
在我的案例當中,確實有幾次是因為 PID 與 NetBIOS 的問題,導致整個 SAMBA 怪怪的~所以完整的關閉之後,經過一陣子的短暫時間,再重新啟動,應該就可以恢復正常了!
還有,萬一您在進行寫入的動作時,老是發現『您沒有相關寫入的權限!』,不要懷疑,幾乎可以確定是 Permission 的問題,也就是 Linux 的權限與 SAMBA 開放的權限並不相符合!無論如何,您必須要瞭解能不能寫入 Linux 磁碟,看的是 PID 的權限與 Linxu 檔案系統是否吻合,而那個 smb.conf 裡面設定的相關權限只是在 SAMBA 運作過程當中『預計』要給使用者的權限而已,並不能取代真正的 Linux 權限喔!所以,萬一真的發現該問題存在,請登入 Linux 系統,查驗一下該對應的目錄的 permission 吧! ^_^
附帶說明一點,常常有朋友會問 swat ( Samba Web Administration Tool )是什麼?那個其實是 SAMBA 提供給 SAMBA 系統管理員的一個 Web 圖形介面的管理工具!我個人是不太喜歡使用工具來工作的,如果您有興趣,請自行參考相關的書籍來使用吧! ^_^
重點回顧
- (等待更新中)
本章與 LPI 的關係
在 LPI 網站 http://www.lpi.org 裡面提到的,(等待更新中)
參考資源:
- man 5 smb.conf
- Study Area :http://www.study-area.org/linux/servers/linux_samba.htm
- 電子書 Using Samba:http://de.samba.org/samba/ftp/docs/htmldocs/using_samba/index.html
- Samba PDC FAQ:http://de.samba.org/samba/ftp/docs/htmldocs/samba-pdc-faq.html
- Samba PDC HOWTO: http://de.samba.org/samba/ftp/docs/htmldocs/samba-pdc-howto.html
- SAMBA 官方網站:http://www.samba.org/
- rondo 的 SAMBA 密技:http://rondo.study-area.org/~linux/student_samba/server/samba/
- 依瑪貓的列印文件:http://www.imacat.idv.tw/tech/lnxprint.html
本章習題練習
- 一般來說, SAMBA 使用的設定檔放置在哪裡?檔名為何?
- 哪一個指令可以用來判斷 smb.conf 這個設定檔的正確性?
- 哪一個指令可以用來察看 SAMBA 主機分享出什麼目錄?
- smbmount 的功能為何?
- 我今天使用 smbpasswd 去新增一位使用者 badbird,讓他可以登入我的 Linux SAMBA 主機,但是無論如何就是無法新增。您認為原因可能是什麼?
使用的檔名為 smb.conf ,通常會放置在 /etc/samba/smb.conf 裡面,不過,最好可以使用 rpm -qc packagename 來查詢!
當我們修改完 smb.conf 之後,記得要以 testparm 來進行 samba 的確認!
利用 smbclient 即可:『smbclient -L NetBiosName -U username 』!
在 Linux 系統上面,將 Windows 的網路上的芳鄰,或者是 Linux 的 SAMBA 所提供分享的資源掛載到自己的系統下!
由於 Samba 使用者的資訊必須要存在於 /etc/passwd 裡面,既然無法新增,應該先確認 badbird 這個使用者已經存在於 Linux 系統當中了!如果還是無法新增,則需要查閱 smb.conf 的設定,看看是否 /etc/samba/smbpasswd 這個密碼檔案不存在?!