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

来源:https://www.cnblogs.com/MessiXiaoMo3334/archive/2019/08/25/11407118.html
-Advertisement-
Play Games

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/vsftpdvsftpd 的主配置文件為/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命令查看語法使用有錯誤。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 今天遇到一個這樣的問題,假設父進程有一個變數S,fork後,子進程中的變數S地址是否和父進程中的變數S 是相同的? 再學操作系統的時候,知道fork是採用的寫時複製,所以如果子進程或者父進程不對變數S做修改的話,它們應該 是指向同一塊物理記憶體,如果有修改,那麼它們會指向不同的物理記憶體,但虛擬記憶體地址 ...
  • CentOS下安裝軟體,要看下載的軟體安裝包的尾碼名是什麼,一般為了方便安裝,推薦下載以 rpm 結尾的軟體包。 比如以下截圖,有多種下載方式,推薦下載圈起來的鏈接。 rpm包安裝方式步驟: 找到相應的軟體包,比如soft.version.rpm,下載到本機某個目錄; cd soft.version ...
  • RAID 可以大幅度的提高磁碟性能,以及可靠性,這麼好的技術怎麼能不掌握呢!此篇介紹一些常見 RAID ,及其在 Linux 上的軟 RAID 創建方法。 ...
  • 本篇概述 Linux xshell6 連接 Hadoop 啟動關閉 Linux xshell6 連接相關問題 首先,虛擬機 得先能通成網(具體教程可百度) 然後,進行 本機 ip 的查詢(xshell6 連接 關鍵)==> ip addr 最後,進行 xshell6 的連接 然後 連接 即可 Had ...
  • 雙11備戰前夕,總繞不過性能壓測環節,TPS 一直上不去 / 不達標,除了代碼上的問題外,伺服器環境、配置、網路、磁碟、CPU 亦是導致性能瓶頸的重要一環,本文旨在分享最近項目性能壓測過程中的排查經驗,文中的表單你可以作為排查手冊保存,如有不對之處,還請在評論區分享、交流你的經驗和觀點:) 通過本文 ...
  • crtmpserver簡介 我們在第一章的時候已經簡要說明瞭crtmpserver,crtmpserver是一個由C++語言編寫的開源的RTMP流媒體伺服器,與其對應的商業產品自然是Adobe公司的FMS。與FMS相比,從功能上來說crtmpserver只能稱為FMS的簡化版本,其功能並沒有FMS那 ...
  • 在某處學習到瞭如何配置i3wm後,對其極感興趣。 學習到的經驗總結: Linux中的各種命令操作其實都要首先查閱 man command 或者 command -h 或者 command --help 這類的幫助命令。 i3寫好配置文件config後,執行 配置即刻生效。更多配置方法建議參考 htt ...
  • 本文包含作者工作中常用到的一些命令,用於診斷網路、磁碟占滿、fd泄漏等問題。命令包括ping、fping、tcpdump、lsof、netstat、/proc/$pid/fd、du、grep、traceroute、dig。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...