@[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服务器
[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
自动挂载
- 可使用autofs按需要挂载NFS共享,在空闲时自动卸载
- 由autofs包提供
- 系统管理器指定由/etc/auto.master自动挂载器守护进程控制的挂载点
- 自动挂载监视器访问这些目录并按要求挂载文件系统
- 文件系统在失活的指定间隔5分钟后会自动卸载
- 为所有导出到网络中的NFS启用特殊匹配 -host 至“browse”
- 参看帮助:man 5
- 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服务简介
- SMB:Server Message Block服务器消息块,IBM发布,最早是DOS网络文 件共享协议
- CIFS:common internet file system,微软基于SMB发布
- SAMBA:1991年Andrew Tridgell,实现windows和UNIX相通
- SAMBA的功能:
共享文件和打印,实现在线编辑
实现登录SAMBA用户的身份认证
可以进行NetBIOS名称解析
外围设备共享
- 计算机网络管理模式:
- 工作组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
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
测试!