第二十八章 网络文件共享服务

277 阅读16分钟

@[TOC](第二十八章 网络文件共享服务)

文件传输协议FTP

File Transfer Protocol 早期的三个应用级协议之一

基于C/S结构

双通道协议:数据和命令连接

数据传输格式:二进制(默认)和文本

两种模式:服务器角度

  • 主动(PORT style):服务器主动连接

命令(控制):客户端:随机port --->服务器:tcp21

数据:客户端:随机port <---服务器:tcp20

  • 被动(PASV style):客户端主动连接

命令(控制):客户端:随机port ---> 服务器:tcp21

数据:客户端:随机port --->服务器:随机port

服务器被动模式数据端口示例:

  • 227 Entering Passive Mode (172,16,0,1,224,59)

服务器数据端口为:224*256+59

FTP软件介绍

FTP服务器:

  • Wu-ftpd,Proftpd,Pureftpd,ServU,IIS
  • vsftpd:Very Secure FTP Daemon,CentOS默认FTP服务器 高速,稳定,下载速度是WU-FTP的两倍 ftp.redhat.com数据:单机最多可支持15000个并发

客户端软件:

ftp,lftp,lftpget,wget,curl

  • ftp -A ftpserver port -A主动模式 –p 被动模式

  • lftp –u username ftpserver

  • lftp username@ftpserver

  • lftpget ftp://ftpserver/pub/file

gftp:GUI centos5 最新版2.0.19 (11/30/2008)

filezilla,CuteFtp,FlashFXP,LeapFtp

IE ftp://username:password@ftpserver

FTP服务

状态码:

1XX:信息

125:数据连接打开

2XX:成功类状态 200:命令OK 230:登录成功

3XX:补充类

331:用户名OK

4XX:客户端错误 425:不能打开数据连接

5XX:服务器错误 530:不能登录

用户认证:

匿名用户:ftp,anonymous,对应Linux用户ftp

系统用户:Linux用户,用户/etc/passwd,密码/etc/shadow

虚拟用户:特定服务的专用用户,独立的用户/密码文件

nsswitch:network service switch名称解析框架 pam:pluggable authentication module 用户认证 /lib64/security /etc/pam.d/ /etc/pam.conf

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=21

主动模式端口

  • connect_from_port_20=YES 主动模式端口为20
  • ftp_data_port=20 (默认)

被动模式端口范围 | linux | 客户端默认使用被动模式 | | --- | --- | | windows | 客户端默认使用主动模式 | | pasv_min_port=6000 | 0为随机分配 | | pasv_max_port=6010 | |

使用当地时间

use_localtime=YES 使用当地时间(默认为NO,使用GMT)

vsftpd服务配置

匿名用户 | 选项 | 说明 | | --- | --- | | anonymous_enable=YES | 支持匿名用户 | | no_anon_password=YES(默认NO) | 匿名用户略过口令检查 | | anon_upload_enable=YES | 匿名上传,注意:文件系统权限 | | anon_mkdir_write_enable=YES | 匿名建目录 | | anon_world_readable_only | (默认YES)只能下载全部读的文件| | anon_umask=0333 | 指定匿名上传文件的umask,默认077 | | anon_other_write_enable=YES | 可删除和修改上传的文件 |

指定上传文件的默认的所有者和权限

chown_uploads=YES(默认NO)

chown_username=wang

chown_upload_mode=0644

vsftpd服务配置

Linux系统用户 | 选项 | 说明 | | --- | --- | | local_enable=YES | 是否允许linux用户登录 | | write_enable=YES | 允许linux用户上传文件 | | local_umask=022 | 指定系统用户上传文件的默认权限 | | guest_enable=YES | 所有系统用户都映射成guest用户 | | guest_username=ftp | 配合上面选项才生效,指定guest用户 | | local_root=/ftproot | guest用户登录所在目录 |

禁锢所有系统用户在家目录中

  • chroot_local_user=YES(默认NO,不禁锢)禁锢系统用户

禁锢或不禁锢特定的系统用户在家目录中,与上面设置功能相反

  • chroot_list_enable=YES
  • chroot_list_file=/etc/vsftpd/chroot_list
  • 当chroot_local_user=YES时,则chroot_list中用户不禁锢
  • 当chroot_local_user=NO时,则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

使用pam(Pluggable Authentication Modules)完成用户认证

  • pam_service_name=vsftpd

pam配置文件:/etc/pam.d/vsftpd

/etc/vsftpd/ftpusers 默认文件中用户拒绝登录

是否启用控制用户登录的列表文件

  • userlist_enable=YES 默认有此设置
  • userlist_deny=YES(默认值) 黑名单,不提示口令,NO为白名单
  • userlist_file=/etc/vsftpd/users_list 此为默认值

vsftpd服务指定用户身份运行

  • nopriv_user=nobody (默认值)

连接数限制 | 选项 | 说明 | | --- | --- | | max_clients=0 | 最大并发连接数 | | max_per_ip=0 | 每个IP同时发起的最大连接数 |

传输速率:字节/秒 | 选项 | 说明 | | --- | --- | | anon_max_rate=0 | 匿名用户的最大传输速率 | | 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

实验:实现基于MySQL的虚拟用户FTP服务

前提

ftp服务器 :IP7

mariadb服务器:IP18

mariadb服务器

[root@mariadb ~]# yum install mariadb-server -y

[root@mariadb ~]# systemctl start mariadb
[root@mariadb ~]# mysql_secure_installation		#密码123.com
[root@mariadb ~]# mysql -uroot -p123.com
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 );

MariaDB [vsftpd]> desc users;	#查看表结构
+----------+----------+------+-----+---------+----------------+
| Field    | Type     | Null | Key | Default | Extra          |
+----------+----------+------+-----+---------+----------------+
| id       | int(11)  | NO   | PRI | NULL    | auto_increment |
| name     | char(50) | NO   |     | NULL    |                |
| password | char(48) | NO   |     | NULL    |                |
+----------+----------+------+-----+---------+----------------+
3 rows in set (0.00 sec)


#建虚拟用户
MariaDB [vsftpd]> insert users (name,password) value('ftpuser1',password('centos'));
Query OK, 1 row affected (0.00 sec)

MariaDB [vsftpd]> insert users (name,password) value('ftpuser2',password('zhang'));
Query OK, 1 row affected (0.00 sec)


#授权
MariaDB [vsftpd]> grant select on vsftpd.users to vsftpd@'192.168.37.%' identified by 'centos';
Query OK, 0 rows affected (0.00 sec)

MariaDB [vsftpd]> select * from users;
+----+----------+-------------------------------------------+
| id | name     | password                                  |
+----+----------+-------------------------------------------+
|  1 | ftpuser1 | *128977E278358FF80A246B5046F51043A2B1FCED |
|  2 | ftpuser2 | *5D83A6402DF44A7D8EC2B8861B19F8A2F4F3EA2F |
+----+----------+-------------------------------------------+
2 rows in set (0.00 sec)

ftp服务器

pam_mysql-0.7RC1.tar.gz

[root@ftp ~]# yum install -y gcc gcc-c++ pam-devel  mariadb-devel vsftpd
#解压缩
[root@ftp ~]# tar xvf pam_mysql-0.7RC1.tar.gz -C /data/
[root@ftp ~]# cd /data/pam_mysql-0.7RC1/
#编译安装
[root@ftp pam_mysql-0.7RC1]# ./configure --with-pam-mods-dir=/lib64/security/
[root@ftp pam_mysql-0.7RC1]# make && make install 

#查看刚刚的模块有没有生成
[root@ftp pam_mysql-0.7RC1]# ls /lib64/security -l -t
...
-rwxr-xr-x  1 root root    883 Jul 17 16:16 pam_mysql.la
-rwxr-xr-x  1 root root 141752 Jul 17 16:16 pam_mysql.so
在FTP服务器上建立pam认证所需文件
[root@ftp pam_mysql-0.7RC1]# vim /etc/pam.d/vsftpd.mysql
auth required pam_mysql.so user=vsftpd passwd=centos host=192.168.37.18 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
account required pam_mysql.so user=vsftpd passwd=centos host=192.168.37.18 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()函数加密

#建立虚拟用户映射的系统用户及对应的目录
[root@ftp pam_mysql-0.7RC1]# useradd -d /data/ftproot -s /sbin/nologin vuser
#需除去ftp根目录的写权限
[root@ftp pam_mysql-0.7RC1]# chmod 555 /data/ftproot/
#创建子文件夹
[root@ftp pam_mysql-0.7RC1]# mkdir /data/ftproot/upload
[root@ftp pam_mysql-0.7RC1]# setfacl -m u:vuser:rwx /data/ftproot/upload
[root@ftp pam_mysql-0.7RC1]# vim /etc/vsftpd/vsftpd.conf
...
#pam_service_name=vsftpd		<--注释掉此行
pam_service_name=vsftpd.mysql	<--
userlist_enable=YES
tcp_wrappers=YES

guest_enable=YES			<--所有系统用户都映射成guest用户
guest_username=vuser		<--配合上面选项才生效,指定guest用户
user_config_dir=/etc/vsftpd/vusers.d/		<--配置vsftpd为虚拟用户使用配置文件目录
...
[root@ftp pam_mysql-0.7RC1]# mkdir /etc/vsftpd/vusers.d/

注意:'ftpuser1'和'ftpuser2'两人的目录是不一样的

[root@ftp pam_mysql-0.7RC1]# vim /etc/vsftpd/vusers.d/ftpuser1
anon_upload_enable=YES			<--匿名上传,注意:文件系统权限
anon_mkdir_write_enable=YES		<--匿名建目录
anon_other_write_enable=YES		<--可删除和修改上传的文件

[root@ftp pam_mysql-0.7RC1]# vim /etc/vsftpd/vusers.d/ftpuser2
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
local_root=/data/ftproot2/		<--登录目录改变至指定的目录
[root@ftp pam_mysql-0.7RC1]# mkdir -pv /data/ftproot2/upload
#在ftpuers2家目录中创建一个文件、来区分与ftpuser1家目录不同
[root@ftp pam_mysql-0.7RC1]# touch /data/ftproot2/upload/ftproot2.txt
[root@ftp pam_mysql-0.7RC1]# chmod 555 /data/ftproot2

[root@ftp pam_mysql-0.7RC1]# setfacl -m u:vuser:rwx /data/ftproot2/upload/

[root@ftp pam_mysql-0.7RC1]# systemctl restart vsftpd

测试

[root@centos6 ~]$ ftp 192.168.37.7
Connected to 192.168.37.7 (192.168.37.7).
220 (vsFTPd 3.0.2)
Name (192.168.37.7:root): ftpuser1			<--用户:ftpuser1
331 Please specify the password.
Password:									<--密码:centos
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (192,168,37,7,102,189).
150 Here comes the directory listing.
drwxrwxr-x    2 0        0               6 Jul 17 16:23 upload
226 Directory send OK.
ftp> cd upload
250 Directory successfully changed.
ftp> ls
227 Entering Passive Mode (192,168,37,7,200,209).
150 Here comes the directory listing.
226 Directory send OK.
ftp> !ls
anaconda-ks.cfg  Documents  install.log		Music	  Public    Templates
Desktop		 Downloads  install.log.syslog	Pictures  reset.sh  Videos
ftp> put install.log			<--上传文件
local: install.log remote: install.log
227 Entering Passive Mode (192,168,37,7,132,66).
150 Ok to send data.
226 Transfer complete.
50968 bytes sent in 0.000752 secs (67776.59 Kbytes/sec)
ftp> ls
227 Entering Passive Mode (192,168,37,7,23,180).
150 Here comes the directory listing.
-rw-------    1 1001     1001        50968 Jul 17 16:26 install.log		<--文件上传成功
226 Directory send OK.
ftp> exit
221 Goodbye.
[root@centos6 ~]$ ftp 192.168.37.7
Connected to 192.168.37.7 (192.168.37.7).
220 (vsFTPd 3.0.2)
Name (192.168.37.7:root): ftpuser2  		<--ftpuser2用户
331 Please specify the password.
Password:					<--密码:zhang
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/"
ftp> ls
227 Entering Passive Mode (192,168,37,7,76,122).
150 Here comes the directory listing.
-rw-r--r--    1 0        0               0 Jul 17 15:54 ftproot2.txt		  <--ftpuser1没有此文件、所以两个用户的目录、权限不同
drwxrwxr-x    2 0        0               6 Jul 17 16:29 upload
226 Directory send OK.
ftp> cd upload
250 Directory successfully changed.
ftp> ls
227 Entering Passive Mode (192,168,37,7,105,173).
150 Here comes the directory listing.
226 Directory send OK.
ftp> !ls
anaconda-ks.cfg  Documents  install.log		Music	  Public    Templates
Desktop		 Downloads  install.log.syslog	Pictures  reset.sh  Videos
ftp> put reset.sh  		<--上传
local: reset.sh remote: reset.sh
227 Entering Passive Mode (192,168,37,7,30,232).
150 Ok to send data.
226 Transfer complete.
862 bytes sent in 4.8e-05 secs (17958.33 Kbytes/sec)
ftp> ls
227 Entering Passive Mode (192,168,37,7,90,214).
150 Here comes the directory listing.
-rw-------    1 1001     1001          862 Jul 17 16:30 reset.sh  		<--上传成功
226 Directory send OK.
ftp> mdelete reset.sh 		<--删除
mdelete reset.sh? y
250 Delete operation successful.
ftp> ls
227 Entering Passive Mode (192,168,37,7,25,39).
150 Here comes the directory listing.
226 Directory send OK.
ftp> exit
221 Goodbye.

NFS配置文件

每个条目指定目录导出到的哪些主机,及相关的权限和选项

• 默认选项:(ro,sync,root_squash,no_all_squash)

• ro,rw 只读和读写 • async 异步,数据变化后不立即写磁盘,性能高

• sync(1.0.0后为默认)同步,数据在请求时立即写入共享

• no_all_squash (默认)保留共享文件的UID和GID

• all_squash 所有远程用户(包括root)都变成nfsnobody

• root_squash(默认)远程root映射为nfsnobody,UID为65534,早期版本 是4294967294 (nfsnobody)

• no_root_squash 远程root映射成root用户

• anonuid和anongid指明匿名用户映射为特定用户UID和组GID,而非 nfsnobody,可配合all_squash使用

NFS工具

rpcinfo

  • rpcinfo -p hostname
  • rpcinfo –s hostname 查看RPC注册程序

exportfs

  • –v 查看本机所有NFS共享
  • –r 重读配置文件,并共享目录
  • –a 输出本机所有共享
  • –au 停止本机所有共享

showmount -e hostname

mount.nfs 挂载工具

客户端NFS挂载

NFS相关的挂载选项:man 5 nfs

  • fg(默认)前台挂载,bg后台挂载
  • hard(默认)持续请求,soft 非持续请求
  • intr 和hard配合,请求可中断
  • rsize和wsize 一次读和写数据最大字节数,rsize=32768
  • _netdev 无网络不挂载

基于安全考虑,建议使用nosuid,nodev,noexec挂载选项 示例:

mount -o rw,nosuid,fg,hard,intr 172.16.0.1:/testdir /mnt/nfs/

开机挂载:/etc/fstab

172.16.0.1:/public /mnt/nfs nfs defaults 0 0

NFS 挂载

7

#创建共享目录’/data/nfsdir1‘
[root@centos7 ~]# mkdir /data/nfsdir1
#在目录中创建两个文件
[root@centos7 ~]# touch /data/nfsdir1/1.txt
[root@centos7 ~]# touch /data/nfsdir1/2.txt
[root@centos7 ~]# ls /data/nfsdir1/
1.txt  2.txt
#把共享文件夹共享出来
[root@centos7 ~]# vim /etc/exports
/data/nfsdir1 *(rw)			<--

#启动服务
[root@centos7 ~]# systemctl start nfs-server

18

[root@18 ~]# vim /etc/auto.misc 
...
cd              -fstype=iso9660,ro,nosuid,nodev :/dev/cdrom
nfs             -fstype=nfs                     192.168.37.7:/data/nfsdir1		<--
...

实验1:NFS 挂载(需要写到'/etc/fstab')

目的

共享‘wang’用户家目录、实现漫游

主机IP
NFS服务器(CentOS7)37.18
客户端 A(CentOS7)37.6
客户端t B(CentOS6)37.7

NFS服务器 把'wang'用户家共享出来

#查看目录内信息、(空的可以'touch'创建文件进行测试)
[root@nfs ~]# ls /home/wang/

#开启共享目录'/home/wang'
[root@18 ~]# vim /etc/exports.d/wang.exports 
/home/wang 192.168.37.0/24(rw,anonuid=1000,anongid=1000,all_squash)

[root@18 ~]# systemctl start nfs-server
[root@18 ~]# systemctl enable nfs-server

客户端 A

挂载时建议使用干净目录否则原来有些文件会看不到了

#查看NFS主机共享出来的目录
[root@a ~]# showmount -e 192.168.37.18
Export list for 192.168.37.18:
/home/wang 192.168.37.0/24
#添加挂载信息
[root@a ~]# vim /etc/fstab
...
192.168.37.18:/home/wang	/home/wang		nfs		defaults		0 0
...
[root@a ~]# mount -a

#可以看到挂载信息
[root@a ~]# df
...
192.168.37.18:/home/wang 104806400  3888128 100918272   4% /home/wang
...

#切换'wang'用户
[root@a ~]# su - wang
#创建文件
[wang@a ~]$ touch centos7.txt 
#可以看到刚刚的创建信息
[wang@a ~]$ ll
...
-rw-rw-r-- 1 wang wang 0 Jul 18 13:45 centos7.txt
...

客户端 B

[root@b ~]$ vim /etc/fstab 
...
192.168.37.18:/home/wang	/home/wang		nfs		defaults		0 0
...
[root@b ~]$ mount -a
[root@b ~]$ su - wang
[wang@b ~]$ pwd
/home/wang
[wang@b ~]$ df
...
192.168.37.18:/home/wang
                     104806400 3888128 100918272   4% /home/wang
...

[wang@b ~]$ touch centos6.txt 
[wang@b ~]$ ll
total 0
-rw-rw-r-- 1 1000 1000 0 Jul 18  2022 centos6.txt
-rw-rw-r-- 1 1000 1000 0 Jul 18  2022 centos7.txt

NFS服务器

#可以看到'a','b'主机刚刚创建的文件
[root@18 ~]# ll /home/wang/
total 0
-rw-rw-r-- 1 wang wang 0 Jul  18 13:51 centos6.txt
-rw-rw-r-- 1 wang wang 0 Jul  18 13:45 centos7.txt

自动挂载

  1. 可使用autofs按需要挂载NFS共享,在空闲时自动卸载
  2. 由autofs包提供
  3. 系统管理器指定由/etc/auto.master自动挂载器守护进程控制的挂载点
  4. 自动挂载监视器访问这些目录并按要求挂载文件系统
  5. 文件系统在失活的指定间隔5分钟后会自动卸载
  6. 为所有导出到网络中的NFS启用特殊匹配 -host 至“browse”
  7. 参看帮助:man 5
  8. autofs 支持含通配符的目录名

* server:/export/& .

直接匹配
1. 直接匹配包括绝对路径名称 
2. 不会影响本地目录结构 
3. 示例: 
/etc/auto.master: 
/-				/etc/auto.direct <br>

/etc/auto.direct:    
/foo			server1:/export/foo
/user/local/	server1:/usr/local

实验2: autofs自动挂载(需yum安装autofs包)

NFS

#创建共享文件夹
[root@nfs ~]# mkdir /data/nfsdir1
#在共享文件夹中创建两个文件
[root@nfs ~]# touch /dta/nfsdir1/nfs1.txt
[root@nfs ~]# touch /dta/nfsdir1/nfs2.txt
#开启共享目录
[root@nfs ~]# vim /etc/exports
/data/nfsdir1 *(rw)			<--可设置相应权限

[root@nfs ~]# systemctl start nfs-server
[root@nfs ~]# systemctl enable nfs-server

客户机 A

方法1. 相对路径(如果存在共享的目录、会影响本地目录结构)

#相对路径
[root@a ~]# vim /etc/auto.master
...
/misc   /etc/auto.misc
/nfsdir1   /etc/test		<--
...
[root@a ~]# vim /etc/test 
nfs     -fstype=nfs  192.168.37.18:/data/nfsdir1

方法2. 绝对路径(推荐)

#绝对路径
[root@a ~]# vim /etc/auto.master 
...
/misc   /etc/auto.misc
/-      /etc/auto.test		<--

[root@a ~]# vim /etc/auto.test
/data/nfsdir1 -fstype=nfs 192.168.37.18:/data/nfsdir1
[root@a ~]# systemctl restart autofs

[root@a ~]# ls /misc/nfs/
nfs1.txt  nfs2.txt

小技巧

#只要知道某电脑IP/共享文件夹、即可临时服务、无需挂载
ls /net/IP地址/共享文件夹

cat /etc/auto.master
...
/net	-hosts	<--因为这个行、所以net能实现专门挂载设置
...

SAMBA服务简介

  1. SMB:Server Message Block服务器消息块,IBM发布,最早是DOS网络文 件共享协议
  2. CIFS:common internet file system,微软基于SMB发布
  3. SAMBA:1991年Andrew Tridgell,实现windows和UNIX相通
  4. SAMBA的功能:
  • 共享文件和打印,实现在线编辑

  • 实现登录SAMBA用户的身份认证

  • 可以进行NetBIOS名称解析

  • 外围设备共享

  1. 计算机网络管理模式:
  • 工作组WORKGROUP:计算机对等关系,帐号信息各自管理
  • 域DOMAIN:C/S结构,帐号信息集中管理,DC,AD

SAMBA介绍

  1. 相关包:
  • Samba 提供smb服务
  • Samba-client 客户端软件
  • samba-common 通用软件
  • cifs-utils smb客户端工具
  • samba-winbind 和AD相关
  1. 相关服务进程:
  • smbd 提供smb(cifs)服务 TCP:139,445
  • nmbd NetBIOS名称解析 UDP:137,138
  1. 主配置文件:/etc/samba/smb.conf
  • 帮助参看:man smb.conf
  1. 语法检查: testparm [-v] [/etc/samba/smb.conf]
  2. 客户端工具:smbclient,mount.cifs

SAMBA服务器

yum -y install samba
#创建三个用户
useradd -s /sbin/nologin smbuser1
useradd -s /sbin/nologin smbuser2
useradd -s /sbin/nologin smbuser3
#添加samba用户、设置密码 123.com
smbpasswd -a smbuser1
smbpasswd -a smbuser2
smbpasswd -a smbuser3
systemctl start smb

windows测试 在这里插入图片描述 在这里插入图片描述

#看看是有windows用户刚刚创建的文件信息
[root@centos7 ~]# ll /home/smbuser3/
total 4
drwxr-xr-x 2 smbuser3 smbuser3 6 Jul 20 02:10 新建文件夹
-rwxr--r-- 1 smbuser3 smbuser3 3 Jul 20 02:11 新建文本文档.txt

windows 切换用户 关闭连接窗口 windows+r输入cmd 在这里插入图片描述在这里插入图片描述

#查看samba用户列表
[root@centos7 ~]# pdbedit -L
smbuser1:1001:
smbuser3:1003:
smbuser2:1002:

#删除用户和密码
smbpasswd -x smbuser3

SAMBA服务器配置

smb.conf继承了.ini文件的格式,用[ ] 分成不同的部分

全局设置:

  • [global] 服务器通用或全局设置的部分 

特定共享设置:

  • [homes] 用户的家目录共享
  • [printers] 定义打印机资源和服务
  • [sharename] 自定义的共享目录配置

其中:#和;开头的语句为注释,大小写不敏感 宏定义: | %m 客户端主机的NetBIOS名 | %M 客户端主机的FQDN | |:--------:|:--------:| | %H 当前用户家目录路径 | %U 当前用户用户名 | | %g 当前用户所属组 | %h samba服务器的主机名 | | %L samba服务器的NetBIOS名 | %I 客户端主机的IP | |%T 当前日期和时间 | %S 可登录的用户名|

前提

SAMBA:37.7 CentOS7 客户端:37.6 CentOS6

SAMBA服务器

[root@samba ~]# vim /etc/samba/smb.conf
[global]
...
        log file = /var/log/samba/log.%m		#不同客户机采用不同日志
        log level = 2		#日志级别,默认为0,不记录日志
...

[root@samba ~]# systemctl start nmb
[root@samba ~]# systemctl start smb

共享某个文件夹

[root@samba ~]# mkdir /data/smbshare1
[root@samba ~]# touch /data/smbshare1/smb1.txt

结尾添加

[root@samba ~]# vim /etc/samba/smb.conf
...
[share]			#[共享名称] 远程网络看到的共享名称、名字随便不冲突即可
        path = /data/smbshare1		#所共享的目录路径
...

客户端

#            		       //远程主机ip/文件夹名称	用户名%密码
[root@centos6 ~]$ smbclient //192.168.37.7/share -U smbuser1%123.com
Domain=[SAMBA] OS=[Windows 6.1] Server=[Samba 4.8.3]
smb: \> ls		#看到创建的smb1.txt文件
  .                                   D        0  Wed Jul 20 02:44:40 2022
  ..                                  D        0  Wed Jul 20 02:44:27 2022
  smb1.txt                                     0  Wed Jul 20 02:44:40 2022

		51175 blocks of size 1048576. 51142 blocks available
smb: \> get smb1.txt 	#可下载
getting file \smb1.txt of size 0 as smb1.txt (0.0 KiloBytes/sec) (average 0.0 KiloBytes/sec)
smb: \> put smb2.txt 	#不可上传
NT_STATUS_ACCESS_DENIED opening remote file \smb2.txt

SAMBA服务器

设置可写

#上传需要设置共享文件夹权限、实验环境简单粗暴777
[root@samba ~]# chmod 777 /data/smbshare1/

[root@samba ~]# vim /etc/samba/smb.conf
...
[share]
        path = /data/smbshare1
        writable = yes		#设置可写
...

[root@samba ~]# systemctl restart smb

客户端

[root@centos6 ~]$ smbclient //192.168.37.7/share -U smbuser1%123.com
smb: \> !ls
anaconda-ks.cfg  Documents  install.log		Music	  Public    smb1.txt  Templates
Desktop		 Downloads  install.log.syslog	Pictures  reset.sh  smb2.txt  Videos
smb: \> put smb2.txt 	#上传文件
putting file smb2.txt as \smb2.txt (0.0 kb/s) (average 0.0 kb/s)
smb: \> ls				#上传成功
  .                                   D        0  Wed Jul 20 03:45:30 2022
  ..                                  D        0  Wed Jul 20 02:44:27 2022
  smb1.txt                                     0  Wed Jul 20 02:44:40 2022
  smb2.txt                            A        0  Wed Jul 20 03:45:30 2022

		51175 blocks of size 1048576. 51142 blocks available

SAMBA服务器

任何人可访问

[root@samba ~]# vim /etc/samba/smb.conf
...
[share]
        path = /data/smbshare1
        writable = yes
        public = yes		#是否允许任何人访问
...

[root@samba ~]# systemctl restart smb

客户端

#不需要密码、回车即可登陆
[root@centos6 ~]$ smbclient //192.168.37.7/share
#上传文件
smb: \> put smb3.txt

SAMBA服务器

#发现'smb3.txt'上传的身份是'nobody'
[root@samba ~]# ll /data/smbshare1/
total 0
-rw-r--r-- 1 root     root     0 Jul 20 02:44 smb1.txt
-rwxr--r-- 1 smbuser1 smbuser1 0 Jul 20 03:45 smb2.txt
-rwxr--r-- 1 nobody   nobody   0 Jul 20 03:58 smb3.txt

SAMBA服务器

加强安全性、特定用户可访问

[root@samba ~]# vim /etc/samba/smb.conf
[share]
        path = /data/smbshare1
        writable = yes
        #public = yes		#注释此行
        valid users = smbuser1 smbuser2	#特定用户可访问、sbmuser3不是有效用户


[root@samba ~]# systemctl restart smb

客户端

#用户smbuser1、smbuser2可连接。
[root@centos6 ~]$ smbclient //192.168.37.7/share -U smbuser1%123.com
Domain=[SAMBA] OS=[Windows 6.1] Server=[Samba 4.8.3]

smb: \> exit

#smbuser3不可连接
[root@centos6 ~]$ smbclient //192.168.37.7/share -U smbuser3%123.com
Domain=[SAMBA] OS=[Windows 6.1] Server=[Samba 4.8.3]
tree connect failed: NT_STATUS_ACCESS_DENIED

SAMBA服务器

针对特定人有效

[root@samba ~]# vim /etc/samba/smb.conf
...
[share]
        path = /data/smbshare1
        writable = no				#可写选项改为no
        #public = yes
        valid users = smbuser1 smbuser2
        write list = smbuser1		#针对特定人有效。三种形式:用户,@组名,+组名,用','分隔
...

[root@samba ~]# systemctl restart smb

客户端

#可上传下载
[root@centos6 ~]$ smbclient //192.168.37.7/share -U smbuser1%123.com
#可下载不能上传
[root@centos6 ~]$ smbclient //192.168.37.7/share -U smbuser2%123.com

客户端

设置隐藏共享文件夹

#-L查看他的共享、可看到share
[root@centos6 ~]$ smbclient -L 192.168.37.7
Enter root's password: 
Anonymous login successful
Domain=[SAMBA] OS=[Windows 6.1] Server=[Samba 4.8.3]

	Sharename       Type      Comment
	---------       ----      -------
	print$          Disk      Printer Drivers
	share           Disk      								#可看到share共享文件夹
	IPC$            IPC       IPC Service (Samba 4.8.3)
Anonymous login successful
Domain=[SAMBA] OS=[Windows 6.1] Server=[Samba 4.8.3]

	Server               Comment
	---------            -------
	CENTOS7              Samba 4.8.3

	Workgroup            Master
	---------            -------
	SAMBA                CENTOS7

SAMBA服务器

[root@samba ~]# vim /etc/samba/smb.conf
...
[share]
        path = /data/smbshare1
        writable = no
        #public = yes
        valid users = smbuser1 smbuser2
        write list = smbuser1
        browsable = no			#隐藏共享文件夹
...

[root@samba ~]# systemctl restart smb

客户端

#-L查看他的共享、看不到share隐藏了
[root@centos6 ~]$ smbclient -L 192.168.37.7
Enter root's password: 		#回车
Anonymous login successful
Domain=[SAMBA] OS=[Windows 6.1] Server=[Samba 4.8.3]

	Sharename       Type      Comment
	---------       ----      -------
	print$          Disk      Printer Drivers
	IPC$            IPC       IPC Service (Samba 4.8.3)
Anonymous login successful
Domain=[SAMBA] OS=[Windows 6.1] Server=[Samba 4.8.3]

	Server               Comment
	---------            -------
	CENTOS7              Samba 4.8.3

	Workgroup            Master
	---------            -------
	SAMBA                CENTOS7

#需要知道隐藏目录名称'share'、且知道用户账号密码、即可登陆
[root@centos6 ~]$ smbclient //192.168.37.7/share -U smbuser1%123.com

SAMBA服务器

目录描述、告诉我这个目录干什么的

[root@samba ~]# vim /etc/samba/smb.conf
...
[share]
        comment = testdir		#目录描述
        path = /data/smbshare1
        writable = no
        #public = yes
        valid users = smbuser1 smbuser2
        write list = smbuser1
        #browsable = no			#注释掉
 ...
        
[root@samba ~]# systemctl restart smb
[root@centos6 ~]$ smbclient -L 192.168.37.7
Enter root's password: 	#回车
Anonymous login successful
Domain=[SAMBA] OS=[Windows 6.1] Server=[Samba 4.8.3]

	Sharename       Type      Comment
	---------       ----      -------
	print$          Disk      Printer Drivers
	share           Disk      testdir			#testdir 注释信息
	IPC$            IPC       IPC Service (Samba 4.8.3)
Anonymous login successful
Domain=[SAMBA] OS=[Windows 6.1] Server=[Samba 4.8.3]

	Server               Comment
	---------            -------
	CENTOS7              Samba 4.8.3

	Workgroup            Master
	---------            -------
	SAMBA                CENTOS7

SAMBA服务器

[root@samba ~]# vim /etc/samba/smb.conf
...
[share]
        comment = testdir
        path = /data/smbshare1
        writable = no
        #public = yes
        valid users = @smbgroup		#组名、用户名设置
        write list = smbuser1
        #browsable = no
...

#创建组
[root@samba ~]# groupadd smbgroup
#添加用户到组
[root@samba ~]# usermod -aG smbgroup smbuser1
[root@samba ~]# usermod -aG smbgroup smbuser2
[root@samba ~]# usermod -aG smbgroup smbuser3
#列出组成员
[root@samba ~]# groupmems -l -g smbgroup
smbuser1  smbuser2  smbuser3 
[root@samba ~]# systemctl restart smb

实验3:挂载CIFS文件系统

客户端

#创建挂载目录
[root@centos6 ~]$ mkdir /mnt/smbshare
#挂载需要cifs-util包
[root@centos6 ~]$ rpm -qf `which mount.cifs`
cifs-utils-4.8.1-20.el6.x86_64

#临时挂载、因为版本太低需要加上'sec=ntlmssp'
[root@centos6 ~]$ mount -o sec=ntlmssp,username=smbuser1,password=123.com //192.168.37.7/share /mnt/smbshare/
#可以看到挂载目录中的文件信息
[root@centos6 ~]$ ll /mnt/smbshare/
#永久挂载
[root@centos6 ~]$ vim /etc/fstab 
//192.168.37.7/share    /mnt/smbshare   cifs    sec=ntlmssp,credentials=/etc/smb.txt  0 0

远程主机用户名、密码写到文件中

[root@centos6 ~]$ vim /etc/smb.txt
username=smbuser1
password=123.com
#为了安全给用户密码文件、添加权限
[root@centos6 ~]$ chmod 600 /etc/smb.txt
[root@centos6 ~]$ touch /mnt/smbshare/xx.txt
[root@centos6 ~]$ ll /mnt/smbshare/
...
-rw-r--r-- 1   1001   1001     0 Jul 20 10:35 xx.txt
...

实验4:基于autofs挂载samba共享

[root@centos6 ~]$ vim /etc/auto.master
...
/misc   /etc/auto.misc
/-      /etc/auto.test		#绝对路径
...

[root@centos6 ~]$ vim /etc/auto.test
/mnt/smbshare 	-fstype=cifs,sec=ntlmssp,credentials=/etc/smb.txt  ://192.168.37.7/share

[root@centos6 ~]$ vim /etc/smb.txt
username=smbuser1
password=123.com

#注意密码文件权限
[root@centos6 ~]$ chmod 600 /etc/smb.txt
[root@centos6 ~]$ service autofs restart
#tab自动补、显示了远程文件夹
[root@centos6 ~]$ ll /mnt/
total 0
drwxr-xr-x 2 root root 0 Jul 20 11:08 smbshare

SAMBA服务器

针对不同用户、访问的文件夹是不一样的

[root@samba ~]# vim /etc/samba/smb.conf
...
[global]
        config file = /etc/samba/conf.d/%U	#用户独立的配置文件信息路径

[share]
        comment = testdir
        path = /data/smbshare1
        writable = no
        #public = yes
        valid users = @smbgroup
        #write list = smbuser1
        #browsable = no
...

[root@samba ~]# mkdir /etc/samba/conf.d
#针对smbuser2
[root@samba ~]# vim /etc/samba/conf.d/smbuser2
[share]
comment=testdir2
path=/data/smbshare2		#共享目录
writable=yes
#public=yes

#建立'smbshare2用户'共享目录
[root@samba ~]# mkdir /data/smbshare2
[root@samba ~]# touch /data/smbshare2/share2.txt
#权限设置、实验环境简单粗暴777
[root@samba ~]# chmod 777 /data/smbshare2

[root@samba ~]# systemctl restart smb

客户端

[root@centos6 ~]$ smbclient -L 192.168.37.7 -U smbuser1%123.com
Domain=[SAMBA] OS=[Windows 6.1] Server=[Samba 4.8.3]

	Sharename       Type      Comment
	---------       ----      -------
	print$          Disk      Printer Drivers
	share           Disk      testdir			<--testdir
	IPC$            IPC       IPC Service (Samba 4.8.3)
	smbuser1        Disk      Home Directories
Domain=[SAMBA] OS=[Windows 6.1] Server=[Samba 4.8.3]
...

[root@centos6 ~]$ smbclient -L 192.168.37.7 -U smbuser2%123.com
Domain=[WORKGROUP] OS=[Windows 6.1] Server=[Samba 4.8.3]

	Sharename       Type      Comment
	---------       ----      -------
	share           Disk      testdir2			<--testdir2
	IPC$            IPC       IPC Service (Samba 4.8.3)
	smbuser2        Disk      Home Directories
Domain=[WORKGROUP] OS=[Windows 6.1] Server=[Samba 4.8.3]
...

SAMBA服务器

针对不同用户访问同一个目录权限不一样

#针对smbuser2用户
[root@samba ~]# vim /etc/samba/conf.d/smbuser2
[share]
comment=testdir2
path=/data/smbshare2
writable=yes
#public=yes

#针对smbuser3用户
[root@samba ~]# vim /etc/samba/conf.d/smbuser3
[share]
comment=testdir3		#说明不一样
path=/data/smbshare2	#访问的文件夹一样
writable=no				#读写权限
#public=yes

[root@samba ~]# systemctl restart smb

客户端

#smbuser2用户:可上传下载
smbclient //192.168.37.7/share -U smbuser2%123.com
#smbuser3用户:不能上传、能下载
smbclient //192.168.37.7/share -U smbuser3%123.com

数据的实时同步

实现实时同步

  • 要利用监控服务(inotify),监控同步数据服务器目录中信息的变化
  • 发现目录中数据产生变化,就利用rsync服务推送到备份服务器上

实现实时同步的方法

  • inotify+rsync 方式实现数据同步
  • sersync :金山公司周洋在 inotify 软件基础上进行开发的,功能更加强大

inotify:

  • 异步的文件系统事件监控机制,利用事件驱动机制,而无须通过诸如cron等的轮询机制来获取事件,linux内核从2.6.13起支持 inotify,通过inotify可以监控文件系统中添加、删除,修改、移动等各种事件

实现inotify软件:

  • inotify-tools,sersync,lrsyncd

inotify和rsync实现实时同步

notify+rsync使用方式

  • inotify 对同步数据目录信息的监控
  • rsync 完成对数据的同步
  • 利用脚本进行结合

inotifywait命令常见选项:

-m, --monitor 始终保持事件监听

-d, --daemon 以守护进程方式执行,和-m相似,配合-o使用

-r, --recursive 递归监控目录数据信息变化

-q, --quiet 输出少量事件信息

--exclude 指定排除文件或目录,使用扩展的正则表达式匹配的模式实现

--excludei 和exclude相似,不区分大小写

-o, --outfile 打印事件到文件中,相当于标准正确输出

-s, --syslogOutput 发送错误到syslog相当于标准错误输出  --timefmt 指定时间输出格式

--format 指定的输出格式;即实际监控输出内容

-e 指定监听指定的事件,如果省略,表示所有事件都进行监听

-e 选项指定的事件类型

  • create 文件或目录创建
  • delete 文件或目录被删除
  • modify 文件或目录内容被写入
  • attrib 文件或目录属性改变
  • close_write 文件或目录关闭,在写入模式打开之后关闭的
  • close_nowrite 文件或目录关闭,在只读模式打开之后关闭的
  • close 文件或目录关闭,不管读或是写模式
  • open 文件或目录被打开
  • moved_to 文件或目录被移动到监控的目录中
  • moved_from 文件或目录从监控的目录中被移动
  • move 文件或目录不管移动到或是移出监控目录都触发事件
  • access 文件或目录内容被读取
  • delete_self 文件或目录被删除,目录本身被删除
  • unmount 取消挂载

示例:

  • -e create,delete,moved_to,close_write, attrib

备份ssk-key验证

#创建备份文件夹
[root@b ~]# mkdir -pv /data/backup
#-av保留属性 复制数据
[root@b ~]# rsync -av 192.168.37.7:/data/* /data/backup
#基于key验证、以后不用输入密码
[root@b ~]# ssh-keygen 
[root@b ~]# ssh-copy-id 192.168.37.7

实验5:inotify+rsync脚本(实时同步)

前提

inotify 37.7 rsync 37.18

inotify

[root@inotify ~]# yum install inotify-tools -y

#创建数据文件夹、
[root@inotify ~]# mkdir /data/www
#导入数据
[root@inotify ~]# cp /etc/fstab /data/www/f1.txt
[root@inotify ~]# cp /etc/fstab /data/www/f2.txt

rsync

[root@rsync ~]# 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 = 192.168.37.0/24
[backup]
path = /backup/
comment = backup
read only = no
auth users = rsyncuser
secrets file = /etc/rsync.pass

生成验证文件

[root@rsync ~]# echo "rsyncuser:123.com" > /etc/rsync.pass

权限设置(为了安全)

[root@rsync ~]# chmod 600 /etc/rsync.pass

准备目录

 [root@rsync ~]# mkdir /backup

启动rsync服务

[root@rsync ~]# systemctl start rsyncd

inotify

[root@inotify ~]# echo "123.com" > /etc/rsync.pass
[root@inotify ~]# chmod 600 /etc/rsync.pass

同步数据

#拷贝文件的时候/data/www/目录结尾处、要加'/'、不加’/‘会把整个目录拷贝过去
[root@inotify www]# rsync -avz --password-file=/etc/rsync.pass /data/www/ rsyncuser@192.168.37.18::backup/

rsync

同步

[root@rsync ~]# ls /backup
f1.txt  f2.txt

inotify

监控脚本

[root@inotify ~]# vim inotify_rsync.sh

#!/bin/bash
SRC='/data/www/'
DEST='rsyncuser@192.168.37.18::backup'
inotifywait -mrq --timefmt '%Y-%m-%d %H:%M' --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.pass $SRC $DEST && echo "At ${TIME} on ${DATE}, file $FILEPATH was backuped up via rsync" >> /var/log/changelist.log
done

#加执行权限
[root@inotify ~]# chmod +x inotify_rsync.sh
[root@inotify ~]# ./inotify_rsync.sh

rsync

在这里插入图片描述 测试! 在这里插入图片描述