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 |
至此,三種常見的文件服務介紹完成。
本文出自 “逆水寒” 博客,請務必保留此出處http://guoting.blog.51cto.com/8886857/1541299