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是一个计算机通信协议,该协议允许运行于一台计算机的程序调用另一个地址空间的子进程,而程序员就像调用本地程序一样,无需额外地为这个交互作用编程(无需关注细节)。

NFS

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='rsyncuser@10.0.0.3::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/ rsyncuser@10.0.0.3::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
posted @ 2021-07-30 16:35  bestvae  阅读(286)  评论(1编辑  收藏  举报