Linux 系統中,存儲設主要有下麵幾種: DAS DAS 指 Direct Attached Storage,即直連附加存儲,這種設備直接連接到電腦主板匯流排上,電腦將其識別為一個塊設備,例如常見的硬碟,U 盤等,這種設備很難做到共用。 NAS NAS 指 Network Area Storag ...
Linux 系統中,存儲設主要有下麵幾種:
DAS
DAS 指 Direct Attached Storage,即直連附加存儲,這種設備直接連接到電腦主板匯流排上,電腦將其識別為一個塊設備,例如常見的硬碟,U 盤等,這種設備很難做到共用。
NAS
NAS 指 Network Area Storage,它一般是將本地的存儲空間共用給其他主機使用,一般通過 C/S 架構實現通信。它實現的是文件級別的共用,電腦通常將共用的設別識別為一個文件系統,其文件伺服器會管理鎖以實現併發訪問。常見的 NAS 有 NFS 和 CIFS。
SAN SAN 指 Storage Area Network,它將傳輸網路模擬成 SCSI 匯流排來使用,每一個主機的網卡相當於 SCSI 匯流排中的 initiator,伺服器相當於一個或多個 target,它需要藉助客戶端和服務端的 SCSI 驅動,通過 FC 或 TCP/IP 協議封裝 SCSI 報文。它實現的是塊級別的共用,通常被識別為一個塊設備,但是需要藉助專門的鎖管理軟體才能實現多主機併發訪問。
FTP
FTP 是一個文件傳輸的協議,客戶端需要使用專門的 ftp 客戶端與伺服器端進行通信,以完成文件的上傳和下載,FTP 協議工作在應用層。它使用兩個連接與客戶端通信:
- 命令連接:用於傳輸文件管理類命令,此連接在客戶端連接後會始終線上
- 數據連接:用於傳輸文件數據,此連接會按序創建
FTP 伺服器會監聽 TCP 21 號埠用於命令連接,而數據連接有兩種模式:
- 主動模式,伺服器使用 TCP 20 號埠主動創建連接到客戶端的某隨機埠
- 被動模式,客戶端使用隨機埠連接伺服器端的隨機埠
Linux 中常用的 FTP 客戶端軟體有 lftp, ftp, lftpget, wget, curl 等。Windows 中可以使用瀏覽器,資源管理器或 Filezilla 等軟體。
FTP 協議中使用了類似於 HTTP 協議的響應碼:
- 1xx:提示信息
- 2xx:成功類狀態碼
- 3xx:提示需進一步提供補充類信息的狀態碼
- 4xx:客戶端錯誤
- 5xx:服務端錯誤
下麵介紹 vsftpd 這款服務端軟體的使用,FTP 在用戶認證時,會使用系統中的用戶進行身份認證,同時 FTP 支持虛擬用戶,虛擬用戶最終也需要映射為系統中的某個用戶,匿名用戶會被映射為系統中的 ftp 用戶。
配置文件
vsftpd 使用了 pam 模塊進行用戶身份認證,配置文件為 /etc/pam.d/vsftpd
vsftpd 的主配置文件為/etc/vsftpd/vsftpd.conf
用戶訪問 FTP 時,預設訪問的位置是用戶自己的家目錄。ftp 用戶的家目錄為 /var/ftp/
,因此使用匿名用戶將預設訪問 /var/ftp
目錄。
匿名用戶的配置
vsftpd.conf
中,關於匿名用戶的配置有
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 # 是否禁錮系統用戶與其家目錄中
也可以指定用戶將其禁錮於家目錄中:
chroot_list_enable=YES # 啟用 chroot list 文件
chroot_list_file=/etc/vsftpd/chroot_list # chroot list 文件
如果 chroot_local_user
為 NO,那麼 chroot list 文件中的用戶將被禁錮至家目錄中,如果 chroot_local_user
為 YES,那麼表示僅 chroot_list 文件中的用戶不會被禁錮至家目錄中。
日誌
xferlog_enable=YES # 是否啟用傳輸日誌
xferlog_file=/var/log/vsftpd.log # 日誌文件位置
改變上傳文件的屬主
chown_uploads=YES # 是否修改用戶上傳文件的屬主
chown_username=someone # 修改的屬主名稱
連接限制
max_clients= # 伺服器的最大併發連接數
max_per_ip= # 每個 ip 可同時發起的併發請求數
anno_max_rate= # 匿名用戶的最大傳輸速率,單位是 BYTE/s
local_max_rate= # 本地用戶的最大傳輸速率
用戶登錄控制
userlist_enable=YES # 啟用userlist文件
userlist_deny=YES # YES 表示 userlist 為用戶黑名單,NO 表示 userlist 為白名單
userlist_file /etc/vsftpd/user_list # userlist 文件位置
虛擬用戶
FTP 中,所有的虛擬用戶會被統一映射為一個指定的系統帳號,訪問的預設目錄即為此帳號的家目錄。虛擬用戶賬號也以存儲在文件中,也可以存放在關係型資料庫中。
將 FTP 虛擬用戶存放在資料庫中
準備資料庫及相關表
mysql> create database vsftpd;
mysql> grant select on vsftpd.* to vsftpd@localhost identified by 'redhat';
mysql> grant select on vsftpd.* to [email protected] identified by 'redhat';
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)
-> );
添加虛擬用戶
這裡使用 MySQL 的 password() 函數將用戶密碼加密,如果 pam_mysql 的password() 函數與 MySQL 的 password() 函數不同,也可以將密碼明文存放。
mysql> insert into users(name,password) values('foo',PASSWORD('redhat'));
mysql> insert into users(name,password) values('bar',PASSWORD('redhat'));
安裝 pam_mysql
包,建立 pam 認證所需文件,編輯 /etc/pam.d/vsftpd.mysql
auth required /lib64/security/pam_mysql.so user=vsftpd passwd=www.magedu.com host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
account required /lib64/security/pam_mysql.so user=vsftpd passwd=www.magedu.com host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
修改 vsftpd 配置文件,使其使用 mysql 認證
pam_service_name=vsftpd.mysql
anonymous_enable=YES
write_enable=YES
anon_upload_enable=NO
anon_mkdir_write_enable=NO
chroot_local_user=YES
guest_enable=YES
guest_username=vuser
建立虛擬用戶映射的系統用戶
# useradd -s /sbin/nologin -d /var/ftproot vuser
# chmod go+rx /var/ftproot
啟用 vsftpd 服務 # service vsftpd start
現在,就可以使用資料庫中的 foo 和 bar 用戶登錄 FTP 了。
NFS
NFS 全稱是 Network FileSystem,NFS 和其他文件系統一樣,是在 Linux 內核中實現的,因此 NFS 很難做到與 Windows 相容。NFS 共用出的文件系統會被客戶端識別為一個文件系統,客戶端可以直接掛載並使用。
NFS 的實現使用了 RPC(Remote Procedure Call)的機制,遠程過程調用使得客戶端可以調用服務端的函數。由於有 VFS 的存在,客戶端可以像使用其他普通文件系統一樣使用 NFS 文件系統,由操作系統內核將 NFS 文件系統的調用請求通過 TCP/IP 發送至服務端的 NFS 服務,執行相關的操作,之後服務端再講操作結果返回客戶端。
NFS 文件系統僅支持基於 IP 的用戶訪問控制,NFS 是在內核實現的,因此 NFS 服務由內核監聽在 TCP 和 UDP 的 2049 埠,對於 NFS 服務的支持需要在內核編譯時選擇。它同時還使用了幾個用戶空間進程用於訪問控制,用戶映射等服務,這些程式由 nfs-utils
程式包提供。
RPC 服務在 CentOS 6.5 之後改名為 portmapper,它監聽在 TCP/UDP 的 111 埠,其他基於 RPC 的服務進程需要監聽時,先像 RPC 服務註冊,RPC 服務為其分配一個隨機埠供其使用。客戶端在請求時,先向 RPC 服務請求對應服務監聽的埠,然後再向改服務發出調用請求。
查看 RPC 服務列表:
[root@node2 ~]# rpcinfo -p
program vers proto port service
00 4 tcp 111 portmapper
00 3 tcp 111 portmapper
00 2 tcp 111 portmapper
00 4 udp 111 portmapper
00 3 udp 111 portmapper
00 2 udp 111 portmapper
24 1 udp 54525 status
24 1 tcp 36141 status
啟用 NFS 服務,只需要編輯 /etc/exports
文件,文件格式如下
directory (or file system) client1(option1, option2) client2(option1, option2)
例如,共用 /shared/nfs
目錄給 10.0.0.0/8 網段的客戶端,且具有讀寫許可權:
/shared/nfs 10.0.0.0/8(rw)
之後啟動 nfs 服務即可
# service nfs start
在括弧中的共用選項中,下麵的選項可以實現對 NFS 進行定製:
secure: 這個選項是預設選項,它使用了 1024 以下的 TCP/IP 埠實現 NFS 的連接。指定 insecure 可以禁用這個選項。
rw: 這個選項允許 NFS 客戶機進行讀/寫訪問。預設選項是只讀的。
async: 這個選項可以改進性能,但是如果沒有完全關閉 NFS 守護進程就重新啟動了 NFS 伺服器,這也可能會造成數據丟失。
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 文檔。
在使用 NFS 掛載的文件系統上的文件時,用戶的訪問通常都會受到限制,這就是說用戶都是以匿名用戶的身份來對文件進行訪問的,這些用戶預設情況下對這些文件只有隻讀許可權。如果用戶希望以 root 用戶或鎖定義的其他用戶身份訪問遠程文件系統上的文件,NFS 允許指定訪問遠程文件的用戶——通過用戶標識號(UID)和組標識號(GID)進行用戶映射。
用戶映射的選項:
root_squash: 這個選項不允許 root 用戶訪問掛載上來的 NFS 捲。
no_root_squash: 這個選項允許 root 用戶訪問掛載上來的 NFS 捲。
all_squash: 這個選項對於公共訪問的 NFS 捲來說非常有用,它會限制所有的 UID 和 GID,只使用匿名用戶。預設設置是 no_all_squash。
anonuid 和 anongid: 這兩個選項將匿名 UID 和 GID 修改成特定用戶和組帳號。
客戶端掛載 NFS 文件系統的方式
# mount -t nfs 10.10.0.2:/shared/nfs /mnt
還可以使用 showmount
命令查看主機上共用的 NFS 文件系統列表
# showmount -e IP_ADDR
其中 IP_ADDR 為 NFS 伺服器地址。
如果伺服器端修改了 NFS 的配置,而又不想重啟 NFS 服務(因為有客戶端正在使用)可以使用 exportfs
命令重新載入 NFS 配置。
export -ar: 重新導出所有的文件系統
export -au: 關閉導出的所有文件系統
export -u FS: 關閉指定的導出的文件系統
Samba
NFS 只能在 Unix 系統間進行共用,而 Windows 對其支持很有限。因此有人就在 Linux/Unix 系統中實現了 Windows 文件共用所使用的 CIFS 協議,也叫做 SMB(Simple Message Block)協議。這使得 Windows/Linux/Unix 間可以自由的進行文件共用。
samba 主要監聽在這幾個埠:137/udp, 138/udp, 139/tcp, 445/tcp
在 Windows 中共用的文件系統,可以在 Linux 中使用 samba 客戶端訪問,或者直接掛載訪問。
查看某主機共用的文件系統:
# smbclient -L HOST -U USERNAME
獲取到信息後,使用 smbclient
進行訪問
# smbclient //SERVER/shared_name -U USERNAME
基於掛載的方式訪問:
# mount -t cifs //SERVER/shared_name /mount_point -o username=USERNAME, password=PASSWORD
在 Linux 中構建 samba 伺服器,需要安裝 samba
軟體包,它共有兩個服務,其中 smb
提供數據訪問, nmb
提供 NetBIOS 的實現。
samba 的主板配置文件為: /etc/samba/smb.conf
samba 服務中的用戶都必須是系統中存在的用戶,使用時需要將這些用戶加入到 samba 中來,使用 smbpasswd
命令:
smbpasswd:
-a Sys_User: 添加系統用戶為samba用戶
-d :禁用
-e: 啟用
-x: 刪除
配置文件
smb.conf
中包含了許多全局設定,Windows 域設定等內容。
全局配置
workgroup = MYGROUP # 工作組名稱
server string = Samba Server Version %v # 描述信息,%v表示版本
netbios name = MYSERVER # NetBIOS中的名稱
interfaces = lo eth0 192.168.12.2/24 # 監聽的介面和地址
hosts allow = 127. 192.168.12. 192.168.13 # 訪問控制白名單
日誌選項
log file = /var/log/samba/log.%m # 日誌文件,%m表示客戶端主機名稱或ip
max log size = 50 # 日誌文件最大大小,單位
常用共用選項
[shared_name]
path = # 文件系統路徑
browseable = {yes|no} # 是否可以被查看到
public = {yes|no} # 是否可被所有人讀
guest ok = {yes|no} # 與 public 相同
read only = yes # 是否只讀
writeable = yes # 是否可寫
write list = user1, user2 # 可寫用戶列表
@group, +group # 可寫組列表
valid users = # 白名單
invalid users = # 黑名單
配置完成後可以使用 testparm
命令查看語法使用有錯誤。