加入RUN!PC粉絲團
最近新增的精選文章
 
最多人點閱的精選文章
 
 
精選文章 - 中小企業專區
分享到Plurk
分享到FaceBook
 
免費IT建置--
檔案共享與檔案伺服器
文‧圖/柳百郁 2011/7/19 下午 03:54:29

絕大多數的中小企業都有檔案共享的需求,無論是財務、業務或研發人員,或多或少都會遇上彼此之間,必須進行檔案交流的狀況。依據檔案的型式、大小與種類,Linux都能提供各種面向的應用,滿足檔案交換上的需求。

兩台以上的電腦之間,必須單向或雙向看得到對方的特定檔案,就是檔案共享的需求。舉例來說,研發人員之間共享規格文件甚至程式原始碼、財務部門提供業主隨時查看財務報表等皆為檔案共享。透過Linux的世界裡使用的Samba服務,可以在Windows的網路芳鄰裡看到Linux機器提供的分享,Samba不僅讓Linux/Unix系統彼此溝通,還為建構Windows與Linux間的通訊,彼此分享檔案與印表機。透過Samba伺服器的建置,Linux主機上的檔案與印表機便能夠與Linux、IBM System 390、OpenVMS與Windows的用戶端電腦共享。

另一種常見檔案共享是透過FTP的模式傳輸,常見於取得網際網路上的檔案,或提供予遠端使用者取用大型檔案,用戶端透過FileZilla或CuteFTP這類的FTP用戶端軟體,將檔案上傳或取得所需檔案。Linux熱門的幾個分支套件,幾乎皆提供FTP用戶端與伺服器套件,使用Fedora/RedHat預設的vsftpd建置FTP伺服器,幾乎只要調整一兩個選項再啟動服務即可使用。

Samba檔案共享
為了讓Linux與Unix分享Windows系統裡的檔案,或Windows平台下的印表機,於是有了Samba專案。只要是使用SMB/CIFS通訊協定的用戶端電腦,例如DOS、Windows、OS/2、Linux等,都可以透過Samba提供檔案與列印的服務,透過Linux套件管理程式安裝Samba伺服器套件後,找到設定檔smb.conf,依據企業環境進行設定:
# 全域性設定參數
[global]
workgroup = MIDEARTH <==工作群組名。將用戶端電腦的查詢控制在特定工作群組下。
netbios name = GANDALF <==Samba伺服器能夠辯識的名稱,預設是用主機DNS名稱最前面的那個元件。
security = SHARE <==使用者無須密碼,即可使用,這種設定方式通常用在只作印表機共享的機器上。當用戶端電腦登入的使用者名稱與Unix裡的帳號一樣時,可用security=user來作安全性的控管。
passdb backend = guest <==僅在使用tdbsam passwd後端時才用,這個檔案儲存SambaSAMAccount的資訊,也會需要用到POSIX帳號資訊。
printing = cups <==控制系統解讀印表機狀態資訊的方式。若Samba是以libcups編譯且設為printing=cups,那麼任何手動的列印指令都將被忽略,其它可用的參數還有BSD、AIX、LPRNG、PLP、SYSV、HPUX、QNX與SOFTQ。
printcap name = cups <==使用CUPS列印介面。在System V系統下,可使用printcap name=lpstat自動列出所有可用的印表機清單。
wins server = 192.168.1.1 <==指定提供nmbd認證的Wins伺服器。nmbd處理所有名稱的認證與解析需求。
# 印表機共享設定
[printers]
comment = All Printers <==會出現在用戶端電腦上的共享說明字串。
path = /var/spool/samba <==在printers下,指的是具sticky bit權限、可寫入的spool目錄。
printer admin = root <==可透過遠端管理介面,對印表機作任何操作的使用者。
guest ok = Yes
printable = Yes <==印表機必須擁有可列印屬性,在此屬性設定下的目錄,必須是允許寫入的權限。
use client driver = Yes
browseable = No
# 資料夾共享設定
[data] <==共享的目錄名稱。
comment = Data <==共享目錄的說明文字。
path = /export <==此目錄在系統絕對路徑。
guest only = Yes
[global]區段定義Samba伺服器全域性設定,在這之下所作的設定會套用在整個伺服器裡,包含共享的資料夾與印表機。另一個特殊段落,未出現在範例裡的是[home],在home區段之下所作的設定,是Samba提供給各個登入的使用者所使用的家目錄。[printers]區段設定印表機共享,指定於printcap檔裡,或透過CUPS API提供列印功能的印表機,都可以透過這裡的設定,讓列印佇列設定為共享功能。設定檔裡每個以中括弧([])框起的段落,提供的不是一個共享,就是一個服務元(meta-service),global裡的設定會影響所有段落,而有些設定僅供global使用、有些則僅供共享或服務元使用,在命令列模式下執行man smb.conf可查看如何調整設定檔,瞭解更詳盡的參數訊息與組態方式。

就Fedora/CentOS分支套件下的操作來說,透過yum可以搜尋到數個Samba相關套件,其中samba與samba-common為主要提供伺服器運作的一些檔案,安裝完成後編修smb.conf檔,建置Samba伺服器的環境後,啟動smb deamon便可開始對外提供Samba服務。

規格與通訊協定SMB/CIFS
Server Message Block(SMB)處於OSI七層裡的表現層(Presentation Layer),提供區域網路裡檔案與列印共享的功能。NetBIOS over TCP/IP是為了讓舊時代電腦,應用能在現在的TCP/IP網路上使用的網路協定,SMB通訊協定提供的檔案與印表機共享服務,則執行於NetBT(NetBIOS over TCP/IP)之上或直接在TCP上跑,支援的服務有名稱註冊與解析(UDP/TCP,通訊埠137)、未連線通訊之數據發散服務(UDP,通訊埠138),以及連結導向通訊的session服務(TCP,通訊埠139)。SMB封包是走通訊埠445,SMB用在client-server架構下,當用戶端(client)或伺服端(server)有一方停用NetBT時,可直接走這個通訊埠建立連結。

CIFS(Common Internet File System)檔案共享通訊協定,是用來讓用戶端對提供檔案與列印共享服務的伺服器,其建置於SMB通訊協定上,廣泛使用在跨平台的個人電腦與工作站上。CIFS通訊協定的功能除了檔案存取、檔案與紀錄的鎖定外,還可以作到安全快取/預先讀取/延遲寫入、檔案異動通知、通訊協定版本協商、延伸屬性、分散式複製Virtual Volumes、伺服器名稱獨立判讀、批次需求與支援萬國碼(Unicode)的檔案名稱。

FTP檔案傳輸
即便是在電子郵件容量與傳輸能力已大幅提升的今日,在遇上大型檔案的傳輸需求時,還是FTP比較好用。Linux的使用者透過FTP下載分支套件,動輒600MB甚至4點多GB的ISO檔、開放源碼社群的人,透過FTP下載必要的套件或原始程式碼使用。此外,說明文件的PDF檔、美工/攝影的原圖大型檔案,都是FTP應用的範疇。

FTP通訊協定
FTP通訊協定的存在除了提供檔案(電腦程式或資料等)共享、以間接的方式使用遠端電腦、提供使用者在不同主機中儲存檔案的選擇外,還能夠為資料的傳輸提供更可靠更有效率的管道。使用者使用特定的用戶端程式,連結遠端的FTP伺服器,便能進行資料的上傳或下載。


▲ FTP服務模式


資料連結的動作兩個方向都有可能,但不見得在傳輸的整個期間都會有這個動作。User PI指的是使用者通訊協定直譯器,功能在於啟始從使用者端通訊埠到FTP伺服器程序間的控制連結、初始化FTP命令,以及在檔案傳輸時管理user DTP。User DTP則是資料傳輸程序,在資料通訊埠「聆聽」等待來自FTP伺服器程序的連結。Server PI為伺服器通訊埠直譯器,在通訊埠聆聽來自user PI的連結,並建立控制通訊的連結。它會接收來自user PI的標準的FTP命令、傳送回應,並管理server DTP。Server DTP則為資料傳輸程序,在一般active狀態下,會建立帶聆聽資料通訊埠的資料連結,放在passive狀態下,就只作聆聽而不初始化資料通訊埠的連結。

vsftpd
以安全性為前提所建立的vsftp(Very Security FTP)專案,提供了建置FTP伺服器所需的所有元件。著名的ftp.redhat.com、ftp.debian.org與ftp.freebsd.org等站台,都是以vsftpd套件建構的FTP伺服器。透過套件管理程式安裝vsftpd後,可以在/etc或設定檔專屬目錄下,找到vsftpd.conf設定檔,較重要的幾個選項說明如下。

.anonymous_enable=YES <==允許匿名使用者(登入FTP伺服器時無須輸入帳號密碼,只需在帳號處輸入anonymous)。一般企業用途為安全起見應關閉此選項,通常分支套件、應用程式與學校單位提供的FTP伺服器較常開啟此選項。若要允許匿名上傳,則須另設定write_enable。
.dirmessage_enable=YES <==FTP伺服器使用者進入新的目錄就會顯示訊息,預設訊息是放在.message裡,但也可以改message_file,用你想用的檔名。
.xferlog_enable=YES <==事件紀錄檔會記錄上傳與下載的所有細節,預設會是存放在/var/log/vsftpd.log,但也可以修改vsftpd_log_file選項的設定,將事件紀錄檔放在另外指定的目錄下。
.connect_from_port_20=YES <==決定伺服器主機PORT的資料連結是否使用通訊埠20(ftp-data)。對某些用戶端電腦而言,基於安全性的理由,這是約定俗成的模式,相對地,若停用這個選項,vsftpd就會執行於較少權限的模式下。此值預設為NO。
.listen=YES <==啟動狀態下表示vsftpd執行於獨立伺服器的模式下。當vsftpd以獨立伺服器的方式執行時,會自行控管聆聽的動作、處理所有進來的連結。相對地,vsftpd也可以選擇在inetd或xinetd的deamon控管下執行,
.local_enable=YES <==是否允許本機登入。開啟的狀況下,位於/etc/passwd的使用者帳號皆可登入,只要有非匿名登入的需求都應該開啟這個選項。
.local_umask=077 <==本機使用者建立檔案時的umask值(八進制),設定時不要忘了最前面的0,否則會被當成十進制的值。【註:umask值減去777即為新建檔案的權限設定值。】
.chroot_local_user=YES <==本機使用者將限制在自已的家目錄下。當FTP伺服器提供使用者上傳功能時,為了安全性考量,有必要作此設定。
.userlist_enable=YES <==vsftpd將載入userlist_file裡所指定的使用者清單,在這個清單下的使用者登入時,會直接被拒絕不會進入到問密碼的這個階段,此舉可避免明碼密碼傳輸。
.userlist_deny=NO <==在userlist_enable啟動的模式下,若此值設為NO,則userlist_file裡設定的使用者才能登入。如被拒絕登入,就不會進入到詢問密碼的這個階段。
.tcp_wrappers=YES <==支援tcp_wrappers的vsftpd(編譯時決定)在開啟此選項的模式下,進來的連結皆可透過tcp_wrapper存取控制。此乃以IP為主的控制機制。

將設定檔依據企業環境需求修改完成後,執行/etc/init.d/vsftpd start啟動vsftpd服務,FTP伺服器便開始提供服務了。

proftpd
這是另一套同樣在許多分支套件預設的軟體倉儲庫裡,即提供的FTP伺服器架設套件。透過套件管理程式(例如yum或rpm)安裝完成後,假定以架設虛擬主機為例,主要設定檔大致如下:
ServerName "ProFTPD"
ServerType inetd <==伺服器型態,還可以選擇為standalone方式
Port 21 <==伺服器通訊埠

Umask 022 <==檔案與目錄建置時的預設umask

User nobody <==daemon執行的使用者
Group nogroup <==daemon執行的群組
MaxInstances 30 <==最大生成的子程序
TimeoutStalled 300 <==停頓的下載最大等待時間
<==開始虛擬主機的設定
ServerName "Virtual.com's FTP Server"
MaxClients 10
MaxLoginAttempts 1
DeferWelcome on
<==Limit段落,用來設定要控制哪些指令,此處限制的是login指令
DenyAll

<==定義匿名伺服器所使用的設定
User ftp
Group ftp
AnonRequirePassword on

AllowAll

HideUser root
HideGroup root

<==限制read,write與dirs指令
DenyAll




ProFTPd在核心之外另提供外加模組,供特定需求的企業使用:

.模組mod_sftp:SFTP支援。SFTP全名Secure File Transfer Protocol,建置在SSH2通訊協定上,與FTP通訊協定幾乎毫無關聯。易於SFTP搞混的FTPS指的是"FTP over SSL/TLS",後者是由mod_tls模組提供支援。
.模組mod_ldap:LDAP支援。這是為了讓ProFTPD在處理密碼、PID與UID時,可以從LDAP資料庫裡去撈資料,這個模組對已用LDAP整合企業內部所有帳號(包括Email、Samba與其它系統登入等)的環境來說,無異大大簡化了管理上的程序。
.模組mod_sql:SQL支援。這個模組提供proftpd與底層SQL資料庫(MySQL或Postgres)溝通的介面。將ProFTPD編譯為支援此模組的前提是,系統裡必須有對應的SQL資料庫函式庫與標頭檔-MySQL,要有mysql.h與libmysqlclient.a檔;Postgres則要有libpq-fe.h與libpq.a檔。
.模組mod_quotatab:支援Quota限額。FTP伺服器能夠控管到千百個使用者所擁有的千百個檔案,絕大多數系統都支援作業系統層級,或檔案系統層級的限額功能。但在proftpd虛擬使用者的功能下,很可能數個使用者用的是系統裡同一個帳號(User ID),這樣在限額控管時就很難靠這兩種層級來作,基於此有了mod_quotatab模組設計,它能作到針對虛擬使用者作限額的動作,更貼近FTP伺服器的需求。
.模組mod_ban:動態黑名單。ban清單的設計是用來預防已被禁止的使用者或主機等『登入』伺服器,但不會禁止他們『連結』,這個模組不是用來當防火牆用的,它只是可以在特定組態下觸發自動禁止的機制。

其它檔案存取小程式
在系統操作上,wget與scp也是筆者會常用到的檔案傳輸小工具。簡單來說,wget可以取回提供HTTP、HTTPS與FTP功能之遠端主機上的指定檔案。好處在沒有帳號密碼機制控管下的主機,使用者可以省去登入、切換目錄與登出的動作,直接取回已確知位置的檔案,例如:
wget ftp://194.199.20.114/linux/fedora/releases/10/Everything/x86_64/os/Packages/ncftp-3.2.2-1.fc10.x86_64.rpm
,直接將ncftp-3.2.2-1.fc10.x86_64.rpm取回,放置於現行目錄下,無須登入ftp://194.199.20.114,再切換數個目錄,也無須登出的動作。

另外在提供ssh功能的主機上,擁有具權限的帳號與密碼,可透過scp指令直接複製檔案:雙向皆可。例如:scp abc.txt jason@10.0.0.8:/tmp/.將本機當下目錄裡的abc.txt檔複製至遠端主機10.0.0.8上,登入10.0.0.8的使用者帳號為jason,目的地為JNT2主機裡的tmp目錄下,檔名一樣為abc.txt。

沒有一個程式能包山包海,讓管理者在各種環境下都能成功處理所有檔案傳輸,唯有瞭解常見的幾種檔案處理工具的特性與通訊協定,系統管理者才能因應各種狀況,快速應變、有效率地完成任務、解決問題。