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月更新。官方站點:
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配置介紹
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