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配置介绍
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