三種常見的檔案共享服務--ftp,nfs,samba 區別和配置
FTP(File Transfer Protocol,檔案傳輸協議),是一種應用層協議,可以實現很好的實現跨平臺,但是無法實現一些其他的功能,像如檔案系統掛載等功能。NFS(Network File System,網路檔案系統)是工作在核心模式下的,因此不能很好的實現跨平臺,一般只能是Linux主機或者Unix主機之間,但可以實現掛載使用等功能。SMB(Service Message Block,服務訊息塊協議),能夠實現Windows和Linux主機之間的檔案共享服務,可實現跨平臺,在Linux上實現了CIFS(Common Internet File System)協議。
一、FTP協議
1、FTP原理知識
是一種C/S架構,基於套接字通訊,用來在兩臺機器之間相互傳輸檔案。FTP協議用到2種tcp連線:一是命令連線,用於客戶端和服務端之間傳遞命令,監聽在tcp/21埠;另一個是資料傳輸連線,用來傳輸資料,監聽的埠是隨機的。
2、FTP的被動模式、主動模式
主動模式的原理如下圖:
主動模式存在的問題是,在客戶端一般都會有防火牆的設定,當服務端與客戶端資料進行資料通訊時,客戶端的防火牆會將服務端的埠擋在外面。此時,通訊就會受阻。因此,被動模式就產生了。
被動模式的原理圖如下:
被動模式也會存在防火牆的問題,客戶端與服務端傳輸資料時,在服務端也會有防火牆,但在服務端的防火牆有連線追蹤的功能,解決了防火牆的問題。因此,一般使用被動模式比較多。
3、FTP的使用者認證
FTP支援系統使用者,匿名使用者,和虛擬使用者三種使用者認證。
匿名使用者:登陸使用者名稱是anonymous,沒有密碼
系統使用者:是FTP伺服器端的本地使用者和對應的密碼,預設訪問的是使用者家目錄
虛擬使用者:僅用於訪問伺服器中特定的資源,常見的虛擬使用者認證的方式有使用檔案認證或使用資料庫進行認證。最終也會將這些虛擬使用者同一對映為一個系統使用者,訪問的預設目錄就是這個系統使用者的家目錄。
4、常見的狀態資訊碼
1**:提示資訊
2**:成功執行的狀態碼
3**:需要進一步提供補充類的資訊碼,例如在輸入使用者賬號資訊後出現此狀態,提示繼續輸入密碼
4**:客戶端類的錯誤
5**:服務端錯誤
5、常見的實現FTP協議的工具
服務端:
Linux端:wu-ftpd,pureftp,vsftpd(Centos 6上預設提供的)
windows端:ServU,FileZilla-Server
客戶端工具:
Linux作業系統:ftp,lftp,lftpget,wget,cul,gftp等
windows作業系統:FileZilla
6、vsftpd
在CentOS上預設提供的是vsftpd(Very Secure FTP),以安全著稱。
使用者認證配置檔案:/etc/pam.d/vsftpd
服務指令碼:/etc/rc.d/init.d/vsftpd
配置檔案目錄:/etc/vsftpd
主配置檔案:vsftpd.conf
匿名使用者(對映為ftp使用者)共享資源位置:/var/ftp
系統使用者通過ftp訪問的資源的位置:使用者自己的家目錄
虛擬使用者通過ftp訪問的資源的位置:給虛擬使用者指定的對映成為的系統使用者的家目錄
7、常見的的vsftpd的引數設定
匿名使用者的配置:
anonymous_enable=YES #允許匿名使用者登入
anon_upload_enable=YES #允許匿名使用者上傳檔案
anon_mkdir_write_enable=YES #允許匿名使用者建立目錄
anon_ohter_write_enable=YES #允許其他的寫許可權(刪除目錄,檔案)
系統使用者的配置:
local_enable=YES #允許本地使用者的登入
write_enable=YES # 本地使用者可寫
local_umask=022 # 本地使用者的umask
禁錮所有的ftp本地使用者於其家目錄中:
chroot_local_user=YES #允許本地使用者只能訪問自己的家目錄,不允許訪問其他目錄,適用於所有的使用者
禁錮檔案中指定的ftp本地使用者於其家目錄中:
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
目錄訊息:
dirmessage_enable=YES # 開啟目錄提示資訊
在對應的目錄下建立一個.message的檔案,裡面的內容當我們在訪問時此目錄時,會看到提示的資訊。
日誌:
xferlog_enable=YES # 開啟傳輸日誌
xferlog_std_format=YES # 是否使用標準格式
xferlog_file=/var/log/xferlog #日誌檔案路徑
改變上傳檔案的屬主:
chown_uploads=YES
chown_username=whoever #上傳檔案後立即改變檔案的屬主名
vsftpd使用pam完成使用者認證,其用到的pam配置檔案:
pam_service_name=vsftpd #使用者認證檔案,在/etc/pam.d/目錄下
是否啟用控制使用者登入的列表檔案
userlist_enable=YES
userlist_deny=YES|NO # 為yes的意思是,userlist_file是黑名單檔案;是no的意思是userlist_file是白名單檔案
userlist_file=/etc/vsftpd/user_list,預設檔案為/etc/vsftpd/user_list
連線限制:
max_clients: 最大併發連線數;
max_per_ip: 每個IP可同時發起的併發請求數;
傳輸速率:
anon_max_rate: 匿名使用者的最大傳輸速率, 單位是“位元組/秒”;
local_max_rate: 本地使用者的最大傳輸速率, 單位是“位元組/秒”;
8、虛擬使用者(基於mysql實現)
一、安裝所需要程式
1 2 3 4 5 |
1、安裝mysql和pam_mysql
# yum -y install vsftpd mysql-server mysql-devel pam_mysql
注意:pam_mysql由epel源提供。
|
二、建立虛擬使用者賬號
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
1.準備資料庫及相關表
首先請確保mysql服務已經正常啟動。而後,按需要建立儲存虛擬使用者的資料庫即可,
這裡將其建立為vsftpd資料庫。
mysql> create database vsftpd;
mysql> grant select on vsftpd.* to vsftpd@ '%' identified by 'vsftpd' ;
mysql> flush privileges;
mysql> use vsftpd;
mysql> create table users (
-> id int AUTO_INCREMENT NOT NULL,
-> name char(20) binary NOT NULL,
-> password char(48) binary NOT NULL,
-> primary key( id )
-> );
2、新增測試的虛擬使用者
根據需要新增所需要的使用者,需要說明的是,這裡將其密碼為了安全起見應該使用PASSWORD
函式加密後儲存。
mysql> insert into users (name,password) values( 'tom' ,password( 'tom' ));
mysql> insert into users (name,password) values( 'jerry' ,password( 'tom' ));
|
三、配置vsftpd
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
1.建立pam認證所需檔案
#vi /etc/pam.d/vsftpd.mysql
新增如下兩行
auth required /lib/security/pam_mysql .so user=vsftpd passwd =www.magedu.com host=localhost
db=vsftpd table= users usercolumn=name passwdcolumn=password crypt=2
account required /lib/security/pam_mysql .so user=vsftpd passwd =www.magedu.com host=localh
ost db=vsftpd table= users usercolumn=name passwdcolumn=password crypt=2
注意:由於mysql的安裝方式不同,pam_mysql.so基於unix sock連線mysql伺服器時可能會出問題,
此時,建議授權一個可遠端連線的mysql並訪問vsftpd資料庫的使用者。
2.修改vsftpd的配置檔案,使其適應mysql認證
建立虛擬使用者對映的系統使用者及對應的目錄
# useradd -s /sbin/nologin -d /var/ftproot vuser
# chmod go+rx /var/ftproot
請確保 /etc/vsftpd .conf中已經啟用了以下選項
anonymous_enable=YES
local_enable=YES
write_enable=YES
anon_upload_enable=NO
anon_mkdir_write_enable=NO
chroot_local_user=YES
而後新增以下選項
guest_enable=YES
guest_username=vuser
並確保pam_service_name選項的值如下所示
pam_service_name=vsftpd.mysql
|
四、啟動vsftpd服務
1 2 |
# service vsftpd start
# chkconfig vsftpd on
|
五、配置虛擬使用者具有不同的訪問許可權
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
vsftpd可以在配置檔案目錄中為每個使用者提供單獨的配置檔案以定義其 ftp 服務訪問許可權,
每個虛擬使用者的配置檔名同虛擬使用者的使用者名稱。配置檔案目錄可以是任意未使用目錄,
只需要在vsftpd.conf指定其路徑及名稱即可。
1、配置vsftpd為虛擬使用者使用配置檔案目錄
# vim vsftpd.conf
新增如下選項
user_config_dir= /etc/vsftpd/vusers_config
2、建立所需要目錄,併為虛擬使用者提供配置檔案
# mkdir /etc/vsftpd/vusers_config/
# cd /etc/vsftpd/vusers_config/
# touch tom jerry
3、配置虛擬使用者的訪問許可權
虛擬使用者對vsftpd服務的訪問許可權是通過匿名使用者的相關指令進行的。比如,如果需要讓tom用
戶具有上傳檔案的許可權,可以修改 /etc/vsftpd/vusers_config/tom 檔案,在裡面新增如下選項即可。
anon_upload_enable={YES|NO}
anon_mkdir_write_enable={YES|NO}
anon_other_write_enable={YES|NO}
|
二、NFS協議
1、NFS的幾個概念
RPC(Remote Procedure Call Protocol遠端過程呼叫協議):
簡單的說是函式呼叫(遠端主機上的函式) 一部分功能由本地程式完成 另一部分功能由遠端主機上的函式完成。客戶端掛載了nfs伺服器的檔案系統時,進行一些操作,但是這些操作服務端如何知道呢??這可是在核心級別上實現協議。RPC就解決了這個問題,它會將客戶端的操作的函式呼叫傳送到伺服器端,由伺服器端執行這些函式呼叫。
idmapd:
想想這種情形,nfs客戶端在掛載檔案系統以後,在本地以某使用者的身份建立了一個檔案,在伺服器端這個檔案的屬主和屬組是哪個使用者呢?早期是通過NIS(Network Information Services網路資訊服務)來解決這個問題的,但是在傳輸賬號和密碼時,使用的是明文傳輸,現在使用LDAP+clbbler來實現的。但是,NFS使用的是idmapd這個服務,有rpc提供,將所有的使用者後對映為nfsnobody,但是在訪問的時候,還是以本地UID對應的本地使用者來使用的。
mounted:
NFS是通過什麼來控制那些客戶端可以訪問,那些不可以訪問的呢?NFS只支援通過IP來控制客戶端,而這個功能是由守護程序mounted來實現的,它監聽的埠是半隨機的。所謂的半隨機指的是,這個隨機埠是由rpc服務來決定的,而rpc是通過隨機的方式。作用等等同於小區大門保安的作用。
2、NFS請求過程
在CentOS6.5中,NFS服務端監聽在tcp和udp的2049埠,服務名是nfs、pc監聽於tcp和udp的111號埠,服務名是portmapper。
請求過程:當客戶端試這去掛載使用nfs共享的檔案系統是,客戶端首先回去與postmapper(tcp/111)埠去註冊使用,此時postmapper會隨機分配一個埠給mounted,然後mounted這個守護程序會來驗證客戶端的合法性,驗證通過後,會把請求交給nfs服務,客戶端此時可以掛載使用了,使用者在建立檔案時,會使用到idmapd的守護程序來對映屬主。其實idmapd也是有rpc服務提供的,只不過在這裡,nfs服務使用到使用者對映的功能時,會自動的去呼叫此守護程序。
3、服務的配置
在服務端,只需要安裝nfs-utils就可以直接使用,nfs服務直接是核心的模組。
1 2 3 4 5 6 7 |
# smod | grep nfs
nfsd 309196 13
lockd 73662 1 nfsd
nfs_acl 2647 1 nfsd
auth_rpcgss 44949 1 nfsd
sunrpc 262768 17 nfsd,lockd,nfs_acl,auth_rpcgss
exportfs 4236 1 nfsd
|
服務端共享的目錄是通過 /etc/exports這個檔案共享出去的。這個檔案的書寫格式如下:
共享目錄 客戶端(選項1,選項2) 客戶端(選項1,選項2) … 示例:
/mydata 172.16.0.0/16(ro,async,no_root_squash) www.example.com(ro)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
########################客戶端的表示方式##########################
主機IP地址:例如 192.168.1.10
網路地址:例如 172.16.0.0 /24
域名錶示:例如 www.example.com(指定主機),*.example.com(對應域名下的所有主機)
*:表示所有的主機
##############################常見的選項###############################
有幾個常用的選項可以對 NFS 實現進行定製。這些選項包括:
secure: 這個選項是預設選項,它使用了 1024 以下的 TCP /IP 埠實現 NFS 的連線。
指定 insecure 可以禁用這個選項。
rw: 這個選項允許 NFS 客戶機進行讀/寫訪問。預設選項是隻讀的。
async: 非同步儲存(所有的客戶端操作先在記憶體中快取,等待cpu空閒的時候寫入磁碟)。
這個選項可以改進效能,但是如果沒有完全關閉 NFS 守護程序就重新啟動了 NFS 伺服器,
這也可能會造成資料丟失。與之相反的是syns,是同步寫入磁碟。
no_wdelay: 這個選項關閉寫延時。如果設定了 async,那麼 NFS 就會忽略這個選項。
nohide: 如果將一個目錄掛載到另外一個目錄之上,那麼原來的目錄通常就被隱藏起來
或看起來像空的一樣。要禁用這種行為,需啟用 hide 選項。
no_subtree_check: 這個選項關閉子樹檢查,子樹檢查會執行一些不想忽略的安全性檢查。
預設選項是啟用子樹檢查。
no_auth_nlm: 這個選項也可以作為 insecure_locks 指定,它告訴 NFS 守護程序不要對加
鎖請求進行認證。如果關心安全性問題,就要避免使用這個選項。預設選項是 auth_nlm 或
secure_locks。
mp (mountpoint=path): 通過顯式地宣告這個選項,NFS 要求掛載所匯出的目錄。
fsid=num: 這個選項通常都在 NFS 故障恢復的情況中使用。如果希望實現 NFS 的故障恢復,
請參考 NFS 文件。
#####################使用者對映的選項############################
root_squash: 這個選項不允許 root 使用者訪問掛載上來的 NFS 卷。
no_root_squash: 這個選項允許 root 使用者訪問掛載上來的 NFS 卷。
all_squash: 這個選項對於公共訪問的 NFS 捲來說非常有用,它會限制所有的 UID 和 GID,
只使用匿名使用者。預設設定是 no_all_squash。
anonuid 和 anongid: 這兩個選項將匿名 UID 和 GID 修改成特定使用者和組帳號。
|
4、常用命令
showmount是用來檢視nfs服務的情況
用法:showmount [ -adehv ] [ --all ] [ --directories ] [ --exports ] [ --help ] [ --version ] [ host ]
可以使用短選型,也可以使用長選項。
-a :這個引數是一般在NFS SERVER上使用,是用來顯示已經mount上本機nfs目錄的cline機器。
-e :顯示指定的NFS SERVER上export出來的目錄。
exportfs:一般用在當NFS服務啟動後,使用此命令來控制共享目錄的匯出
用法:exportfs [-aruv]
-a :全部mount或者unmount /etc/exports中的內容
-r :重新mount /etc/exports中分享出來的目錄
-u :umount目錄
-v :在export的時候,將詳細的資訊輸出到螢幕上。
具體例子:
# exportfs -au 解除安裝所有共享目錄
# exportfs -rv 重新共享所有目錄並輸出詳細資訊
5、客戶端的使用
先使用 showmont -e SER_NAME 來發現服務端的共享的目錄
然後使用mount掛載使用,格式:
mount -t nfs SER_NAME:/data /parth/to/someponit [-o 選項]
mount -t nfs 192.168.1.99:/mydat /mnt -o rsize=4096
rsize 的值是從伺服器讀取的位元組數。wsize 是寫入到伺服器的位元組數。預設都是1024, 如果使用比較高的值,如8192,可以提高傳輸速度。
三、samba服務(基本介紹)
1、協議
smb: Service Message Block
CIFS: Common Internet File System通用網路檔案系統,是windows主機之間共享的協議,samba實現了這個協議,所以可以實現wondows與linux之間的檔案共享服務。
監聽的埠有:
tcp/137 udp/137 tcp/139 udp/139
137:是實現NetBIOS協議,實現解析windows之間主機名的解析,實現在windows的網路上的芳鄰可以看到Linux的主機名。
139:是實現cifs協議
2、如何訪問?
在Linux中:
互動式資料訪問:
1 |
smbclient -L HOST -U USERNAME
|
獲取到共享資訊之後,
1 |
smbclint //SERVER/shared_name -U USERNAME
|
基於掛載的方式訪問:
1 |
mount -t cifs //SERVER/shared_name /mount_point -o username=USERNAME,password=PASSWORD
|
3、如何配置samba伺服器(Linux)
# yum -y install samba
服務指令碼:
/etc/rc.d/init.d/nmb # 實現 NetBIOS協議
/etc/rc.d/init.d/smb # 實現cifs協議
主配置檔案:
/etc/samba/smb.conf
samba使用者:
賬號:都是系統使用者, /etc/passwd
密碼:samba服務自有密碼檔案,
將系統使用者新增為samba的命令:smbpasswd
smbpasswd:
-a Sys_User: 新增系統使用者為samba使用者
-d :禁用使用者
-e: 啟用使用者
-x: 刪除使用者
配置檔案:
/etc/samba/smb.conf 配置檔案包括全域性設定,特定共享的設定,私有家目錄,印表機共享,自定義共享
全域性配置:
1 2 3 |
workgroup = MYGROUP # 工作組
hosts allow = 127. 192.168.12. 192.168.13. # 訪問控制,IP控制
interfaces = lo eth0 192.168.12.2 /24 192.168.13.2 /24 # 介面+ip控制
|
自定義共享:
1 2 3 4 5 6 |
[shared_name] #共享名稱
path = /path/to/share_directory #共享路徑
comment = Comment String # 註釋資訊
guest ok = { yes |no} | public = { yes |no} # 是否啟用來賓賬號
writable = { yes |no} | read only = { yes |no} # 共享目錄是否可寫
write list = +GROUP_NAME # 允許可寫的使用者列表,前面有+是代表允許可寫的組
|
測試配置檔案是否有語法錯誤,以及顯示最終生效的配置:
1 |
testparm
|
至此,三種常見的檔案服務介紹完成。