1. 程式人生 > 其它 >21.網路檔案共享服務

21.網路檔案共享服務

1 FTP服務

1.1 FTP工作原理

伺服器會開放兩個埠分別用於傳送命令和傳輸資料

從伺服器角度分為下面兩種模式:

  • 主動模式:即伺服器主動連線客戶端

    ​ 命令通道:21/tcp埠

    ​ 資料通道:20/TCP

  • 被動模式:客戶端主動連線

    ​ 命令通道:21/tcp埠

    ​ 資料通道:隨機port

FTP服務狀態碼:

1XX:資訊 		  125:資料連線開啟
2XX:成功類狀態 	200:命令OK     230:登入成功
3XX:補充類       331:使用者名稱OK
4XX:客戶端錯誤 	425:不能開啟資料連線
5XX:伺服器錯誤 	530:不能登入

1.2 常見的FTP軟體

服務端軟體

vsftpd:Very Secure FTP Daemon,CentOS 預設FTP伺服器,最新版本是vsftpd-3.0.4,在2021年5月更新。官方站點:

https://security.appspot.com/vsftpd.html

Filezilla:服務端只支援Windows,官方站點https://filezilla-project.org/index.php

客戶端軟體

ftp,lftp,lftpget,wget,curl等

1.3 vsftpd

vsftpd支援很多的配置選項,其配置檔案位於/etc/vsftpd/vsftpd.conf,使用man 5 vsftpd.conf可以檢視支援的配置選項,也可以訪問官方網站:https://security.appspot.com/vsftpd/vsftpd_conf.html。

使用者和其共享目錄

  • 匿名使用者(對映為系統使用者ftp )共享檔案位置:/var/ftp
  • 系統使用者共享檔案位置:使用者家目錄
  • 虛擬使用者共享檔案位置:為其對映的系統使用者的家目錄
[root@centos8 ~]# vim /etc/vsftpd/vsftpd.conf
listen_port=2121 		#命令通道監聽埠,預設值為21

匿名使用者相關配置
anonymous_enable=YES 				#支援匿名使用者,CentOS8 預設不允許匿名
no_anon_password=YES 				#匿名使用者略過口令檢查 , 預設NO
anon_upload_enable=YES 				#匿名上傳,注意:檔案系統許可權
anon_mkdir_write_enable=YES 		#匿名建目錄
anon_world_readable_only=NO 		#只能下載全部讀的檔案, 預設YES
anon_umask=0333 						#指定匿名上傳檔案的umask,預設077,注意:0333中的0不能省略
anon_other_write_enable=YES 		#可刪除和修改上傳的檔案, ,預設NO
chown_uploads=YES        			#指定匿名使用者上傳檔案預設的所有者和許可權,預設NO
chown_username=wang					
chown_upload_mode=0644			

系統使用者相關配置
local_enable=YES 						#是否允許linux使用者登入
write_enable=YES 						#允許linux使用者上傳檔案
local_umask=022 						#指定系統使用者上傳檔案的預設許可權對應umask
guest_enable=YES 						#所有系統使用者都對映成guest使用者
guest_username=ftp   				#配合上面選項才生效,指定guest使用者
local_root=/ftproot 					#指定guest使用者登入所在目錄,但不影響匿名使用者的登入目錄
chroot_local_user=YES 				#禁錮系統使用者,預設NO,即不禁錮
chroot_list_enable=YES     		#預設是NO
chroot_list_file=/etc/vsftpd/chroot_list   #預設值
當chroot_local_user=YES和chroot_list_enable=YES時,則chroot_list中使用者不禁錮,即白名單
當chroot_local_user=NO和chroot_list_enable=YES時, 則chroot_list中使用者禁錮,即黑名單

日誌相關配置
#wu-ftp 日誌:預設啟用
xferlog_enable=YES 					#啟用記錄上傳下載日誌,此為預設值
xferlog_std_format=YES 				#使用wu-ftp日誌格式,此為預設值
xferlog_file=/var/log/xferlog 	#可自動生成, 此為預設值
#vsftpd日誌:預設不啟用
dual_log_enable=YES 					#使用vsftpd日誌格式,預設不啟用
vsftpd_log_file=/var/log/vsftpd.log 	#可自動生成, 此為預設值

使用者的登入控制
userlist_enable=YES   				#此為預設值
userlist_deny=YES(預設值) 			 #黑名單,不提示口令,NO為白名單
userlist_file=/etc/vsftpd/user_list  #此為預設值

vsftpd 虛擬使用者

所有虛擬使用者會統一對映為一個指定的系統帳號:訪問共享位置,即為此係統帳號的家目錄。

範例:實現基於檔案驗證的vsftpd虛擬使用者

建立虛擬使用者資料
[root@centos8 vsftpd]# cat /etc/vsftpd/vuser.txt 
ftpuser
123321
ftpuser2
123321
ftpuser3
123321
#生成資料庫
[root@centos8 vsftpd]# db_load -T -t hash -f vuser.txt vuser.db
#設定訪問許可權
[root@centos8 ~]#chmod 600 /etc/vsftpd/vusers.*

建立對映的系統使用者
[root@centos8 ~]#useradd -d /data/ftproot -s /sbin/nologin -r vuser
[root@centos8 ~]#mkdir -pv /data/ftproot/upload
[root@centos8 ~]#setfacl -m u:vuser:rwx /data/ftproot/upload

配置pam檔案
[root@centos8 ~]#cat /etc/pam.d/vsftpd.db
auth required pam_userdb.so db=/etc/vsftpd/vuser
account required pam_userdb.so db=/etc/vsftpd/vuser

修改vsftpd配置檔案
[root@centos8 ~]#vim /etc/vsftpd/vsftpd.conf
guest_enable=YES				#啟用虛擬使用者
guest_username=vuser			#指定虛擬使用者對映的系統使用者
pam_service_name=vsftpd.db	#pam配置檔案
user_config_dir=/etc/vsftpd/conf.d/	#指定各個使用者配置檔案存放的路徑

針對ftpuser使用者進行配置
[root@centos8 vsftpd]# cat conf.d/ftpuser 
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
local_root=/data/awk/

注意:/etc/pam.d/vsftpd配置會影響到ftp使用者登入

[root@centos8 vsftpd]# cat /etc/pam.d/vsftpd
#%PAM-1.0
session    optional     pam_keyinit.so    force revoke
auth       required	pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
auth       required	pam_shells.so		#僅允許使用者的shell為 /etc/shells型別才能登入
auth       include	password-auth
account    include	password-auth
session    required     pam_loginuid.so
session    include	password-auth

上實驗中將使用者預設shell指定為/sbin/nologin,而/etc/shells預設無此型別,服務和使用者都正常情況登入出現530情況,之後將/sbin/nologin新增至/etc/shells中,可以正常登入

2 NFS服務

2.1 NFS服務概述

NFS:Network File System 網路檔案系統,基於核心的檔案系統。Sun 公司開發,通過使用 NFS,用 戶和程式可以像訪問本地檔案一樣訪問遠端系統上的檔案,基於RPC(Remote Procedure Call Protocol 遠端過程呼叫)實現。

RPC是一個計算機通訊協議,該協議允許運行於一臺計算機的程式呼叫另一個地址空間的子程序,而程式設計師就像呼叫本地程式一樣,無需額外地為這個互動作用程式設計(無需關注細節)。

2.2 NFS配置介紹

紅帽文件地址:https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/managing_file_systems/exporting-nfs-shares_managing-file-systems#introduction-to-nfs_exporting-nfs-shares

2.3 實戰案例

2.3.1 實現主機上/var/www目錄的共享

實驗環境準備

10.0.0.2 服務端
10.0.0.3 客戶端

步驟

10.0.0.2 服務端配置
#安裝軟體包
[root@centos8 vsftpd]# yum -y install nfs-utils

#準備共享目錄
[root@centos8 vsftpd]# ll /var/www/
total 0
drwxr-xr-x. 2 root root  6 Nov  4  2020 cgi-bin
drwxr-xr-x. 4 root root 30 Apr 30 02:58 html

#編輯配置檔案,將/var/www/共享給所有主機,給予讀寫許可權
[root@centos8 vsftpd]# cat /etc/exports
/var/www *(rw)

#在不重啟服務情況使配置檔案生效
[root@centos8 vsftpd]# exportfs -r

10.0.0.3 客戶端實現autofs
#安裝軟體包
[root@centos8 vsftpd]# yum -y install autofs

#檢查本機掛載目錄是否存在,以確保不會覆蓋已存在目錄
[root@centos8 vsftpd]# ll /var/www
ls: cannot access '/var/www': No such file or directory

#相對路徑配置掛載目錄
[root@centos8 vsftpd]# vim /etc/auto.master
/opt /etc/auto.opt
[root@centos8 www]# cat /etc/auto.opt 
www    -fstype=nfs  10.0.0.2:/var/www/

#重啟autofs服務
[root@centos8 /]# systemctl restart autofs

#進入目錄檢視掛載檔案
[root@centos8 /]# cd /opt/www/
注意這裡直接進入/opt目錄是不能看見www資料夾的,需要先進入www資料夾才會自動掛載上

3 samba服務

3.1 服務簡介

Samba軟體和NFS服務軟體主要功能都是以掛載方式實現檔案的共享,不過Samba更加適用於Windows和Linux主機間的檔案共享,而一般Linux主機間的檔案共享NFS服務更為常用。

Samba軟體具有很多功能,這裡主要介紹共享檔案服務

官方文件:https://wiki.samba.org/index.php/Samba_File_Serving

3.2 SAMBA軟體介紹

相關包:

  • samba 提供smb伺服器端
  • samba-client 客戶端軟體
  • samba-common 通用軟體
  • cifs-utils smb客戶端工具
  • samba-winbind 和AD相關

相關服務程序:

  • smbd 提供smb(cifs)服務 TCP:139,445

配置檔案:

  • /etc/samba/smb.conf 幫助參看:man smb.conf

客戶端工具:

  • smbclient,mount.cifs

3.3 實戰案例

實現不同samba使用者訪問不同的目錄

#在伺服器上安裝samba包
[root@centos8 ~]# yum -y install samba

#建立登入使用者samba1、samba2、samba3並指定密碼為passwd
[root@centos8 ~]# useradd -M -s /sbin/nologin smb1
[root@centos8 ~]# useradd -M -s /sbin/nologin smb2
[root@centos8 ~]# useradd -M -s /sbin/nologin smb3
[root@centos8 ~]# echo 'passwd' | passwd --stdin smb1
Changing password for user smb1.
passwd: all authentication tokens updated successfully.
[root@centos8 ~]# echo 'passwd' | passwd --stdin smb2
Changing password for user smb2.
passwd: all authentication tokens updated successfully.
[root@centos8 ~]# echo 'passwd' | passwd --stdin smb3
Changing password for user smb3.
passwd: all authentication tokens updated successfully.

#將使用者新增到samba資料庫
[root@centos8 ~]# smbpasswd -a smb2
New SMB password:
Retype new SMB password:
Added user smb2.
[root@centos8 ~]# smbpasswd -a smb1
New SMB password:
Retype new SMB password:
Added user smb1.
[root@centos8 ~]# smbpasswd -a smb3
New SMB password:
Retype new SMB password:
Added user smb3.

#修改主配置檔案
[root@centos8 ~]# vim /etc/samba/smb.conf
config file= /etc/samba/conf.d/%U
[share]
	Path=/data/dir
	Read only= NO
	Guest ok = NO

#新增使用者配置檔案
[root@centos8 dir1]# cat /etc/samba/conf.d/smb1 
[share]
Path=/data/dir1
Read only= NO 
Create mask=0644
[root@centos8 dir1]# cat /etc/samba/conf.d/smb2
[share]
path=/data/dir2

#建立資料夾
[root@centos8 samba]# mkdir /data/{dir,dir1,dir2}

#使用客戶端測試訪問
[root@centos8 ~]# smbclient //10.0.0.2/share -U smb1%passwd
Try "help" to get a list of possible commands.
smb: \> 

注意:如果要通過Windows訪問需開啟samba服務,不過samba服務不建議在Windows中開啟,因為Windows1.1samba存在已知漏洞,有安全風險。

4 資料實時同步

4.1 實時同步介紹

在生產環境中,有時會需要將兩臺主機的特定目錄實現實時同步。比如,將NFS共享目錄的資料檔案自動同步到備份伺服器特定目錄中。

實現實時同步的兩種方法

  • inotify + rsync 方式實現資料同步
  • sersync :前金山公司周洋(花椒直播)在 inotify 軟體基礎上進行開發的,功能更加強大,不過有一定時間未更新

實現方式:

  • 使用inotify服務監控檔案發生的變化
  • 利用rsync服務推送到備份伺服器

實現inotify軟體:

  • inotify-tools
  • sersync
  • lrsyncd

4.2 inotify+rsync+shell 指令碼實現實時資料同步

實驗環境

10.0.0.2 資料伺服器
10.0.0.3 備份伺服器

具體執行步驟

10.0.0.2
#安裝inotify-tools
[root@centos8 ~]# yum -y install inotify-tools
[root@centos8 ~]# yum -y install rsync
[root@centos8 ~]# cat inotify_rsync.sh 
#!/bin/bash
SRC='/data/www/'  
DEST='[email protected]::backup'
rpm -q rsync &> /dev/null || yum -y install rsync

inotifywait  -mrq  --exclude=".*\.swp" --timefmt "%Y-%m-%d %H:%M:%S" --format '%T %w %f' -e create,delete,moved_to,close_write,attrib ${SRC} |while read DATE TIME DIR FILE;do
        FILEPATH=${DIR}${FILE}
	       rsync -az --delete  --password-file=/etc/rsync.pas $SRC $DEST && echo
	       "At ${TIME} on ${DATE}, file $FILEPATH was backuped up via rsync" >> /var/log/changelist.log
       done
[root@centos8 ~]# echo "123321" > /etc/rsync.pas
[root@centos8 ~]# mkdir /data/www
[root@centos8 ~]# chmod 600 /etc/rsync.pas

#測試能否正常訪問
[root@centos8 ~]# rsync -avz --delete --password-file=/etc/rsync.pas /data/www/ [email protected]::backup
sending incremental file list

sent 113 bytes  received 12 bytes  250.00 bytes/sec
total size is 0  speedup is 0.00
[root@centos8 ~]# bash inotify_rsync.sh

10.0.0.3
#安裝服務包
[root@centos8 ~]# dnf install rsync-daemon
[root@centos8 ~]# vim /etc/rsyncd.conf
uid = root
gid = root
#use chroot = no
max connections = 0
ignore errors
exclude = lost+found/
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsyncd.lock
reverse lookup = no
#hosts allow = 10.0.0.0/24
[backup]  
path = /data/backup/  
comment = backup dir		#描述
read only = no     
auth users = rsyncuser  #指定rsyncuser使用者才能訪問
secrets file = /etc/rsync.pas	#指定使用者名稱密碼存放位置
[root@centos8 ~]# mkdir /data/backup
[root@centos8 ~]# echo "rsyncuser:123321" > /etc/rsync.pas
[root@centos8 ~]# chmod 600 /etc/rsync.pas