Linux文件共享服務 FTP,NFS 和 Samba

Linux 系統中,存儲設主要有下面幾種:node

DASmysql

DAS 指 Direct Attached Storage,即直連附加存儲,這種設備直接鏈接到計算機主板總線上,計算機將其識別爲一個塊設備,例如常見的硬盤,U 盤等,這種設備很難作到共享。ios

NASsql

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 vsftpd@127.0.0.1 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 命令查看語法使用有錯誤。

相關文章
相關標籤/搜索