Linux: 网络文件共享服务
- TAGS: Linux
网络文件共享服务
- 存储类型
- FTP服务
- NFS服务
- SAMBA服务
- 网络数据同步
存储类型
存储类型分为三种
- 直连式存储:Direct-Attached Storage,简称DAS
- 网络附加存储:Network-Attached Storage,简称NAS
- 存储区域网络:Storage Area Network,简称SAN
DAS存储
DAS存储是最常见的一种存储方式,尤其是在中小企业应用中。PC中的硬盘或只 有一个外部SCSI接口的JBOD都属于DAS架构。DAS是指存储设备直接连接到服务器 总线上,存储设备只与一台独立的主机连接,其他主机不能使用这个存储设备。 DAS存储设备与服务器主机之间的连接通道通常采用SCSI连接,DAS存储设备主要 是磁盘阵列(RAID: Redundant Arrays of Independent Disks)、磁盘簇 (JBOD:Just a Bunch Of Disks)等。
NAS存储
NAS存储就是存储设备通过标准的网络拓扑结构(比如以太网)添加到一群计算机 上。与DAS以及SAN不同,NAS是文件级的存储方法。采用NAS较多的功能是用来进 行文件共享。
NAS存储也通常被称为附加存储,顾名思义,就是存储设备通过标准的网络拓扑 结构(例如以太网)添加到一群计算机上。NAS是文件级的存储方法,它的重点在 于帮助工作组和部门级机构解决迅速增加存储容量的需求。如今更多的亲们采用 NAS较多的功能是用来文档共享、图片共享、电影共享等等,而且随着云计算的 发展,一些NAS厂商也推出了云存储功能,大大方便了企业和亲们等个人用户的 使用。
NAS产品是真正即插即用的产品。NAS设备一般支持多计算机平台,用户通过网络 支持协议可进入相同的文档,因而NAS设备无需改造即可用于混合Unix/Windows NT局域网内,同时NAS的应用非常灵活。
但NAS有一个关键性问题,即备份过程中的带宽消耗。与将备份数据流从LAN中转 移出去的存储区域网(SAN)不同,NAS仍使用网络进行备份和恢复。NAS的一个 缺点是它将存储事务由并行SCSI连接转移到了网络上。这就是说LAN除了必须处 理正常的最终用户传输流外,还必须处理包括备份操作的存储磁盘请求。
SAN存储
存储区域网络,这个是通过光纤通道或以太网交换机连接存储阵列和服务器主机, 最后成为一个专用的存储网络。SAN经过十多年历史的发展,已经相当成熟,成 为业界的事实标准(但各个厂商的光纤交换技术不完全相同,其服务器和SAN存 储有兼容性的要求)。
SAN提供了一种与现有LAN连接的简易方法,并且通过同一物理通道支持广泛使用 的SCSI和IP协议。SAN不受现今主流的、基于SCSI存储结构的布局限制。特别重 要的是,随着存储容量的爆炸性增长,SAN允许企业独立地增加它们的存储容量。 SAN的结构允许任何服务器连接到任何存储阵列,这样不管数据置放在那里,服 务器都可直接存取所需的数据。因为采用了光纤接口,SAN还具有更高的带宽。
如今的SAN解决方案通常会采取以下两种形式:光纤信道以及iSCSI或者基于IP的 SAN,也就是FC SAN和IP SAN。光纤信道是SAN解决方案中大家最熟悉的类型,但 是,最近一段时间以来,基于iSCSI的SAN解决方案开始大量出现在市场上,与光 纤通道技术相比较而言,这种技术具有良好的性能,而且价格低廉。
SAN的优势:
随着存储容量的增长,SAN允许企业独立地增加他们的存储容量。
SAN允许任何服务器连接到任何存储阵列(好处是:不管数据放在哪里,服务器都可以直接存取所需的数据)
由于使用光纤接口,SAN具有更高的带宽。除了FC连接,SAN连接还有ISCSI(SCSI over IP)以及SAS(Serial Attached SCSI)接口。
光纤接口可以提供10公里那么长那么远的连接长度,非常容易实现物理分离的存储
三种存储比较
SAN与NAS的主要区别体现在文件系统所在的位置
DAS | NAS | SAN | |
---|---|---|---|
传输类型 | SCSI、FC | IP | IP、FC、SAC |
数据类型 | 数据块 | 文件 | 数据块 |
典型应用 | 任何 | 文件服务器 | 数据库应用 |
优点 | 磁盘与服务器分离 | ||
便于统一管理 | 不占用应用服务器资源 | ||
广泛支持操作系统 | |||
扩展较容易 | |||
即插即用,安装简单方便 | 高扩展性 | ||
高可用性 | |||
数据集中,易管理 | |||
缺点 | 连接距离短 | ||
数据分散,共享困难 | |||
存储空间利用率不高 | |||
扩展性有限 | 不适合存储量大的块级应用 | ||
数据备份及恢复占用网络带宽 | 相比NAS成本较高 | ||
安装和升级比NAS复杂 |
三种存储架构的应用场景
- DAS虽然比较古老了,但是还是很适用于那些数据量不大,对磁盘访问速度要求较高的中小企业
- NAS多适用于文件服务器,用来存储非结构化数据,虽然受限于以太网的速度,但是部署灵活,成本低
- SAN则适用于大型应用或数据库系统,缺点是成本高、较为复杂
文件传输协议 FTP
FTP工作原理介绍
文件传输协议:File Transfer Protocol早期的三个应用级协议之一,基于C/S结构
数据传输格式:二进制(默认)和文本
双通道协议:命令和数据连接
两种模式 :从服务器角度
主动 (PORT style):服务器主动连接
命令(控制):客户端:随机port —> 服务器:21/tcp
数据:客户端:随机port <—服务器:20/tcp
被动 (PASV style):客户端主动连接
命令(控制):客户端:随机port —> 服务器:21/tcp
数据:客户端:随机port —> 服务器:随机port /tcp
范例:服务器被动模式数据端口
227 Entering Passive Mode (172,16,0,1,224,59) 服务器数据端口为:224*256+59
FTP服务状态码 :
1XX:信息 125:数据连接打开 2XX:成功类状态 200:命令OK;226数据传输完毕; 230:登录成功 3XX:补充类 331:用户名OK 4XX:客户端错误 425:不能打开数据连接; 426数据连接被关闭,传输被中断;452 错误文件 5XX:服务器错误 530:不能登录
用户认证 :
匿名用户:ftp,anonymous,对应Linux用户ftp 系统用户:Linux用户,用户/etc/passwd,密码/etc/shadow 虚拟用户:特定服务的专用用户,独立的用户/密码文件
常见 FTP 相关软件
FTP服务器端软件
#linux端: vsftpd:Very Secure FTP Daemon 安全性高 Proftpd :功能丰富 wu-ftpd:最早的FTP程序,强大,但非模块化 pureftpd Filezilla Serv-U Wing FTP Server IIS #windows端: Serv-U Filezilla: IIS
vsftpd:Very Secure FTP Daemon安全性高,CentOS 默认FTP服务器
高速,稳定,下载速度是WU-FTP的两倍
ftp.redhat.com数据:单机最多可支持15000个并发
vsftpd官网: https://security.appspot.com/vsftpd.html
Filezilla官网: https://filezilla-project.org/index.php
客户端软件:
CLI:
- ftp,lftp,lftpget,wget,curl
ftp -A ftpserver port -A 主动模式 --p 被动模式 lftp --u username ftpserver lftp username@ftpserver lftpget ftp://ftpserver/pub/file
GUI:
- gftp:GUI centos5 最新版2.0.19(11/30/2008),官网:https://www.gftp.org/
- filezilla,FTP Rush,CuteFtp,FlashFXP,LeapFtp
- IE ftp://username:password@ftpserver
vsftpd 软件介绍
由 vsftpd 包提供,不再由xinetd管理
用户认证配置文件:/etc/pam.d/vsftpd
启动服务相关文件 :
/usr/lib/systemd/system/vsftpd.service
/etc/rc.d/init.d/vsftpd
配置文件 :
/etc/vsftpd/vsftpd.conf
帮助:man 5 vsftpd.conf
配置文件格式:
option=value
注意:= 前后不要有空格
用户和其共享目录
- 匿名用户(映射为系统用户ftp )共享文件位置:/var/ftp
- 系统用户共享文件位置:用户家目录
- 虚拟用户共享文件位置:为其映射的系统用户的家目录
vsftpd服务常见配置
命令端口
listen_port=2121 默认值为21
范例:
[root@centos6 ~]#lftp 10.0.0.8 -p 2121 [root@centos6 ~]#ftp 10.0.0.8 2121
主动模式端口
主动或者被动都是以服务器的角度
connect_from_port_20=YES 主动模式端口为20 ftp_data_port=20 (默认) 指定主动模式的端口
被动模式端口范围
linux ftp 客户端默认使用被动模式 windows ftp 客户端默认使用主动模式 pasv_min_port=6000 0为随机分配,端口范围会影响客户端的并发数 pasv_max_port=6010
使用当地时间
use_localtime=YES 使用当地时间(默认为NO,使用GMT)
匿名用户登录
anonymous_enable=YES 支持匿名用户,CentOS8 默认不允许匿名 no_anon_password=YES 匿名用户略过口令检查 , 默认NO
匿名用户上传
anon_upload_enable=YES 匿名上传,注意:文件系统权限 anon_mkdir_write_enable=YES 匿名建目录 setfacl -m u:ftp:rwx /var/ftp/pub
注意:还需要开启文件系统访问的权限,不能给FTP根目录写权限,只能级子目录写权限,否则报如下错误
[root@centos6 ~]#ftp 10.0.0.8 Connected to 10.0.0.8 (10.0.0.8). 220 (vsFTPd 3.0.3) Name (10.0.0.8:root): ftp 331 Please specify the password. Password: 500 OOPS: vsftpd: refusing to run with writable root inside chroot() Login failed. 421 Service not available, remote server has closed connection
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
Linux系统用户
local_enable=YES 是否允许linux用户登录 write_enable=YES 允许linux用户上传文件 local_umask=022 指定系统用户上传文件的默认权限对应umask
将系统用户映射为指定的guest用户
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 可自动生成, 此为默认值
提示信息
登录提示信息
方法一: ftpd_banner="welcome to mage ftp server" 方法二: banner_file=/etc/vsftpd/ftpbanner.txt #优先级更高
目录访问提示信息
dirmessage_enable=YES 此为默认值 message_file=.message 信息存放在指定目录下.message ,此为默认值,只支持单行说明
范例:
[root@centos8 ~]#cd /var/ftp [root@centos8 ftp]#mkdir upload [root@centos8 ftp]#cd pub/ [root@centos8 pub]#ls [root@centos8 pub]#mkdir tools [root@centos8 pub]#echo tools software > tools/.message [root@centos8 pub]#cd .. [root@centos8 ftp]#ls pub upload [root@centos8 ftp]#echo upload file > upload/.message [root@Centos7 ~]#ftp 10.0.0.8 Connected to 10.0.0.8 (10.0.0.8). 220 (vsFTPd 3.0.3) Name (10.0.0.8:root): ftp #匿名登陆,事先改好了配置文件 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> pwd 257 "/" is the current directory ftp> ls 227 Entering Passive Mode (10,0,0,8,222,100). 150 Here comes the directory listing. drwxr-xr-x 3 0 0 19 Jul 04 07:06 pub drwxr-xr-x 2 0 0 22 Jul 04 07:07 upload 226 Directory send OK. ftp> cd upload 250-upload file #目录提示信息 250 Directory successfully changed. ftp> cd ../pub/tools 250-tools software #目录提示信息 250 Directory successfully changed.
范例:目录提示信息加颜色
[root@centos8 ~]#vim /var/ftp/pub/tools/.message ^[[32mtools software^[[0m
或者
PAM模块实现用户访问控制
pam_service_name=vsftpd
pam配置文件:/etc/pam.d/vsftpd
/etc/vsftpd/ftpusers 默认文件中用户拒绝登录,默认是黑名单,但也可以是白名单
范例:
[root@centos8 ~]#ldd /usr/sbin/vsftpd |grep pam libpam.so.0 => /lib64/libpam.so.0 (0x00007fb286c34000) #修改PAM配置,使ftpusers成为白名单 [root@centos8 ~]#vim /etc/pam.d/vsftpd #%PAM-1.0 session optional pam_keyinit.so force revoke #将sense=deny 修改为 sense=allow auth required pam_listfile.so item=user sense=allow file=/etc/vsftpd/ftpusers onerr=succeed auth required pam_shells.so auth include password-auth account include password-auth session required pam_loginuid.so session include password-auth
范例:
pam_listfile模块相当于黑名单(或者白名单,取决于sense=deny/allow) [root@centos8 ~]#cat /etc/vsftpd/ftpusers #修改了之后不需要重启服务 # Users that are not allowed to login via ftp root bin daemon adm lp sync shutdown halt mail news uucp operator games nobody
是否启用控制用户登录的列表文件
userlist_enable=YES 此为默认值 userlist_deny=YES(默认值) 黑名单,不提示口令,NO为白名单 userlist_file=/etc/vsftpd/user_list 此为默认值
范例:
[root@centos8 ~]#cat /etc/vsftpd/user_list # vsftpd userlist # If userlist_deny=NO, only allow users in this file # If userlist_deny=YES (default), never allow users in this file, and # do not even prompt for a password. # Note that the default vsftpd pam config also checks /etc/vsftpd/ftpusers # for users that are denied. root bin daemon adm lp sync shutdown halt mail news uucp operator games nobody
vsftpd服务指定用户身份运行
nopriv_user=nobody 此为默认值
范例:
[root@centos8 ~]#pstree -p |grep vsftpd `-vsftpd(2122)-+-vsftpd(2546)---vsftpd(2548) `-vsftpd(2552)---vsftpd(2554) [root@centos8 ~]#ps auxf |grep vsftpd root 2574 0.0 0.0 12108 964 pts/2 S+ 16:01 0:00 \_ grep --color=auto vsftpd root 2122 0.0 0.0 26984 408 ? Ss 15:08 0:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf nobody 2546 0.0 0.2 61656 4072 ? Ss 15:57 0:00 \_ /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf mage 2548 0.0 0.2 74236 3796 ? S 15:57 0:00 | \_ /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf nobody 2552 0.0 0.2 61656 4136 ? Ss 15:58 0:00 \_ /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf cui 2554 0.0 0.2 74236 3792 ? S 15:58 0:00 \_ /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
连接数限制
max_clients=0 #最大并发连接数
如果超出连接,会报如下提示
max_per_ip=0 #每个IP同时发起的最大连接数
如果超出连接,会报如下提示
传输速率,单位:字节/秒
anon_max_rate=0 匿名用户的最大传输速率,以字节为单位,比如:1024000表示1MB/s local_max_rate=0 本地用户的最大传输速率
连接时间:秒为单位
connect_timeout=60 主动模式数据连接超时时长 accept_timeout=60 被动模式数据连接超时时长 data_connection_timeout=300 数据连接无数据输超时时长 idle_session_timeout=60 无命令操作超时时长
优先以文本方式传输
ascii_upload_enable=YES ascii_download_enable=YES
说明:*不建议使用文本方式,因为可能导致二进制文件内容被破坏*
范例:
[root@Centos7 ~]#ftp 10.0.0.8 Connected to 10.0.0.8 (10.0.0.8). 220 (vsFTPd 3.0.3) Name (10.0.0.8:root): ftp #匿名登陆,事先改好了配置文件 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. #默认是二进制方式传输
实现基于 SSL 的 FTPS
查看是否支持SSL
ldd `which vsftpd` #查看到libssl.so
范例:
[root@centos8 ~]#ldd `which vsftpd`|grep libssl
libssl.so.1.1 => /lib64/libssl.so.1.1 (0x00007f8878e2c000)
创建自签名证书
#CentOS 7 上可以实现直接生成一个包括私钥和证书的文件 [root@centos7 ~]#mkdir /etc/vsftpd/ssl [root@centos7 ~]#cd /etc/pki/tls/certs/ [root@centos7 certs]#make /etc/vsftpd/ssl/vsftpd.pem [root@centos7 certs]#openssl x509 -in /etc/vsftpd/ssl/vsftpd.pem -noout -text #在CentOS8上手动分别生成一个证书和私钥文件,再合并成一个文件 [root@centos8 ~]#mkdir /etc/vsftpd/ssl [root@centos8 ~]#cd /etc/vsftpd/ssl [root@centos8 ssl]#openssl req -x509 -nodes -keyout vsftpd.key -out vsftpd.crt -days 365 -newkey rsa:2048 [root@centos8 ssl]#cat vsftpd.crt vsftpd.key > vsftpd.pem
配置vsftpd服务支持SSL:
[root@centos8 ~]#vim /etc/vsftpd/vsftpd.conf ssl_enable=YES #启用SSL allow_anon_ssl=NO #匿名不支持SSL force_local_logins_ssl=YES #本地用户登录加密 force_local_data_ssl=YES #本地用户数据传输加密 rsa_cert_file=/etc/pki/tls/certs/vsftpd.pem #一个包括证书和私钥两个内容的文件 #rsa_private_key_file /path/file #此项如果没有指定,私钥也在证书文件中 #ssl_tlsv1=YES #ssl_sslv2=NO #ssl_sslv3=NO #require_ssl_reuse=NO #ssl_ciphers=HIGH [root@centos8 ~]#systemctl restart vsftpd [root@Centos7 ~]#ftp 10.0.0.8 Connected to 10.0.0.8 (10.0.0.8). 220 (vsFTPd 3.0.3) Name (10.0.0.8:root): mage 530 Non-anonymous sessions must use encryption. Login failed. 421 Service not available, remote server has closed connection ftp> #用filezilla等工具测试
vsftpd 虚拟用户
虚拟用户:给特定服务使用的用户帐号
- 所有虚拟用户会统一映射为一个指定的系统帐号:访问共享位置,即为此系统帐号的家目录
- 各虚拟用户可被赋予不同的访问权限,通过匿名用户的权限控制参数进行指定
虚拟用户帐号的存储方式:
文件:创建文本文件,奇数行为用户名,偶数行为密码,再被编码为hash 格式Berkeley DB database文件
db_load -T -t hash -f vusers.txt vusers.db
关系型数据库中的表中:实时查询数据库完成用户认证
vsftpd 支持mysql库:pam要依赖于pam-mysql/lib64/security/pam_mysql.so /usr/share/doc/pam_mysql-0.7/README
实现基于文件验证的vsftpd虚拟用户
2.5.1.1 创建用户数据库文件
[root@centos8 ~]#rpm -qf `which db_load`
libdb-utils-5.3.28-37.el8.x86_64
[root@centos8 ~]#vim /etc/vsftpd/vusers.txt
ftp_wang
wangpass
ftp_mage
magepass
[root@centos8 ~]#db_load -T -t hash -f /etc/vsftpd/vusers.txt /etc/vsftpd/vusers.db
[root@centos8 ~]#chmod 600 /etc/vsftpd/vusers.*
2.5.1.2 创建用户和访问FTP目录
[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 #chmod a=rx /data/ftproot/ 如果自动创建家目录,需修改权限
2.5.1.3 创建pam配置文件
[root@centos8 ~]#vim /etc/pam.d/vsftpd.db auth required pam_userdb.so db=/etc/vsftpd/vusers account required pam_userdb.so db=/etc/vsftpd/vusers
2.5.1.4 指定pam配置文件
[root@centos8 ~]#vim /etc/vsftpd/vsftpd.conf guest_enable=YES guest_username=vuser #系统用户映射为指定用户 pam_service_name=vsftpd.db
2.5.1.5 虚拟用户建立独立的配置文件
#指定各个用户配置文件存放的路径 [root@centos8 ~]#vim /etc/vsftpd/vsftpd.conf user_config_dir=/etc/vsftpd/conf.d/ #创建各个用户配置文件存放的路径 [root@centos8 ~]#mkdir /etc/vsftpd/conf.d/ #创建各用户自已的配置文件,允许wang用户可读写,其它用户只读 [root@centos8 ~]#vim /etc/vsftpd/vusers.d/ftp_wang anon_upload_enable=YES anon_mkdir_write_enable=YES anon_other_write_enable=YES #创建各用户自已的配置文件 [root@centos8 ~]#vim /etc/vsftpd/conf.d/ftp_mage #登录目录改变至指定的目录 local_root=/data/ftproot2
范例:
[root@web13 ~]# grep -Ev '(^$|^#)' /etc/vsftpd/vsftpd.conf anonymous_enable=NO #是否允许匿名用户登录,由于我们这里采用用户 验证,所以设置为 NO local_enable=YES #设定为 YES 时,在 /etc/passwd 内的账号才能以 实体用户的方式登入我们的 vsftpd 主机 write_enable=YES #是否允许使用者具有写入的权限,包括删除与修 改等功能 local_umask=022 dirmessage_enable=YES xferlog_enable=YES #开启日志 connect_from_port_20=YES xferlog_file=/var/log/vsftpd.log #日志位置 chroot_list_enable=YES chroot_list_file=/etc/vsftpd/chroot_list listen=YES #若设定为 YES 表示 vsftpd 是以 standalone 的 方式来启动的 pam_service_name=vsftpd userlist_enable=YES tcp_wrappers=YES max_clients=1000 max_per_ip=4 guest_enable=YES #这个值设定为 YES 时,那么任何非 anonymous 登入的账号,均会被假设成为 guest(本例中就是我们下面设置的 virtual)用户身份 guest_username=virtual #设置 guest 对应的实体用户 pam_service_name=vsftpd user_config_dir=/etc/vsftpd_user_conf #定义用户设定文件所在的目录,优先级高于主配 置文件 pasv_min_port=30000 #指定使用被动模式连接时的端口范围 pasv_max_port=30999 virtual_use_local_privs=NO #当设置为 NO 虚拟用户和匿名用户有相同的权 限,否则则有本地用户(virtual)相同的权限,默认为NO anon_upload_enable=NO #不允许虚拟用户上传,如果是普通虚拟用户可设置不能上传 ###其它参考 [root@web13 vsftpd]# cat /etc/vsftpd_user_conf/xiaowei local_root=/vsftp_data/xiaowei anon_world_readable_only=no #当启用时,每个用户只能下载自己上传的文件 (使download用户的能下载,也只能下载;写成YES,将不能列出文件和目录) write_enable=yes anon_upload_enable=yes #允许虚拟用户上传 anon_other_write_enable=yes #是否允许删除、重命名,默认为NO anon_mkdir_write_enable=YES #是否允许建立目录,默认为NO #某公司 gr[root@PIC-hd-1582 ~]# grep -iv "^#" /etc/vsftpd/vsftpd.conf anonymous_enable=NO local_enable=YES write_enable=YES local_umask=022 dirmessage_enable=YES xferlog_enable=YES connect_from_port_20=YES xferlog_file=/var/log/vsftpd.log chroot_local_user=YES chroot_list_file=/etc/vsftpd/chroot_list listen=YES allow_writeable_chroot=YES pam_service_name=vsftpd userlist_enable=YES tcp_wrappers=YES max_clients=1000 max_per_ip=1000 guest_enable=YES guest_username=virtual pam_service_name=vsftpd.mysql user_config_dir=/etc/vsftpd_user_conf [root@PIC-hd-1582 ~]# cat /etc/vsftpd_user_conf/cyj003 local_root=/alidata/Company/ED/cyj003 anon_world_readable_only=NO anon_umask=022 write_enable=YES anon_upload_enable=YES anon_other_write_enable=YES anon_mkdir_write_enable=YES You have new mail in /var/spool/mail/root [root@PIC-hd-1582 ED]# cat /alidata/Company/ED/adduser #!/bin/bash [ $# -lt 1 ] && { echo -e "Error:usage $0 $@ \033[31;4;1m please exec: $0 username \033[0m" exit 1 } cat > /etc/vsftpd_user_conf/$1 <<EOF local_root=/alidata/Company/ED/$1 anon_world_readable_only=NO anon_umask=022 write_enable=YES anon_upload_enable=YES anon_other_write_enable=YES anon_mkdir_write_enable=YES EOF mkdir /alidata/Company/ED/$1 chown -R virtual.virtual /alidata/Company/ED/$1 [root@PIC-hd-1582 ~]# cat /etc/pam.d/vsftpd.mysql auth required pam_mysql.so user=vzysql passwd=3flreaem37 host=10.146.85.147 db=vzy2014 table=admin_user usercolumn=account passwdcolumn=password crypt=0 account required pam_mysql.so user=vzysql passwd=3flreaem37 host=10.146.85.147 db=vzy2014 table=admin_user usercolumn=account passwdcolumn=password crypt=0
实现基于MYSQL验证的vsftpd虚拟用户
利用 pam_mysql 模块可以实现基于MySQL的FTP虚拟用户功能
项目网站:https://sourceforge.net/projects/pam-mysql/
因此项目年代久远不再更新,只支持CentOS 6,7,不支持CentOS 8
环境准备
本实验在两台主机上实现 一台做为FTP服务器,CentOS 7 一台做MySQL 数据库服务器
2.5.2.1 在数据库服务器上安装mysql数据库
#注意:MySQL8.0由于取消了PASSWORD()函数,不支持 [root@centos8 ~]#yum -y install mariadb-server [root@centos8 ~]#systemctl enable --now mariadb.service MariaDB [(none)]> select password("centos"); +-------------------------------------------+ | password("centos") | +-------------------------------------------+ | *128977E278358FF80A246B5046F51043A2B1FCED | +-------------------------------------------+ 1 row in set (0.000 sec)
2.5.2.2 在数据库服务上配置数据库支持vsftpd服务
#建立存储虚拟用户数据库和表 [root@centos8 ~]#mysql MariaDB [(none)]> create database vsftpd; MariaDB [(none)]> use vsftpd; MariaDB [vsftpd]> CREATE TABLE users ( id INT AUTO_INCREMENT NOT NULL PRIMARY KEY, name CHAR(50) BINARY NOT NULL, password CHAR(48) BINARY NOT NULL ); #添加虚拟用户,为了安全应该使用PASSWORD函数加密其密码后存储 MariaDB [vsftpd]> INSERT INTO users(name,password) values('ftp_wang',password('magedu')); MariaDB [vsftpd]> INSERT INTO users(name,password) values('ftp_mage',password('magedu')); #创建连接的数据库用户 MariaDB [vsftpd]> GRANT SELECT ON vsftpd.* TO vsftpd@'10.0.0.%' IDENTIFIED BY 'magedu'; MariaDB [vsftpd]> FLUSH PRIVILEGES;
2.5.2.3 在FTP服务器上安装vsftpd 和 pam_mysql包
[root@centos7 ~]#yum install vsftpd
2.5.2.4 在FTP服务器上安装 pam_mysql
对于 centos 6:pam_mysql由EPEL的源中提供
[root@centos6 ~]#yum install pam_mysql
对于 centos7 和 8:无对应rpm包,需手动编译安装
pam-mysql源码进行编译
#安装相关包 [root@centos7 ~]#yum -y install vsftpd gcc gcc-c++ make mariadb-devel pam-devel #下载pam-mysql源码进行编译 [root@centos7 ~]#wget http://prdownloads.sourceforge.net/pam-mysql/pam_mysql-0.7RC1.tar.gz #https://github.com/NigelCunningham/pam-MySQL/archive/v0.8.1.tar.gz [root@centos7 ~]#tar xvf pam_mysql-0.7RC1.tar.gz [root@centos7 ~]#cd pam_mysql-0.7RC1/ [root@centos7 pam_mysql-0.7RC1]#./configure --with-pam-mods-dir=/lib64/security #如果上面命令不指定 --with-pam-mods-dir=/lib64/security 会报以下错误 #checking if the second argument of pam_conv.conv() takes const pointer... no configure: error: Your system doesn't appear to be configured to use PAM. Perhaps you need to specify the correct location where the PAM modules reside. [root@centos7 pam_mysql-0.7RC1]#make install [root@centos7 pam_mysql-0.7RC1]#ll /lib64/security/pam_mysql* -rwxr-xr-x 1 root root 882 Dec 17 14:34 /lib64/security/pam_mysql.la -rwxr-xr-x 1 root root 141712 Dec 17 14:34 /lib64/security/pam_mysql.so
2.5.2.5 在FTP服务器上建立pam认证所需文件
[root@centos7 ~]#vi /etc/pam.d/vsftpd.mysql #添加如下两行 auth required pam_mysql.so user=vsftpd passwd=magedu host=mysqlserver db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2 account required pam_mysql.so user=vsftpd passwd=magedu host=mysqlserver db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
注意:以上参考 README文档
*crypt 加密方式*:
- 0表示不加密
- 1表示crypt(3)加密
- 2表示使用mysql password()函数加密
- 3表示md5加密
- 4表示sha1加密
配置字段说明
- auth 表示认证
- account 验证账号密码正常使用
- required 表示认证要通过
- pam_mysql.so模块是默认的相对路径,是相对/lib64/security/路径而言,也可以写绝对路径;后面为给此模块传递的参数
- user=vsftpd为登录mysql的用户
- passwd=magedu 登录mysql的的密码
- host=mysqlserver mysql服务器的主机名或ip地址
- db=vsftpd 指定连接msyql的数据库名称
- table=users 指定连接数据库中的表名
- usercolumn=name 当做用户名的字段
- passwdcolumn=password 当做用户名字段的密码
- crypt=2 密码的加密方式为mysql password()函数加密
2.5.2.6 建立相应用户和修改vsftpd配置文件
#建立虚拟用户映射的系统用户及对应的目录 [root@centos7 ~]#useradd -s /sbin/nologin -d /data/ftproot -r vuser #centos7 需除去ftp根目录的写权限 [root@centos7 ~]#mkdir -pv /data/ftproot/upload [root@centos7 ~]#setfacl -m u:vuser:rwx /data/ftproot/upload #确保/etc/vsftpd/vsftpd.conf中已经启用了以下选项 [root@centos7 ~]#vim /etc/vsftpd/vsftpd.conf anonymous_enable=YES #添加下面两项 guest_enable=YES guest_username=vuser #修改下面一项,原系统用户无法登录 pam_service_name=vsftpd.mysql 启动vsftpd服务 [root@centos7 ~]#systemctl enable --now vsftpd
2.5.2.7 在FTP服务器上配置虚拟用户具有不同的访问权限
vsftpd可以在配置文件目录中为每个用户提供单独的配置文件以定义其ftp服务访问权限,每个虚拟用户的配置文件名同虚拟用户的用户名。配置文件目录可以是任意未使用目录,只需要在vsftpd.conf指定其路径及名称即可
#配置vsftpd为虚拟用户使用配置文件目录 [root@centos7 ~]#vim /etc/vsftpd/vsftpd.conf #添加如下选项 user_config_dir=/etc/vsftpd/conf.d/ #创建所需要目录,并为虚拟用户提供配置文件 [root@centos7 ~]#mkdir /etc/vsftpd/conf.d/ #配置虚拟用户的访问权限 #虚拟用户对vsftpd服务的访问权限是通过匿名用户的相关指令进行的。如要让用户wang具有上传文件的权限,可修改/etc/vsftpd/vusers.d/wang文件,在里面添加如下选项并设置为YES即可,只读则设为NO #注意:需确保对应的映射用户对于文件系统有写权限 [root@centos7 ~]#vim /etc/vsftpd/conf.d/ftp_wang anon_upload_enable={YES|NO} anon_mkdir_write_enable={YES|NO} anon_other_write_enable={YES|NO} #登录目录改变至指定的目录 local_root=/data/ftproot2
NFS服务
NFS工作原理
NFS:Network File System 网络文件系统,基于内核的文件系统。Sun公司开发, 通过使用NFS,用户和程序可以像访问本地文件一样访问远端系统上的文件,基 于RPC(Remote Procedure Call Protocol 远程过程调用)实现
把远程的共享资源挂载到本机使用
RPC采用C/S模式,客户机请求程序调用进程发送一个有进程参数的调用信息到服 务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达 为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息, 然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果, 然后调用执行继续进行
NFS优势:节省本地存储空间,将常用的数据,如:/home目录,存放在NFS服务器 上且可以通过网络访问,本地终端将可减少自身存储空间的使用
NFS软件介绍
软件包:nfs-utils(包括服务器和客户端相关工具,CentOS8最小化安装时默认没有安装)
相关软件包:rpcbind(必须),tcp_wrappers
Kernel支持:nfs.ko
端口:2049(nfsd), 其它端口由portmap(111)分配,端口并不单一
说明:CentOS 6 开始portmap进程由rpcbind代替
NFS服务主要进程:
- rpc.nfsd 最主要的NFS进程,管理客户端是否可登录
- rpc.mountd 挂载和卸载NFS文件系统,包括权限管理
- rpc.lockd 非必要,管理文件锁,避免同时写出错
- rpc.statd 非必要,检查文件一致性,可修复文件
日志:/var/lib/nfs/
NFS配置文件:
/etc/exports /etc/exports.d/*.exports
NFS共享配置文件格式
/dir 主机1(opt1,opt2) 主机2(opt1,opt2)...
格式说明:
- 以#开始的行为注释
主机格式:
anonymous:表示使用*通配所有客户端 单个主机:ipv4,ipv6,FQDN IP networks:两种掩码格式均支持 172.18.0.0/255.255.0.0 172.18.0.0/16 wildcards:主机名通配,例如:*.ciciedu.com,IP不可以 netgroups:NIS域的主机组,@group_name
每个条目指定目录导出到的哪些主机,及相关的权限和选项
默认选项:(ro,sync,root_squash,no_all_squash) ro,rw 只读和读写 async 异步,数据变化后不立即写磁盘,先写入到缓冲区中,过一段时间再写入磁盘,性能高,安全性低 sync(1.0.0后为默认)同步,数据在请求时立即写入共享存储磁盘,性能低,安全性高 root_squash (默认)远程root映射为nfsnobody,UID为65534,CentOS8 为nobody,CentOS7以前的版本为nfsnobody no_root_squash 远程root映射成NFS服务器的root用户 all_squash 所有远程用户(包括root)都变成nfsnobody,CentOS8 为nobody no_all_squash (默认)保留共享文件的UID和GID anonuid和anongid 指明匿名用户映射为特定用户UID和组GID,而非nobody,可配合all_squash使用
范例:NFS配置示例
vim /etc/exports /myshare server.example.com /myshare *.example.com /myshare server?.example.com /myshare server[0-20].example.com /myshare 172.25.11.10 /myshare 172.25.0.0/16 /myshare 2000:472:18:b51:c32:a21 /myshare 2000:472:18:b51::/64 /myshare *.example.com 172.25.0.0/16 /myshare desktop.example.com(ro) /myshare desktop.example.com(ro) server[0-20].example.com(rw) /myshare diskless.example.com(rw,no_root_squash)
NFS工具
rpcinfo
rpcinfo 工具可以查看RPC相关信息
查看注册在指定主机的RPC程序
rpcinfo -p hostname
查看RPC注册程序
rpcinfo -s hostname
范例:rpcinfo
[root@centos8 ~]#rpcinfo -p program vers proto port service 100000 4 tcp 111 portmapper 100000 3 tcp 111 portmapper 100000 2 tcp 111 portmapper 100000 4 udp 111 portmapper 100000 3 udp 111 portmapper 100000 2 udp 111 portmapper 100024 1 udp 32803 status 100024 1 tcp 56057 status [root@centos8 ~]#rpcinfo -s program version(s) netid(s) service owner 100000 2,3,4 local,udp,tcp,udp6,tcp6 portmapper superuser 100024 1 tcp6,udp6,tcp,udp status 29 #查看远程主机 [root@Centos7 ~]#rpcinfo -p 10.0.0.8 program vers proto port service 100000 4 tcp 111 portmapper 100000 3 tcp 111 portmapper 100000 2 tcp 111 portmapper 100000 4 udp 111 portmapper 100000 3 udp 111 portmapper 100000 2 udp 111 portmapper 100024 1 udp 32803 status 100024 1 tcp 56057 status 100005 1 udp 20048 mountd 100005 1 tcp 20048 mountd 100005 2 udp 20048 mountd 100005 2 tcp 20048 mountd 100005 3 udp 20048 mountd 100005 3 tcp 20048 mountd 100003 3 tcp 2049 nfs 100003 4 tcp 2049 nfs 100227 3 tcp 2049 nfs_acl 100021 1 udp 60596 nlockmgr 100021 3 udp 60596 nlockmgr 100021 4 udp 60596 nlockmgr 100021 1 tcp 44219 nlockmgr 100021 3 tcp 44219 nlockmgr 100021 4 tcp 44219 nlockmgr [root@Centos7 ~]#rpcinfo -s 10.0.0.8 program version(s) netid(s) service owner 100000 2,3,4 local,udp,tcp,udp6,tcp6 portmapper superuser 100024 1 tcp6,udp6,tcp,udp status 29 100005 3,2,1 tcp6,udp6,tcp,udp mountd superuser 100003 4,3 tcp6,tcp nfs superuser 100227 3 tcp6,tcp nfs_acl superuser 100021 4,3,1 tcp6,udp6,tcp,udp nlockmgr superuser
exportfs
exportfs:可用于管理NFS导出的文件系统
常见选项:
-v 查看本机所有NFS共享 -r 重读配置文件,并共享目录 -a 输出本机所有共享 -au 停止本机所有共享
showmount
常见用法:
#查看远程主机的NFS共享 showmount -e hostname
范例:
[root@centos7 ~]#showmount -e 10.0.0.8 Export list for 10.0.0.8: /data/wordpress * #文件夹完整路径看得清清楚楚,不安全,不过NFS本身就是给公司内部用的多,方便管理
mount.nfs
客户端NFS挂载
NFS相关的挂载选项:man 5 nfs
fg (默认)前台挂载 bg 后台挂载 hard (默认)持续请求 soft 非持续请求 intr 和hard配合,请求可中断 rsize 和wsize 一次读和写数据最大字节数,rsize=32768 _netdev 无网络不挂载 vers 指定版本,客户端centos8默认4.2 ,centos7默认4.1 centos6默认4.0
提示:基于安全考虑,建议使用 nosuid,/netdev,noexec 挂载选项/
范例:临时挂载NFS共享
mount -o rw,nosuid,fg,hard,intr 172.16.0.1:/testdir /mnt/nfs/
范例: 临时挂载
[root@centos7 ~]#mkdir /mnt/nfs [root@centos7 ~]#mount 10.0.0.8:/data/wordpress /mnt/nfs [root@centos7 ~]#ls /mnt/nfs index.html [root@centos7 ~]#df -T /mnt/nfs Filesystem Type 1K-blocks Used Available Use% Mounted on 10.0.0.8:/data/wordpress nfs4 52403200 398336 52004864 1% /mnt/nfs
范例:开机挂载
vim /etc/fstab 10.0.0.8:/data/wordpress /mnt/nfs nfs _netdev 0 0 防止没网络不挂载导致机器起不来,加上这一项后,没网络就不挂载,不影响启动
范例: 远程的 root 映射为NFS服务器的nobody用户
[root@centos6 ~]#grep nobody /etc/passwd nobody:x:99:99:Nobody:/:/sbin/nologin nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin [root@centos7 ~]#grep nobody /etc/passwd nobody:x:99:99:Nobody:/:/sbin/nologin nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin [root@centos8 ~]#grep nobody /etc/passwd nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
自动挂载
可使用 autofs 服务按需要挂载外围设备,NFS共享等,并在空闲5分钟后后自动卸载
相关包和文件
软件包:autofs
服务文件:/usr/lib/systemd/system/autofs.service
配置文件:/etc/auto.master
配置文件格式
参看帮助:man 5 autofs
所有导出到网络中的NFS启用特殊匹配 -host 至“browse”
范例:/net目录可以自动挂载NFS共享
cat /etc/auto.master
/net -hosts
cd /net/192.168.8.100/
自动挂载资源有两种格式:
- 相对路径法:将mount point 路径分成 dirname 和 basename 分别配置,可能会影响现有的目录结构
- 绝对路径法:直接匹配全部的绝对路径名称,都写入到指定的配置文件里,不会影响本地目录结构
相对路径法:
/etc/auto.master 格式
挂载点的dirname 指定目录的配置文件路径,如:/etc/test.auto
指定目录的配置文件格式
#/etc/test.auto 挂载点的basename 挂载选项 选项设备
范例:相对路径法
[root@centos8 ~]#vim /etc/auto.master
/misc /etc/auto.misc
[root@centos8 ~]#vim /etc/auto.misc
cd -fstype=iso9660,ro,nosuid,nodev :/dev/cdrom
范例:相对路径法为支持通配符
vim /etc/auto.master /misc /etc/auto.misc vim /etc/auto.misc #表示/misc下面的子目录和nfs共享/export目录的子目录同名 * server:/export/&
绝对路径法
/etc/auto.master 格式
/- 指定配置文件路径
指定配置文件格式
绝对路径 挂载选项 选项设备
范例:绝对路径法
vim /etc/auto.master:
/- /etc/auto.direct
vim /etc/auto.direct:
/foo -fstype=nfs server1:/export/foo
/user/local/ -fstype=nfs,vers=3 server1:/usr/local
/mnt/cdrom -fstype=iso9660 :/dev/cdrom
实战案例
目标
将NFS的共享目录,通过autofs 发布出来,做为远程主机用户的家目录
环境准备
共三台主机 一台主机 nfs server IP:10.0.0.8 另两台当 nfs client IP:10.0.0.7 IP:10.0.0.6
步骤
#NFS服务器创建用户和相应的家目录,将用户wang的家目录共享 [root@centos8 ~]#mkdir -pv /data/home [root@centos8 ~]#useradd -d /data/home/user1 -u 2000 user1 [root@centos8 ~]#vim /etc/exports.d/test.exports /data/home *(rw) [root@centos8 ~]#exportfs -r #在第一台NFS客户端主机10.0.0.7上实现相对路径法的autofs [root@centos7 ~]#useradd -M -u 2000 user1 [root@centos7 ~]#vim /etc/auto.master /home /etc/auto.home [root@centos7 ~]#vim /etc/auto.home * -fstype=nfs,vers=3 10.0.0.8:/data/home/& #&表示前后同名,比如上一个home目录下有zhangsan,那&就代表zhangsan [root@centos7 ~]#systemctl restart autofs [root@centos7 ~]#su - user1 Last login: Fri Jul 3 16:33:34 CST 2020 on pts/0 [user1@centos7 ~]$pwd /home/user1 [user1@centos7 ~]$df /home/user1 -T Filesystem Type 1K-blocks Used Available Use% Mounted on 10.0.0.8:/data/home/user1 nfs4 52403200 398464 52004736 1% /home/user1 #注意:home目录下其它用户家目录无法访问 [root@centos7 ~]#ls /home user1 #在第二台NFS客户端主机10.0.0.6上实现绝对路径法的autofs [root@centos6 ~]#useradd -M -u 2000 user1 [root@centos6 ~]#vim /etc/auto.master /- /etc/auto.home [root@centos6 ~]#vim /etc/auto.home /home/user1 -fstype=nfs,vers=3 nfsserver:/data/home/user1 [root@centos6 ~]#service autofs restart [root@centos6 ~]#su - user1 [user1@centos6 ~]$pwd /home/user1 [user1@centos6 ~]$df -T /home/user1 Filesystem Type 1K-blocks Used Available Use% Mounted on 10.0.0.8:/data/home/user1 nfs 52403200 398464 52004736 1% /home/user1 #home目录下其它用户家目录可以访问 [user1@centos6 ~]$ls /home mage user1 wang
SAMBA服务
SAMBA服务简介
为了解决Linux和Windows不兼容的问题,ftp虽然能够做到,但是不支持挂载
SMB:Server Message Block服务器消息块,IBM发布,最早是DOS网络文件共享 协议,是私有协议
CIFS:common internet file system,微软基于SMB发布
SAMBA:1991年Andrew Tridgell,实现 windows和UNIX相通
SAMBA的功能:
- 共享文件和打印,实现在线编辑
- 实现登录SAMBA用户的身份认证
- 可以进行NetBIOS名称解析
- 外围设备共享
Windows计算机网络管理模式:
- 工作组WORKGROUP:计算机对等关系,帐号信息各自管理
- 域DOMAIN:C/S结构,帐号信息集中管理,DC,AD
SAMBA软件介绍
相关包:
- samba 提供smb服务器端
- samba-client 客户端软件
- samba-common 通用软件
- cifs-utils smb客户端工具
- samba-winbind 和AD相关
相关服务进程:
- smbd 提供smb(cifs)服务 TCP:139,445
- nmbd NetBIOS名称解析 UDP:137,138
主配置文件:/etc/samba/smb.conf 帮助参看:man smb.conf
语法检查: testparm [-v] [/etc/samba/smb.conf]
客户端工具:smbclient,mount.cifs
范例:
dnf install samba systemctl start smb systemctl start nmb
SAMBA客户端工具
UNC路径: Universal Naming Convention,通用命名规范,格式如下
\\sambaserver\sharename
使用smbclient 访问SAMBA服务器
以管理员身份运行
改成$后可以在Windows里隐藏,但是在Linux里不起作用
smbclient -L instructor.example.com smbclient -L instructor.example.com -U smb用户%password #可以使用-U选项来指定用户%密码,或通过设置和导出USER和PASSWD环境变量来指定 smbclient //instructor.example.com/shared -U wang >cd directory >get file1 >put file2
挂载CIFS文件系统
说明:生产环境中可能用的并不多,生产中一般是Windows当客户端,Linux当服务器端
范例:手动挂载
mount -o user=wang,password=magedu //server//shared /mnt/smb
范例:开机自动挂载(此方法需要安装cifs-utils包)
cat /etc/fstab #可以用文件代替用户名和密码的输入 //server/homes /mnt cifs credentials或cred=/etc/smb.txt 0 0 cat /etc/smb.txt username=wang #或 user=wang password=password #或 pass=password #给密码文件加上权限,保证安全 chmod 600 /etc/smb.txt
范例: SMB协议版本
[root@centos8 ~]#man mount.cifs vers=arg SMB protocol version. Allowed values are: · 1.0 - The classic CIFS/SMBv1 protocol. · 2.0 - The SMBv2.002 protocol. This was initially introduced in Windows Vista Service Pack 1, and Windows Server 2008. Note that the initial release version of Windows Vista spoke a slightly different dialect (2.000) that is not supported. · 2.1 - The SMBv2.1 protocol that was introduced in Microsoft Windows 7 and Windows Server 2008R2. · 3.0 - The SMBv3.0 protocol that was introduced in Microsoft Windows 8 and Windows Server 2012. · 3.02 or 3.0.2 - The SMBv3.0.2 protocol that was introduced in Microsoft Windows 8.1 and Windows Server 2012R2. · 3.1.1 or 3.11 - The SMBv3.1.1 protocol that was introduced in Microsoft Windows 10 and Windows Server 2016. · 3 - The SMBv3.0 protocol version and above. · default - Tries to negotiate the highest SMB2+ version supported by both the client and server. [root@centos7 ~]#man mount.cifs vers= SMB protocol version. Allowed values are: · 1.0 - The classic CIFS/SMBv1 protocol. This is the default. · 2.0 - The SMBv2.002 protocol. This was initially introduced in Windows Vista Service Pack 1, and Windows Server 2008. Note that the initial release version of Windows Vista spoke a slightly different dialect (2.000) that is not supported. · 2.1 - The SMBv2.1 protocol that was introduced in Microsoft Windows 7 and Windows Server 2008R2. · 3.0 - The SMBv3.0 protocol that was introduced in Microsoft Windows 8 and Windows Server 2012.
管理SAMBA用户
实现samba用户说明
- 包:samba-common-tools
- 工具:smbpasswd pdbedit
- 用户数据库:/var/lib/samba/private/passdb.tdb
说明:samba用户须是Linux用户,建议使用/sbin/nologin
管理用户命令
添加 samba用户(虚拟用户):
#必须加-a选项,否则就是现有的用户改密码 smbpasswd -a <user> pdbedit -a -u <user>
修改用户密码:
smbpasswd <user>
删除用户和密码:
smbpasswd -x <user> pdbedit -x -u <user>
查看samba用户列表:
pdbedit -L -v
范例: 创建samba用户
#注意不要用-r 设为系统用户,因为不会生成家目录 [root@centos8 ~]#useradd -s /sbin/nologin smb1 [root@centos8 ~]#useradd -s /sbin/nologin smb2 [root@centos8 ~]#useradd -s /sbin/nologin smb3 [root@centos8 ~]#smbpasswd -a smb1 [root@centos8 ~]#smbpasswd -a smb2 [root@centos8 ~]#smbpasswd -a smb3 [root@centos8 ~]#pdbedit -L smb1:995: smb2:994: smb3:993: [root@centos8 ~]#pdbedit -L -v --------------- Unix username: smb1 NT username: Account Flags: [U ] User SID: S-1-5-21-564547271-2436613516-3895257592-1000 Primary Group SID: S-1-5-21-564547271-2436613516-3895257592-513 Full Name: Home Directory: \\centos8\smb1 HomeDir Drive: Logon Script: Profile Path: \\centos8\smb1\profile Domain: CENTOS8 Account desc: Workstations: Munged dial: Logon time: 0 Logoff time: Wed, 06 Feb 2036 23:06:39 CST Kickoff time: Wed, 06 Feb 2036 23:06:39 CST Password last set: Sun, 05 Jul 2020 09:44:45 CST Password can change: Sun, 05 Jul 2020 09:44:45 CST Password must change: never Last bad password : 0 Bad password count : 0 Logon hours : FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF --------------- Unix username: smb2 NT username: Account Flags: [U ] User SID: S-1-5-21-564547271-2436613516-3895257592-1001 Primary Group SID: S-1-5-21-564547271-2436613516-3895257592-513 Full Name: Home Directory: \\centos8\smb2 HomeDir Drive: Logon Script: Profile Path: \\centos8\smb2\profile Domain: CENTOS8 Account desc: Workstations: Munged dial: Logon time: 0 Logoff time: Wed, 06 Feb 2036 23:06:39 CST Kickoff time: Wed, 06 Feb 2036 23:06:39 CST Password last set: Sun, 05 Jul 2020 09:46:11 CST Password can change: Sun, 05 Jul 2020 09:46:11 CST Password must change: never Last bad password : 0 Bad password count : 0 Logon hours : FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF --------------- Unix username: smb3 NT username: Account Flags: [U ] User SID: S-1-5-21-564547271-2436613516-3895257592-1002 Primary Group SID: S-1-5-21-564547271-2436613516-3895257592-513 Full Name: Home Directory: \\centos8\smb3 HomeDir Drive: Logon Script: Profile Path: \\centos8\smb3\profile Domain: CENTOS8 Account desc: Workstations: Munged dial: Logon time: 0 Logoff time: Wed, 06 Feb 2036 23:06:39 CST Kickoff time: Wed, 06 Feb 2036 23:06:39 CST Password last set: Sun, 05 Jul 2020 09:48:11 CST Password can change: Sun, 05 Jul 2020 09:48:11 CST Password must change: never Last bad password : 0 Bad password count : 0 Logon hours : FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF #客户端查看 [root@Centos7 ~]#smbclient -L 10.0.0.8 -U smb2 Enter SAMBA\smb2's password: Sharename Type Comment --------- ---- ------- print$ Disk Printer Drivers IPC$ IPC IPC Service (Samba 4.11.2) smb2 Disk Home Directories Reconnecting with SMB1 for workgroup listing. smbXcli_negprot_smb1_done: No compatible protocol selected by server. protocol negotiation failed: NT_STATUS_INVALID_NETWORK_RESPONSE Unable to connect with SMB1 -- no workgroup available
查看samba服务器状态:
smbstatus
范例:
[root@centos8 ~]#smbstatus Samba version 4.11.2 PID Username Group Machine Protocol Version Encryption Signing ---------------------------------------------------------------------------------------------------------------------------------------- 2712 smb1 smb1 10.0.0.1 (ipv4:10.0.0.1:12574) SMB3_11 - partial(AES-128-CMAC) Service pid Machine Connected at Encryption Signing --------------------------------------------------------------------------------------------- IPC$ 2712 10.0.0.1 Sun Jul 5 09:52:41 AM 2020 CST - - No locked files
SAMBA服务器配置
samba 配置文件 /etc/smb.conf 格式 ,使用.ini文件的格式
帮助:man smb.conf
用 [ ] 分成以下几部分
全局设置:
[global] 服务器通用或全局设置的部分
特定共享设置:
[homes] 用户的家目录共享 [printers] 定义打印机资源和服务 [sharename] 自定义的共享目录配置 其中:#和;开头的语句为注释,大小写不敏感
samba配置中的宏定义:
%m 客户端主机的NetBIOS名 %M 客户端主机的FQDN %H 当前用户家目录路径 %U 当前用户的用户名 %g 当前用户所属组 %h samba服务器的主机名 %L samba服务器的NetBIOS名 %I 客户端主机的IP,是i的大写字母 %T 当前日期和时间 %S 可登录的用户名
SAMBA服务器全局配置
- workgroup 指定工作组名称
- server string 主机注释信息
netbios name 指定NetBIOS名,注意:netbios name需要启动nmb服务
范例:
[global] workgroup = workgroup netbios name = smbserver #此设置需要启动nmb服务才可能生效
- interfaces 指定服务侦听接口和IP
hosts allow 可用逗号,空格,或tab分隔,默认允许所有主机访问,也可在每个共享独立配置,如在[global]设置,将应用并覆盖所有共享设置,可以是以下格式:
IPv4 network/prefix: 172.16.0.0/24 IPv4 前缀: 172.16.0. IPv4 network/netmask: 172.16.0.0/255.255.255.0 主机名: desktop.example.com 以example.com后缀的主机名: .example.com
范例:
hosts allow = 172.16. .example.com
- hosts deny 拒绝指定主机访问,格式和hosts allow 相同
- config file=/etc/samba/conf.d/%U 用户独立的配置文件
- Log file=/var/log/samba/log.%I 不同客户机采用不同日志
log level = 2 日志级别,默认为0,不记录日志
范例:
[global] Log file=/var/log/samba/log.%I log level = 2
- max log size=50 日志文件达到50K,将轮循rotate,单位KB
- Security三种认证方式:
user:samba用户(采有linux用户,samba的独立口令)
share:匿名(CentOS7不再支持),已不建议使用
server:已不建议使用 - passdb backend = tdbsam 密码数据库格式
配置特定目录共享
每个共享目录应该有独立的[ ]部分
[共享名称] 远程网络看到的共享名称 comment 注释信息 path 所共享的目录路径 public 能否被guest访问的共享,默认no,和guest=ok 类似 browsable 是否允许所有用户浏览此共享,默认为yes,no为隐藏 writable=yes 可以被所有用户读写,默认为no read only=no 和writable=yes等价,如与以上设置冲突,放在后面的设置生效,默认只读 write list 用户,@组名,+组名 之间用逗号分隔,如:writable=no,列表中用户或组可读写,不在列表中用户只读 valid users 特定用户才能访问该共享,如为空,将允许所有用户,用户名之间用空格分隔
范例:基于特定用户和组的共享
vim /etc/samba/smb.conf [share] path = /data/dir valid users=smb1,@admins writeable = no browseable = no #隐藏共享,不输入文件名就看不到
范例:
vim /etc/samba/smb.conf [share] path = /data/dir valid users=smb1,@admins writeable = no #写权限如果打开,对应的/data/dir也要给权限 browseable = no [root@centos8 ~]#groupadd admins [root@centos8 ~]#groupmems -a smb2 -g admins [root@centos8 ~]#groupmems -l -g admins smb2 [root@centos8 ~]#mkdir /data/dir [root@centos8 ~]#touch /data/dir/dir1.txt #由于隐藏了共享,看不到文件夹 [root@Centos7 ~]#smbclient -L 10.0.0.8 -U smb1%magedu Sharename Type Comment --------- ---- ------- print$ Disk Printer Drivers IPC$ IPC IPC Service (Samba 4.11.2) smb1 Disk Home Directories #输入完整路径就可以看到 [root@Centos7 ~]#smbclient //10.0.0.8/share -U smb1%magedu Try "help" to get a list of possible commands. smb: \> ls . D 0 Sun Jul 5 10:30:29 2020 .. D 0 Sun Jul 5 10:30:15 2020 dir1.txt N 0 Sun Jul 5 10:30:29 2020 52403200 blocks of size 1024. 52004624 blocks available smb: \> !ls anaconda-ks.cfg a.txt dir1.txt ifcfg-eth0 init_set.sh reset.sh smb: \> put anaconda-ks.cfg #由于没有写权限,只能下载不能上传 NT_STATUS_ACCESS_DENIED opening remote file \anaconda-ks.cfg #授予写权限,同时给文件夹权限 vim /etc/samba/smb.conf writeable = yes [root@centos8 ~]#ll -d /data/dir/dir1.txt -rw-r--r-- 1 root root 0 Jul 5 10:30 /data/dir/dir1.txt [root@centos8 ~]#ll -d /data/dir/ drwxr-xr-x 2 root root 22 Jul 5 10:30 /data/dir/ [root@centos8 ~]#setfacl -m u:smb1:rwx,g:admins:rwx /data/dir/ [root@centos8 ~]#getfacl /data/dir/ getfacl: Removing leading '/' from absolute path names # file: data/dir/ # owner: root # group: root user::rwx user:smb1:rwx group::r-x group:admins:rwx mask::rwx other::r-x #可以上传文件 [root@Centos7 ~]#smbclient //10.0.0.8/share -U smb1%magedu Try "help" to get a list of possible commands. smb: \> put anaconda-ks.cfg putting file anaconda-ks.cfg as \anaconda-ks.cfg (313.7 kb/s) (average 313.7 kb/s)
实战案例
实战案例:利用SAMBA实现指定目录共享
#在samba服务器上安装samba包 yum -y install samba #创建samba用户和组 groupadd -r admins useradd -s /sbin/nologin -G admins wang smbpasswd -a wang useradd -s /sbin/nologin mage smbpasswd -a mage #创建samba共享目录,并设置SElinux mkdir /testdir/smbshare chgrp admins /testdir/smbshare chmod 2775 /testdir/smbshare #samba服务器配置 vim /etc/samba/smb.conf ...省略... [share] path = /testdir/smbshare write list = @admins systemctl enable --now smb nmb #samba客户端访问 yum -y install cifs-utils #用wang用户挂载smb共享并访问 mkdir /mnt/wang mount -o username=wang //smbserver/share /mnt/wang echo "Hello wang" >/mnt/wang/wangfile.txt #用mage用户挂载smb共享并访问 mkdir /mnt/mage mount -o username=mage //smbserver/share /mnt/mage touch /mnt/mage/magefile.txt
实战案例2:实现不同samba用户访问相同的samba共享,实现不同的配置
#创建三个samba用户,并指定密码为magedu useradd -s /sbin/nologin smb1 useradd -s /sbin/nologin smb2 useradd -s /sbin/nologin smb3 smbpasswd -a smb1 smbpasswd -a smb2 smbpasswd -a smb3 #修改samba配置文件 Vim /etc/samba/smb.conf #在workgroup下加一行 config file= /etc/samba/conf.d/%U 说明:%U表示用户名 [share] Path=/data/dir Read only= NO Guest ok = yes #任何人都可以访问 write list=@wheel #wheel组的人可写 #针对smb1和smb2用户创建单独的配置文件 Vim /etc/samba/conf.d/smb1 [share] Path=/data/dir1 Read only= NO 等价于writable = yes Create mask=0644 #说明:默认为744 Vim /etc/samba/conf.d/smb2 [share] path=/data/dir2 systemctl restart smb nmb #用户smb1,smb2,smb3访问share共享目录,看到目录是不同目录 smbclient //sambaserver/share -U smb1%magedu smbclient //sambaserver/share -U smb2%magedu smbclient //sambaserver/share -U smb3%magedu
数据的实时同步
在生产环境,有时会需要两台主机的特定目录实现实时同步。比如,将NFS共享目录的数据文件,自动实时同步到备份的服务器特定目录中
实时同步技术介绍
实现实时同步的方法
- inotify + rsync 方式实现数据同步
- sersync :前金山公司周洋(花椒直播)在 inotify 软件基础上进行开发的,功能更加强大
*工作原理*:
- 要利用监控服务(inotify),监控同步数据服务器目录中信息的变化
- 发现目录中数据产生变化,就利用rsync服务推送到备份服务器上
inotify:
异步的文件系统事件监控机制,利用事件驱动机制,而无须通过诸如cron等的轮 询机制来获取事件,linux内核从2.6.13起支持inotify,通过inotify可以监控 文件系统中添加、删除,修改、移动等各种事件
[root@data-centos8 ~]#grep -i inotify /boot/config-4.18.0-80.el8.x86_64 CONFIG_INOTIFY_USER=y #被集成在内核文件里
实现inotify软件 :
- inotify-tools
- sersync
- lrsyncd
inotify+rsync使用方式
- inotify 对同步数据目录信息的监控
- rsync 完成对数据的同步
- 利用脚本进行结合
实现inotify
内核支持
内核是否支持inotify
Linux支持inotify的内核最小版本为 2.6.13,参看man 7 inotify
#列出下面的文件,说明服务器内核支持inotify [root@centos8 ~]#ls -l /proc/sys/fs/inotify -rw-r--r-- 1 root root 0 Jul 7 08:49 max_queued_events -rw-r--r-- 1 root root 0 Jul 7 08:49 max_user_instances -rw-r--r-- 1 root root 0 Jul 7 08:49 max_user_watches [root@centos8 ~]#cat /proc/sys/fs/inotify/max_queued_events 16384 [root@centos8 ~]#cat /proc/sys/fs/inotify/max_user_instances 128 [root@centos8 ~]#cat /proc/sys/fs/inotify/max_user_watches 8192
*inotify内核参数说明*:
- max_queued_events:inotify 事件队列最大长度,如值太小会出现 Event Queue Overflow 错误,默认值:16384, 生产环境建议调大,比如:327679
- max_user_instances:每个用户创建inotify实例最大值,默认值:128
- max_user_watches:可以监视的文件的总数量(inotifywait 单进程),默认值:8192,建议调大
范例:修改inotify内核参数默认值
[root@data-centos8 ~]#vim /etc/sysctl.conf fs.inotify.max_queued_events=66666 fs.inotify.max_user_watches=100000 [root@centos8 ~]#sysctl -p fs.inotify.max_queued_events = 66666 fs.inotify.max_user_watches = 100000 [root@centos8 ~]#cat /proc/sys/fs/inotify/* 66666 128 100000
inotify-tools工具
inotify-tools参考文档:https://github.com/rvoicilas/inotify-tools/wiki
安装inotify-tools:基于epel源
[root@data-centos8 ~]# yum -y install inotify-tools
*inotify-tools包主要工具*:
- inotifywait: 在被监控的文件或目录上等待特定文件系统事件(open, close,delete等)发生,会在屏幕上打印相关信息,常用于实时同步的目录 监控(相对常用)
- inotifywatch:收集被监控的文件系统使用的统计数据,指文件系统事件发生的次数统计(相对少用)
inotifywait 命令
格式:
inotifywait [ options ] file1 [ file2 ] [ file3 ] [ ... ]
常用选项:
-m, --monitor 始终保持事件监听 -d, --daemon 以守护进程方式执行,和-m相似,配合-o使用 -r, --recursive 递归监控目录数据信息变化 -q, --quiet 输出少量事件信息 --exclude <pattern> 指定排除文件或目录,使用扩展的正则表达式匹配的模式实现 --excludei <pattern> 和exclude相似,不区分大小写 -o, --outfile <file> 打印事件到文件中,相当于标准正确输出,注意:使用绝对路径 -s, --syslogOutput 发送错误到syslog相当于标准错误输出 --timefmt <fmt> 指定时间输出格式 --format <fmt> 指定的输出格式;即实际监控输出内容 -e 指定监听指定的事件,如果省略,表示所有事件都进行监听
inotifywait 的–timefmt 时间格式
参考 man 3 strftime
%Y 年份信息,包含世纪信息 %y 年份信息,不包括世纪信息 %m 显示月份,范围 01-12 %d 每月的第几天,范围是 01-31 %H 小时信息,使用 24小时制,范围 00-23 %M 分钟,范围 00-59 %S 秒,范例 0-60
范例:
--timefmt "%Y-%m-%d %H:%M:%S"
inotifywait 的 –format 格式定义
%T 输出时间格式中定义的时间格式信息,通过 --timefmt option 语法格式指定时间信息 %w 事件出现时,监控文件或目录的名称信息,相当于dirname %f 事件出现时,将显示监控目录下触发事件的文件或目录信息,否则为空,相当于basename %e 显示发生的事件信息,不同的事件默认用逗号分隔 %Xe 显示发生的事件信息,不同的事件指定用X进行分隔
范例:
--format "%T %w%f event: %;e" --format '%T %w %f'
inotifywait -e 选项指定的事件类型
create 文件或目录创建 delete 文件或目录被删除 modify 文件或目录内容被写入 attrib 文件或目录属性改变 close_write 文件或目录关闭,在写入模式打开之后关闭的 close_nowrite 文件或目录关闭,在只读模式打开之后关闭的 close 文件或目录关闭,不管读或是写模式 open 文件或目录被打开 lsdir 浏览目录内容 moved_to 文件或目录被移动到监控的目录中 moved_from 文件或目录从监控的目录中被移动 move 文件或目录不管移动到或是移出监控目录都触发事件 access 文件或目录内容被读取 delete_self 文件或目录被删除,目录本身被删除 unmount 取消挂载
范例:只把关注的事件显示出来
-e create,delete,moved_to,close_write, attrib
范例:使用inotifywait
#监控一次性事件 inotifywait /data/www #跟踪一个文件夹,一次性的任务 Setting up watches. Watches established. /data/www/ CREATE f1.txt #-m持续前台监控,-r递归监控目录,-q输出少量信息,排除.swx和swp为后缀文件 inotifywait -mrq /data/www --exclude=".*\.swx|\.swp" /data/www/ OPEN f1.txt /data/www/ ACCESS f1.txt /data/www/ CLOSE_NOWRITE,CLOSE f1.txt #持续后台监控,并记录日志 inotifywait -o /root/inotify.log -drq /data/www --timefmt "%Y-%m-%d %H:%M:%S" --format "%T %w%f event: %e" #-o输出信息传到文件里,-d后台执行 #持续前台监控特定事件 inotifywait -mrq /data/www --timefmt "%F %H:%M:%S" --format "%T %w%f event:%;e" -e create,delete,moved_to,close_write,attrib #-e只把我们关注的事件显示出来
rsync
rsync 常用于做为linux系统下的数据镜像备份工具,实现远程同步,支持本地 复制,或者与其他SSH、rsync主机同步数据,支持增量备份,配合任务计划, rsync能实现定时或间隔同步,配合inotify或sersync,可以实现触发式的实时 数据同步
官方网站: http://rsync.samba.org/
软件包:rsync,rsync-daemon(CentOS 8)
服务文件:/usr/lib/systemd/system/rsyncd.service
配置文件:/etc/rsyncd.conf
端口:873/tcp
rsync命令
rsync 格式
#Local: rsync [OPTION...] SRC... [DEST] #Access via remote shell: Pull:远程文件拉到本机 rsync [OPTION...] [USER@]HOST:SRC... [DEST] Push:本机文件推到目标机器 rsync [OPTION...] SRC... [USER@]HOST:DEST #Access via rsync daemon: Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST] rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST] Push: rsync [OPTION...] SRC... [USER@]HOST::DEST rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST #The ':' usages connect via remote shell, while '::' & 'rsync://' usages connect to an rsync daemon, and require SRC or DEST to start with a module name. #一个:就代表是远程ssh,两个:代表是守护进程
*rsync有三种工作方式*:
- 本地文件系统上实现同步。命令行语法格式为上述”Local”段的格式。
- 本地主机使用远程shell和远程主机通信。命令行语法格式为上述”Access via remote shell”段的格式。
- 本地主机通过网络套接字连接远程主机上的rsync daemon。命令行语法格式为上述”Access via rsync daemon”段的格式。
前两者的本质是通过本地或远程shell,而第3种方式则是让远程主机上运行rsyncd服务,使其监听在一个端口上,等待客户端的连接。
*常见选项*:
-v: 显示rsync过程中详细信息。可以使用"-vvvv"获取更详细信息。 -q, --quiet 精简输出模式 -c, --checksum 打开校验开关,强制对文件传输进行校验 -大P: 显示文件传输的进度信息。(实际上"-P"="--partial --progress",其中的"--progress"才是显示进度信息的)。 -n --dry-run : 仅测试传输,而不实际传输。常和"-vvvv"配合使用来查看rsync是如何工作的。 -a --archive : 归档模式,表示递归传输并保持文件属性。等同于"-rtopgDl"。 -r --recursive:递归到目录中去。 -R --relative: 使用相对路径。意味着将命令行中指定的全路径而非路径最尾部的文件名发送给服务端,包括它们的属性。用法见下文示例。 -t --times: 保持mtime属性。强烈建议任何时候都加上"-t",否则目标文件mtime会设置为系统时间,导致下次更新 : 检查出mtime不同从而导致增量传输无效。 -o --owner: 保持owner属性(属主)。 -g --group: 保持group属性(属组)。 -p --perms: 保持perms属性(权限,不包括特殊权限)。 -H, --hard-links 保留硬链结 -D : 是"--device --specials"选项的组合,即也拷贝设备文件和特殊文件。 -l --links: 如果文件是软链接文件,则拷贝软链接本身而非软链接所指向的对象 -L, --copy-links 想对待常规文件一样处理软链结 -z : 传输时进行压缩提高效率 --size-only : 默认算法是检查文件大小和mtime不同的文件,使用此选项将只检查文件大小。 -u --update : 仅在源mtime比目标已存在文件的mtime新时才拷贝。注意,该选项是接收端判断的,不会影响删除行为。 -d --dirs : 以不递归的方式拷贝目录本身。默认递归时,如果源为"dir1/file1",则不会拷贝dir1目录,使用该选项将拷贝dir1但不拷贝file1。 --max-size : 限制rsync传输的最大文件大小。可以使用单位后缀,还可以是一个小数值(例如:"--max-size=1.5m") --min-size : 限制rsync传输的最小文件大小。这可以用于禁止传输小文件或那些垃圾文件。 --exclude : 指定排除规则来排除不需要传输的文件。 --delete : 以SRC为主,对DEST进行同步。多则删之,少则补之。注意"--delete"是在接收端执行的,所以它是在 :exclude/include规则生效之后才执行的。 -b --backup : 对目标上已存在的文件做一个备份,备份的文件名后默认使用"~"做后缀。 --backup-dir: 指定备份文件的保存路径。不指定时默认和待备份文件保存在同一目录下。 -suffix=SUFFIX 定义备份文件前缀 -e : 指定所要使用的远程shell程序,默认为ssh。 --port : 连接daemon时使用的端口号,默认为873端口。 --password-file:daemon模式时的密码文件,可以从中读取密码实现非交互式。注意,这不是远程shell认证的密码,而是rsync模块认证的密码。 -W --whole-file:rsync将不再使用增量传输,而是全量传输。在网络带宽高于磁盘带宽时,该选项比增量传输更高效。 --existing : 要求只更新目标端已存在的文件,目标端还不存在的文件不传输。注意,使用相对路径时如果上层目录不存在也不会传输。 --ignore-existing:要求只更新目标端不存在的文件。和"--existing"结合使用有特殊功能,见下文示例。 --remove-source-files:要求删除源端已经成功传输的文件
复制软连接文件
cp -dR path1 path2
rsync -rlpgoDz
范例:两种格式访问 rsync daemon 服务(这两种方式最大的缺陷就是任何人不用key验证就可以进行同步,很不安全)
#在备份服务器启动 rsync 进程 [root@backup-centos8 ~]#rsync --daemon Failed to parse config file: /etc/rsyncd.conf [root@backup-centos8 ~]#touch /etc/rsyncd.conf [root@backup-centos8 ~]#rsync --daemon [root@backup-centos8 ~]#ss -ntlp|grep rsync LISTEN 0 5 0.0.0.0:873 0.0.0.0:* users:(("rsync",pid=2697,fd=4)) LISTEN 0 5 [::]:873 [::]:* users:(("rsync",pid=2697,fd=5)) [root@backup-centos8 ~]# [root@backup-centos8 ~]#cat /etc/rsyncd.conf [backup] #模块名,代表指定的共享资源的目录 path = /data/backup/ read only = no #指定可读写,默认只读 #指定目录给nobody权限,默认用户以nobody访问此目录 [root@backup-centos8 ~]#setfacl -m u:nobody:rwx /data/backup/ #查看rsync服务器的模块名称 [root@data-centos8 ~]#rsync rsync://backup-server backup [root@data-centos8 ~]#rsync backup-server:: backup #访问rsync服务器的共享目录 [root@data-centos8 ~]#rsync /etc/networks root@backup-server::backup [root@data-centos8 ~]#rsync /etc/shells rsync://root@backup-server/backup [root@data-server ~]#rsync 10.0.0.18::backup/* /opt [root@data-server ~]#rsync rsync://10.0.0.18/backup/* /mnt
以独立服务方式运行rsync并实现验证功能
范例:以独立服务方式运行 rsync
[root@backup-centos8 ~]#dnf install rsync-daemon #创建rsync服务器的配置文件 [root@centos8 ~]#vi /etc/rsyncd.conf uid = root #提定以哪个用户来访问共享目录,将之指定为生成的文件所有者,默认为nobody gid = root #默认为nobody #port = 874 可指定非标准端口,默认873/tcp #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目录,如果同名后面模块生效 path = /data/backup/ comment = backup dir read only = no #默认是yes,即只读 auth users = rsyncuser #默认anonymous可以访问rsync服务器,这里指定用户访问 secrets file = /etc/rsync.pas #用户密码 #服务器端准备目录 [root@backup-centos8 ~]#mkdir -pv /data/backup #服务器端生成验证文件 [root@backup-centos8 ~]#echo "rsyncuser:magedu" > /etc/rsync.pas [root@backup-centos8 ~]#chmod 600 /etc/rsync.pas #服务器端启动rsync服务 [root@backup-centos8 ~]#rsync --daemon #可加入/etc/rc.d/rc.local实现开机启动 [root@backup-centos8 ~]#systemctl start rsyncd #CentOS 7 以上版本 #客户端配置密码文件 #也可将密码赋值给环境变量RSYNC_PASSWORD变量,但不安全 #export RSYNC_PASSWORD=magedu [root@data-centos8 ~]#echo "magedu" > /etc/rsync.pas [root@data-centos8 ~]#chmod 600 /etc/rsync.pas #此为必要项,权限必须修改 #查看远程rsync服务器的模块信息 [root@data-server ~]#rsync rsync://10.0.0.18 backup backup dir #查看具体模块内的文件需要验证 [root@data-server ~]#rsync rsync://10.0.0.18/backup Password: #客户端测试同步数据 [root@data-centos8 ~]#rsync -avz --delete --password-file=/etc/rsync.pas /data/www/ rsyncuser@rsync服务器IP::backup [root@data-centos8 ~]#rsync -avz --delete --password-file=/etc/rsync.pas rsyncuser@rsync服务器IP::backup /data/www/
inotify+rsync+shell 脚本实现实时数据同步
按 5.3 搭建好 rsyncd的备份服务器,在数据服务器上创建inotify_rsync.sh脚本
注意: 此脚本执行前先确保两主机初始数据处于同步状态,此脚本实现后续的数据同步
[root@data-centos8 ~]#vim inotify_rsync.sh #!/bin/bash SRC='/data/www/' #注意最后的/ DEST='rsyncuser@rsync服务器IP::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@data-server www]#touch f1.txt [root@data-centos8 ~]#tail -f /var/log/changelist.log At 10:13:38 on 2020-07-08, file /data/www/f1.txt was backuped up via rsync At 10:13:38 on 2020-07-08, file /data/www/f1.txt was backuped up via rsync At 10:13:38 on 2020-07-08, file /data/www/f1.txt was backuped up via rsync
sersync 实现实时数据同步
sersync 介绍
sersync类似于inotify,同样用于监控,但它克服了inotify的缺点.
inotify最大的不足是会产生重复事件,或者同一个目录下多个文件的操作会产 生多个事件,例如,当监控目录中有5个文件时,删除目录时会产生6个监控事件, 从而导致重复调用rsync命令。比如:vim文件时,inotify会监控到临时文件的 事件,但这些事件相对于rsync来说是不应该被监控的
*sersync 优点*:
- sersync是使用c++编写,而且对linux系统文件系统产生的临时文件和重复的文件操作进行过滤,所以在结合rsync同步的时候,节省了运行时耗和网络资源。因此更快。
- sersync配置很简单,其中提供了静态编译好的二进制文件和xml配置文件,直接使用即可
- sersync使用多线程进行同步,尤其在同步较大文件时,能够保证多个服务器实时保持同步状态
- sersync有出错处理机制,通过失败队列对出错的文件重新同步,如果仍旧失败,则按设定时长对同步失败的文件重新同步
- sersync不仅可以实现实时同步,另外还自带crontab功能,只需在xml配置文件中开启,即也可以按要求隔一段时间整体同步一次,而无需再额外配置crontab功能
- sersync 可以二次开发
sersync项目地址: https://code.google.com/archive/p/sersync/
sersync下载地址: https://code.google.com/archive/p/sersync/downloads
基于rsync daemon 实现 sersync
#在数据服务器上下载sersync,并拷贝至相应的目录,设置PATH变量 [root@data-centos8 ~]#wget https://storage.googleapis.com/google-code-archivedownloads/v2/code.google.com/sersync/sersync2.5.4_64bit_binary_stable_final.tar.gz [root@data-centos8 ~]#tar xf sersync2.5.4_64bit_binary_stable_final.tar.gz [root@data-centos8 ~]#cp -a GNU-Linux-x86 /usr/local/sersync [root@data-centos8 ~]#echo 'PATH=/usr/local/sersync:$PATH' > /etc/profile.d/sersync.sh [root@data-centos8 ~]#source /etc/profile.d/sersync.sh #sersync目录只有两个文件:一个是二进制程序文件,一个是xml格式的配置文件 [root@data-centos8 ~]#ls /usr/local/sersync/ confxml.xml sersync2 #确认安装rsync客户端工具 [root@data-centos8 ~]#rpm -q rsync &> /dev/null || dnf -y install rsync #备份sersync配置文件 [root@data-centos8 ~]#cp /usr/local/sersync/confxml.xml{,.bak} #修改sersync配置文件 [root@data-centos8 ~]#vim /usr/local/sersync/confxml.xml <?xml version="1.0" encoding="ISO-8859-1"?> <head version="2.5"> <host hostip="localhost" port="8008"></host> <debug start="false"/> # 是否开启调试模式 <fileSystem xfs="false"/> <filter start="false"> #不开启文件过滤功能,当为true时,以下类型的文件将不同步 <exclude expression="(.*)\.svn"></exclude> <exclude expression="(.*)\.gz"></exclude> <exclude expression="^info/*"></exclude> <exclude expression="^static/*"></exclude> </filter> <inotify> # 监控事件,默认监控 delete/close_write/moved_from/moved_to/create folder <delete start="true"/> <createFolder start="true"/> <createFile start="false"/> <closeWrite start="true"/> <moveFrom start="true"/> <moveTo start="true"/> <attrib start="true"/> #修改此行为true,文件属性变化后也会同步 <modify start="false"/> </inotify> <sersync> # rsync命令的配置段 <localpath watch="/data/www"> #修改此行,需要同步的源目录或文件,建议同步目录 <remote ip="备份服务器IP" name="backup"/> #修改此行,指定备份服务器地址和rsync daemon的模块名,如果下面开启了ssh start,此时name为远程shell方式运行时的目标目录 <!--<remote ip="192.168.8.39" name="tongbu"/>--> <!--<remote ip="192.168.8.40" name="tongbu"/>--> </localpath> <rsync> <commonParams params="-artuz"/> # 指定rsync选项 <auth start="true" users="rsyncuser" passwordfile="/etc/rsync.pas"/> #修改此行,为true,定备份服务器的rsync配置的用户和密码文件 <userDefinedPort start="false" port="874"/><!-- port=874 -->#指定rsync的非标准端口号 <timeout start="false" time="100"/><!-- timeout=100 --> <ssh start="false"/> #默认使用rsync daemon运行rsync命令,true为使用远程shell模式 </rsync> <failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once--> #错误重传及日志文件路径 <crontab start="false" schedule="600"><!--600mins--> #不开启crontab功能 <crontabfilter start="false"> #不开启crontab定时传输的筛选功能 <exclude expression="*.php"></exclude> <exclude expression="info/*"></exclude> </crontabfilter> </crontab> <plugin start="false" name="command"/> </sersync> #####################################以下行不需要修改 #################################### <plugin name="command"> <param prefix="/bin/sh" suffix="" ignoreError="true"/> <!--prefix /opt/tongbu/mmm.sh suffix--> <filter start="false"> <include expression="(.*)\.php"/> <include expression="(.*)\.sh"/> </filter> </plugin> <plugin name="socket"> <localpath watch="/opt/tongbu"> <deshost ip="192.168.138.20" port="8009"/> </localpath> </plugin> <plugin name="refreshCDN"> <localpath watch="/data0/htdocs/cms.xoyo.com/site/"> <cdninfo domainname="ccms.chinacache.com" port="80" username="xxxx" passwd="xxxx"/> <sendurl base="http://pic.xoyo.com/cms"/> <regexurl regex="false" match="cms.xoyo.com/site([/a-zA-Z0-9]*).xoyo.com/images"/> </localpath> </plugin> </head> #创建连接rsynd服务器的用户密码文件,并必须修改权限 [root@data-centos8 ~]#echo magedu > /etc/rsync.pas [root@data-centos8 ~]#chmod 600 /etc/rsync.pas #查看帮助 [root@data-centos8 ~]#sersync2 -h set the system param execute:echo 50000000 > /proc/sys/fs/inotify/max_user_watches execute:echo 327679 > /proc/sys/fs/inotify/max_queued_events parse the command param _______________________________________________________ 参数-d: 启用守护进程模式 参数-r: 在监控前,将监控目录与远程主机用rsync命令推送一遍 c参数-n: 指定开启守护线程的数量,默认为10个 参数-o: 指定配置文件,默认使用当前工作目录下的confxml.xml文件 参数-m: 单独启用其他模块,使用 -m refreshCDN 开启刷新CDN模块 参数-m: 单独启用其他模块,使用 -m socket 开启socket模块 参数-m: 单独启用其他模块,使用 -m http 开启http模块 不加-m参数,则默认执行同步程序 #以后台方式执行同步 [root@data-centos8 ~]#sersync2 -dro /usr/local/sersync/confxml.xml set the system param execute:echo 50000000 > /proc/sys/fs/inotify/max_user_watches execute:echo 327679 > /proc/sys/fs/inotify/max_queued_events parse the command param option: -d run as a daemon option: -r rsync all the local files to the remote servers before the sersync work option: -o config xml name: /usr/local/sersync/confxml.xml daemon thread num: 10 parse xml config file host ip : localhost host port: 8008 daemon start,sersync run behind the console use rsync password-file : user is rsyncuser passwordfile is /etc/rsync.pas config xml parse success please set /etc/rsyncd.conf max connections=0 Manually sersync working thread 12 = 1(primary thread) + 1(fail retry thread) + 10(daemon sub threads) Max threads numbers is: 22 = 12(Thread pool nums) + 10(Sub threads) please according your cpu ,use -n param to adjust the cpu rate ------------------------------------------ rsync the directory recursivly to the remote servers once working please wait... #如果同步失败,可以手动执行下面命令,观察过程 [root@data-centos8 ~]# cd /data/www && rsync -artuz -R --delete ./ rsyncuser@backup-server::backup --password-file=/etc/rsync.pas >/dev/null 2>&1 run the sersync: watch path is: /data/www ________________________________________________________________ #sersync支持多实例,也即监控多个目录时,只需分别配置不同配置文件,然后使用sersync2指定对应配置文件运行 [root@data-centos8 ~]#sersync2 -rd -o /etc/sersync.d/nginx.xml [root@backup-server ~]#watch -n0.1 ls -l /data/backup/ #不想用了可以杀掉: killall sersync2
基于远程shell 实现 sersy
#不需要配置rsync daemon,只需要配置基于key验证的ssh即可 [root@data-centos8 ~]#ssh-keygen [root@data-centos8 ~]#ssh-copy-id backup-server #下载sersync,并拷贝至相应的目录,设置PATH变量同5.5.2 #修改sersync配置文件 [root@data-centos8 ~]#cat /usr/local/sersync/confxml.xml <?xml version="1.0" encoding="ISO-8859-1"?> <head version="2.5"> <host hostip="localhost" port="8008"></host> <debug start="false"/> <fileSystem xfs="false"/> <filter start="false"> <exclude expression="(.*)\.svn"></exclude> <exclude expression="(.*)\.gz"></exclude> <exclude expression="^info/*"></exclude> <exclude expression="^static/*"></exclude> </filter> <inotify> <delete start="true"/> <createFolder start="true"/> <createFile start="false"/> <closeWrite start="true"/> <moveFrom start="true"/> <moveTo start="true"/> <attrib start="true"/> #修改此行为true <modify start="false"/> </inotify> <sersync> <localpath watch="/data/www"> #修改此行,指定源数据目录 <remote ip="备份服务器IP" name="/data/backup"/> #修改此行指定备份服务器地址和备份目标目录 <!--<remote ip="192.168.8.39" name="tongbu"/>--> <!--<remote ip="192.168.8.40" name="tongbu"/>--> </localpath> <rsync> <commonParams params="-artuz"/> <auth start="false" users="root" passwordfile="/etc/rsync.pas"/> #必须修改此行,不启用认证 <userDefinedPort start="false" port="874"/><!-- port=874 --> <timeout start="false" time="100"/><!-- timeout=100 --> <ssh start="true"/> #修改此行为true,使用远程shell方式的rsync连接方式,无需在目标主机上配置启动rsync daemon服务 #####################################以下行不需要修改 #################################### </rsync> <failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once--> <crontab start="false" schedule="600"><!--600mins--> <crontabfilter start="false"> <exclude expression="*.php"></exclude> <exclude expression="info/*"></exclude> </crontabfilter> </crontab> <plugin start="false" name="command"/> </sersync> #将中间的行可以删除 </head> [root@data-centos8 ~]#sersync2 -dro /usr/local/sersync/confxml.xml set the system param execute:echo 50000000 > /proc/sys/fs/inotify/max_user_watches execute:echo 327679 > /proc/sys/fs/inotify/max_queued_events parse the command param option: -d run as a daemon option: -r rsync all the local files to the remote servers before the sersync work option: -o config xml name: /apps/sersync/confxml.xml daemon thread num: 10 parse xml config file host ip : localhost host port: 8008 daemon start,sersync run behind the console config xml parse success please set /etc/rsyncd.conf max connections=0 Manually sersync working thread 12 = 1(primary thread) + 1(fail retry thread) + 10(daemon sub threads) Max threads numbers is: 22 = 12(Thread pool nums) + 10(Sub threads) please according your cpu ,use -n param to adjust the cpu rate ------------------------------------------ rsync the directory recursivly to the remote servers once working please wait... execute command: cd /data/www && rsync -auz -R --delete ./ -e ssh 10.0.0.18:/data/backup >/dev/null 2>&1 run the sersync: watch path is: /data/www
实战案例:实现基于分布式的LAMP架构,并将NFS实时同步到备份服务器
其他
sshfs文件共享工具
性能比较低不建议长期使用,适合在数据备份时临时挂载使用。
使用
#安装 root@debian:~# apt install sshfs root@debian:~# dpkg -L sshfs /. /usr /usr/bin /usr/bin/sshfs /usr/sbin /usr/share /usr/share/bug /usr/share/bug/sshfs /usr/share/bug/sshfs/presubj /usr/share/doc /usr/share/doc/sshfs /usr/share/doc/sshfs/AUTHORS /usr/share/doc/sshfs/README.Debian /usr/share/doc/sshfs/README.rst /usr/share/doc/sshfs/changelog.Debian.gz /usr/share/doc/sshfs/changelog.gz /usr/share/doc/sshfs/copyright /usr/share/man /usr/share/man/man1 /usr/share/man/man1/sshfs.1.gz /usr/sbin/mount.fuse.sshfs /usr/sbin/mount.sshfs root@debian:~# sshfs -h usage: sshfs [user@]host:[dir] mountpoint [options] #主要的参数: -o uid=N #设置文件挂载的uid,也就是映射到本地的文件uid -o gid=N #设置文件挂载的gid -o allow_other #允许其他用户访问 -o port=PORT #ssh访问端口 #常见的使用方式 #临时挂载 sshfs -o allow_other,uid=997,gid=996 [email protected]:/root/test1 /root/1/ #卸载 umount /root/1
HFS
HTTP File Server 通过网络访问或共享磁盘文件
文档:https://github.com/rejetto/hfs/wiki
在计算机上运行HFS,配置页面会自动显示 选择您想要访问的文件和文件夹 可能会创建帐户并限制对文件的访问 只需使用浏览器即可从手机或另一台计算机访问这些文件
支持系统:Linux, Mac, Windows
#https://github.com/rejetto/hfs/releases 下载最新版 ./hfs 输入以下命令: create-admin <PASSWORD> #http://10.0.0.128/~/admin/ #登录admin 123456