Linux_27 ftp、nfs、samba
ftp
I/O:网络、存储
存储:
DAS:Direct Attached Storage
接口类型:"block"
设备:SATA,SAS;IDE,SCSI;USB;
NAS:Network Attached Storage
接口类型:"file"
协议:CIFS(samba),NFS(Network File System)
RPC:Remote Procedure Call
SAN:Storage Area Network
接口类型:"block"
协议:ISCSI(IP-SAN),FCSAN,FCoE,...
应用层:
ftp,...
文件服务:ftp,cifs/nfs
ftp:
ftp:file transfer protocol,文件传输协议;
两类连接:
命令连接:传输命令
数据连接:传输数据
两种模式:
主动模式:PORT
Server:20/tcp连接客户端的命令连接使用的端口向后的第一个可用端口;
被动模式:PASV
Server:打开一个随机端口,并等待客户端连接
rpm -qf /usr/bin/login # 查看某个命令属于哪个安装包
util-linux-2.23.2-65.el7_9.1.x86_64
rpm -ql util-linux # 查看安装包内的文件
PAM:Pluggable Authenticate Module
认证框架:库,高度模块化;
rpm -ql pam
/etc/pad.d # 下图1
协议:C/S
Server:
Windows:Serv-U,IIS,Filezilla
开源:wuftpd,proftpd,pureftpd,vsftpd(Very Secure FTP daemon),...
Client:
Windows:ftp,Filezilla,CuteFTP,FlashFXP,...
开源:lftp,ftp,Filezilla,gftp,...
vsftpd:
vsftpd is a Very Secure FTP daemon. It was written completely from scratch.
UTL:
SCHEME://username:password@HOST:PORT/PATH/TO/FILE
路径映射:
用户家目录:每个用户的URL的/映射到当前用户的家目录;
vsftpd以ftp用户的身份运行进程,默认用户即为ftp用户,匿名用户的默认路径即ftp用户的家目录/var/ftp
ftp,anonymous
注意:一个用户通过文件共享服务访问文件系统上的文件的生效权限为此二者的交集;
程序环境:
主程序:/usr/sbin/vsftpd
主配置文件:/etc/vsftpd/bsftpd.conf
数据根目录:/var/ftp
Systemd Unit File:/usr/lib/systemd/system/vsftpd.service
配置vsftpd:
用户类别:
匿名用户:anonymous-->ftp,/var/ftp
系统用户:至少禁止系统用户访问ftp服务,/etc/vsftpd/ftpusers,PAM(/etc/pad.d/vsftpd);
虚拟用户:非系统用户,用户账号非为可登录操作系统的用户账号(非/etc/passwd);
用户通过vsftpd服务访问到的默认路径,是用户自己的家目录;默认可以自己有权限访问的所有路径间切换;
用户通过vsftpd服务访问到的默认路径,是用户自己的家目录;默认可以自己有权限访问的所有路径间切换;
禁锢用户与其家目录中;
配置文件:
/etc/vsftpd/vsftpd.conf
directive value
注意:directive之前不能有多余字符;
man vsftpd.service
匿名用户: # ftp用户,就是ftp服务的匿名账号,不需要密码也能登录
# 4个服务的共享权限,还要有文件系统权限,两者是交集的,才能实现文件即目录的操作。
anonymous_enable=YES
anon_upload_enable=YES # 允许用户上传文件到vsftld服务上
cd /var/ftp
mkdir upload
chown ftp:ftp /var/ftp/upload
在192.168.1.9机器上,连接到192.168.1.8这台机器的vsftpd服务上:
cd /etc/
lftp 192.168.1.8
ls
drwxr-xr-x 2 0 0 19 Jun 19 08:58 pub
drwxr-xr-x 2 14 50 6 Jun 19 11:39 upload
cd upload
put issue # 把192.168.1.9机器上/etc/issue文件上传到192.168.1.8机器上的共享文件系统上。
在192.168.1.8机器上:
cd /var/ftp/upload
ll
-rw------- 1 ftp ftp 23 Jun 19 19:43 issue
anon_mkdir_write_enable=YES # 允许用户在登录ftp服务时在指定目录中创建目录,如图3
anon_other_write_enable=YES
anon_umask=077
系统用户:
local_enable=YES # 是否允许本地用户访问ftp服务
write_enable=YES # 是否允许本地用户拥有写权限
local_umask=022
辅助配置文件 /etc/vsftpd/ftpusers;
列在此文件中的用户,均禁止使用ftp服务;
chtoot_local_user=YES
禁锢所有本地用户于其家目录;需要事先去除用户对家目录的写权限;
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
禁锢列表中文件存在的用户于其家目录中(将用户锁在自己的家目录下 ,禁止其访问家目录之外的其它目录);需要事先去除用户对家目录的写权限;
eg:
for i in {1..5};do useradd user$i;echo user$i | passwd --stdin user$i;done
ls /home/user2 -ld # 属主默认有写权限
drwx------ 2 user2 user2 62 Jun 21 18:00 /home/user2
# 去除用户的写权限
chmod a-w /home/user1
chmod a-w /home/user2
vim /etc/vsftpd/chroot_list
添加:user1,user2
vim /etc/vsftpd/vsftpd.conf
取消注释的两行 # 如下图4
systemctl restart vsftpd
ftp 192.168.1.8
输入我们限制的用户:user1和user2 及其密码登录,再次切换目录,已被限制,如图5;
图1:
安装使用vsftpd服务端,浏览器请求,没有任何响应:
解决办法:
谷歌、火狐、Edge默认不支持 FTP,谷歌浏览器地址栏输入:chrome://flags/#enable-ftp,修改为enabled。就行了
如下图:
图3:
lftp客服端相关的命令:
mkdir tesetdir # 创建目录
put fstab #上传文件,上传的文件,ls 可能自己看不到
rm fstab # 删除文件
rmdir testdir # 删除目录
图4:
图5:
传输日志:# 一般不启用,上传下载生成的日志速度过快。
xferlog_enable=YES
xferlog_file=/var/log/xferlog
xferlog_std_format=YES
守护进程的类型:
standalone:独立守护进程;由服务进程自行监听套接字,并接受用户访问请求;
translent:瞬时守护进程;由受托管方代为监听套接字,服务进程没有访问请求时不启动;当托管方收到访问请求时,才启动服务进程;
CentOS6:xinetd独立守护进程,/etc/xinetd.d/
CentOS7:由systemd代为监听;
控制可登录vsftpd服务的用户列表: # 如图6
userlist_enable=YES
userlist_deny= # vim /etc/vsftpd.conf文件中添加此行
YES:意味着此为黑名单;
NO:白名单;
启用/etc/vsftpd/user_list文件来控制可登录用户:
比如:只允许user1和user2用户登录:# 如图7
vim /etc/vs/ftpd/user_list
图6:
图7:
上传下载速率:
anon_max_rate= # 上传下载的最大速率,默认为0,表示无限制
local_max_rate=0
并发连接数限制:
max_clients: #最大并发连接数
Default:2000
max_per_ip: # 单个ip最多可以起多少个ftp连接
Default:50
虚拟用户:
用户账号存储于何处?
文件、MySQL、Redis、...
vsftpd:认证功能托管给pam;
基于何种存储服务来存储用户信息,以及对存储服务的驱动要靠pam实现;
pam_mysql:
# yum install mariadb-devel pam-devel
下载pam_mysql的源码包:https://sourceforge.net/projects/pam-mysql/
tar xf pam_mysql-0.7RC1.tar.gz
cd pam_mysql-0.7RC1
./configure --with-mysql --with-pam=/usr --with-pam-mods-dir=/usr/lib64/security
make && make install
ls /usr/lib64/security
发现 pam-mysql.so模块已经被安装 # 如图8
创建数据库、授权用户、创建账号和密码:
提供配置文件:/etc/pam.d/vsftpd.vusers
# 检查密码是否正确
auth required /usr/lib64/security/pam_mysql.so user=vsftpd passwd=vsftpd host=127.0.0.1 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
/usr/lib64/security/pam_mysql.so: # 表示使用哪一个模块认证
# 检查账号是否在有效期内
account required /usr/lib64/security/pam_mysql.so user=vsftpd passwd=vsftpd host=127.0.0.1 db=vsftpd table=users userclolumn=name passwdcolumn=password crypt=2
配置vsftpd,添加或修改以下选项:
pam_service_name=vsftpd.vusers
guest_enable=YES # 将ftp的虚拟账号映射为mysql中的来宾账号
guest_username=vuser # 被映射为mysql来宾账号名为 vuser
虚拟用户的写权限,通过匿名一样的指令进行定义;
还能实现不同的用户有不同的权限;
user_config_dir=/etc/vsftpd/vusers_config
eg:
vim /etc/my.cnf.d/server.cnf
# 在[mysqld]下添加如下参数:
skip_name_resolve=ON
innodb_file_per_table=ON
log_bin=mysql-bin
systemctl start mariadb.service
mysql
# 授权一个账号拥有远程连接的权限
GRANT ALL ON vsftpd.* TO vsftpd@'127.0.0.1' IDENTIFIED BY 'vsftpd';
FLUSH PRIVILEGES;
exit
# 用新添加的账号连接:
mysql -uvsftpd -h'127.0.0.1' -pvsftpd
create databases vsftpd;
use vsftpd;
create table users(id int not null auto_increment primary key,name varchar(100) not null,password char(48) not null,unique key(name));
desc users;
insert into users(name,password) values ('tom',password('tom123')),('jerry',password('jerry123'));
mkdir /ftproot
useradd -d /ftproot/vuser vuser
mkdir /ftproot/vuser/pub
vim /etc/pam.d/vsftpd.vusers
# 检查密码是否正确
auth required /usr/lib64/security/pam_mysql.so user=vsftpd passwd=vsftpd host=127.0.0.1 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
# 检查账号是否在有效期内
account required /usr/lib64/security/pam_mysql.so user=vsftpd passwd=vsftpd host=127.0.0.1 db=vsftpd table=users userclolumn=name passwdcolumn=password crypt=2
cd /etc/vsftpd
mv vsftpd.conf{,.v1}
cp vsftpd.conf.bak vsftpd.conf
vim vsftpd.conf
修改:
pam_service_name=vsftpd 为 vsftpd.vusers
添加:
guest_enable=YES # 允许来宾账号访问
guest_username=vuser # 并指名来宾账号为vuser
systemctl restart vsftpd
# 在192.168.1.9机器上,使用ftp连接192.168.1.8上的vsftpd服务
ftp 192.168.1.8
# 通过pam_mysql模块连接数据库进行登录认证,正是我们上面插入数据库的用户tom 和jerry
报错:# 如图10
500 OOPS: vsftpd: refusing to run with writable root inside chroot()
Login failed.
421 Service not available, remote server has closed connection
需要去除/ftproot/vuser目录的写权限:# 在192.168.1.8机器上
chmod a-w /ftproot/vuser
重新连接vsftpd(在192.168.1.9机器上):
ftp 192.168.1.8
输入tom和jerry用户能正常登录了
# 在192.168.1.8机器上:
mkdir /ftproot/vuser/upload
chown vuser.vuser /ftproot/vuser/upload
# 修改虚拟用户有写权限;
vim /etc/vsftpd/vsftpd.conf
添加参数:
user_config_dir=/etc/vsftpd/vusers_config
mkdir /etc/vsftpd/vusers_config
vim /etc/vsftpd/vusers_config/tom # 在/etc/vsftpd/vusers_config目录下编辑一个与用户同名的文件
添加参数:
anon_upload_enable=YES # 表示tom用户拥有上传功能
cp /etc/vsftpd/vusers_config/tom /etc/vsftpd/vusers_config/jerry
anon_upload_enable=YES # 表示jerry用户拥有上传功能
anon_mkdir_write_enable=YES
systemctl restart vsftpd
# 在192.168.1.9机器上:
ftp 192.168.1.8
输入tom或jerry用户
cd upload
put issue
图8:
图9:
图10:
nfs
NFSv2,NFSv3,NFSv4;
nfsd:2049/tcp
辅助类的服务:rpc,portmapper
rpc.mountd:认证;
rpc.lockd:加锁;
rpc.statd:状态;
rpc:remote procedure call
NFS Server:
nfs-utils:
The nfs-utils package provides a daemon for the kernel NFS server and related tools, which provides a much higher level of performance than the traditional Linux NFS server used by most users.
/etc/exports或者/etc/exports.d/*
/PATH/TO/SOME_DIR clients1(export_options,...)clients2(export_options,...)
clients:
single host:ipv4,ipv6,FQDN;
network:address/netmask,同时长短格式的掩码;
wildcards:主机名通配,例如:*.sanzhang.com;
netgroups:NIS域内的主机组;@group_name;
anonymous:使用*通配所有主机;
General Options:
ro:只读
rw:读写;
sync:同步;
async:异步;
secure:客户端端口小于1024,否则就要使用insecure选项;
User ID Mapping:
root_squash:压缩root用户,一般指将其映射为nfsnobody;
no_root_squash:不压缩root用户;
all_squash:压缩所有用户;
anonuid and anongid:将压缩的用户映射为此处指定的用户;
NFS Client:
mount -t nfs servername:/path/to/share /path/to/mount_point [-rvVwfnsh][-o options]
# exportfs -ar
# exportfs -au
showmount -show mount information for an NFS server
showmount -e NFS_SERVER_IP:查看指定的nfs server 上导出的所有文件系统;
其它参考文档:
nfs安装及使用
yum -y install nfs-utils rpcbind
rpm -ql nfs-utils
/usr/lib/systemd/system/nfs.service # nfs的服务端 systemctl start nfs.service
usr/lib/systemd/system/nfs-lock.service
/usr/lib/systemd/system/rpc-statd.service
/usr/lib/systemd/system/nfs-mountd.service
配置文件:/etc/exports 默认此文件为空,需手动添加
主配置文件书写格式: Export HOST(Options) Export:共享的目录 HOST:主机地址 Options:选项
Options:
rw: #读写权限
ro: #只读权限
secure: #要求客户端请求端口小于1024默认开启
insecure: #NFS通过1024以上的端口发送
async: #异步写入,性能好,数据可靠性差
sync: #同步写入,性能差,数据可靠性高
wdelay: #写入延迟
no_wdelay: #不做写入延迟
hide: #在NFS共享目录中不共享其子目录
nohide: #共享NFS目录的子目录
crossmnt: #交叉挂载
no_acl: #关闭nfs支持acl功能
root_squash: #压缩root用户权限为nfsnobody
no_root_squash: #不压缩root用户的权限
all_squash: #所有的用户都压缩权限
anonuid=nfsuser,anongid=nfsgroup: #指定用户帐号做匿名用户帐号
服务端使用的命令:
showmount
-a: 显示当前主机所共享的NFS文件系统中,有哪些已经被客户端挂载
-d: 显示当前主机所共享的NFS文件系统中,每个挂载连接
-e NFS_SERVER_IP:查看指定的nfs server上导出的所有文件系统;
exportfs:maintain table of exported NFS file systems
-r: 重新导出
-a: 操作所有文件系统
-u: 取消导出
-v: 显示详细信息
-ra:重新共享所有目录
-au:卸载所有共享目录
rpcinfo
-p: 查看NFS注册使用的端口
ss -lnt
rpc.mountd的端口有可能会改变,半随机的,如果要改成固定的,修改/etc/sysconfig/nfs文件:
修改参数:
RPCMOUNTDOPTS="" 为一个固定的端口
配置一个nfs文件系统
准备两台主机:192.168.1.8 192.168.1.9
分别安装以下安装包:
yum install nfs-utils rpcbind -y
systemctl start nfs.service # 启动nfs服务
在192.168.1.8机器上:
创建一个目录:
mkdir -pv /data/mysql
编辑/etc/exports文件
添加:
/data/mysql 192.168.1.9(rw) 192.168.1.0/24(ro)
重启nfs服务:
systemctl restart nfs.service
在192.168.1.9机器上:
showmout -e 192.168.1.8 # Show the NFS server's export list. 如下图1
# 挂载192.168.1.8机器上的/data/mysql目录到本地(192.168.1.9)的/mnt下
mount -t nfs 192.168.1.8:/data/mysql /mnt
或者:
mount.nfs 192.168.1.8:/data/mysql /mnt # man mount.nfs
mount # 查看/data/mysql的挂载信
192.168.1.8:/data/mysql on /mnt type nfs(rw,relatime,vers=4.1,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=192.168.1.9,local_lock=none,addr=192.168.1.8)
图1:
samba
smb:Service message block
cifs:common internet filesystem
samba:Andrew Tridgell;
功能:
文件系统共享;
打印机共享;
NetBIOS协议;
peer/peer(workgroup model)
domain model
程序环境:
服务端程序包:samba,samba-common,samba-libs
Server and Client software to interoperate with Windows machines.
主配置文件:/etcsamba/smb.conf,有samba-common包提供;
主程序:
nmbd:NetBIOS name server
smbd:SMB/CIFS services
Unit File:
smb.service
nmb.service
监听的端口:
137/udp,138/udp
139/tcp,445/tcp
主配置文件的配置段:
grep -E -i "#(===| ---)" /etc/samba/smb.conf
#=====================Global Settings=========================
# -----------------Network-Related Options----------------
# -----------------Logging Options-----------------
# -----------------Standalone Server Options ---------------
# ------------------Domain Members Options------------------
# ------------------Domain Controller Options-------------------
# ------------------Browser Control Options ---------------------
# ---------------------Printing Options ------------------------
# -----------------------File system Options --------------------
#============================Share Definitions========================
d:\data\tools:共享,共享名(software)
servicename:
//192.168.1.8/software
客户端程序:
smbclient:交互式命令行客户端,类似于lftp;
mount.cifs:挂载cifs文件系统的专用命令;
samba的配置:
smb.conf
两类配置段:
全局配置:
[global]
Network-Related Options
workgroup =
server string =
interfaces = lo eth0 192.168.1.8/24
hosts allow = 127. 192.168.1.
Logging Options
log file = /var/log/samba/log.%m
max log size = 50
Standalone Server Options
security = user
设定安全级别:取值有四个:
share:匿名共享;
user:使用samba服务自我管理的账号和密码进行用户认证;用户必须是系统用户,但密码非为/etc/shadow中的密码,而由samba自行管理的文件,其密码文件的格式由passdb backend进行定义;
server:由第三方服务进行统一认证;
domain:使用DC进行认证;基于kerberos协议进行;
passdb backend = tdbsam
Printing Options
load printers = yes
cups options = raw
共享文件系统配置
[SHARED_NAME]
有三类:
[homes]:为每个samba用户定义其是否能够通过samba服务访问自己的家目录;
[printers]:定义打印服务;
[share_fs]:定义共享的文件系统;
常用指令:
comment:注释信息;
path:当前共享所映射的文件系统路径;
browseable:是否可浏览,指是否可被用户查看;
guest ok:是否允许来宾账号访问;
public:是否公开所有用户;
writable:是否可写;
write list:拥有写权限的用户列表;
用户名
@组名
+组名
samba 用户管理:
smbpasswd
smbpasswd [options] USERNAME
-a:添加
-x:删除
-d:禁用
-e:启用
pdbedit
-L:列出samba服务中的所有用户;
-a,--create:添加用户为samba用户;
-u,--user=USER:要管理的用户;
-x,--delete:删除用户;
-t,--password-from-stdin:从标准输出接收字符串作为用户密码;
使用空提示符,而后将密码输入两次;
查看服务器端的共享:
smbclient -L SMB_SERVER [-U USERNAME]
交互式文件访问:
smbclient //SMB_SERVER/SHARE_NAME [-U USERNAME]
挂载访问:
mount -t cifs //SMB_SERVER/SHARE_NAME -o username=USERNAME,password=PASSWORD
注意:挂载操作的用户,与-o选项中指定用户直接产生映射关系;
此时,访问挂载点,是以-o选项中的username指定的身份进行;本地用户对指定的路径访问,首先得拥有对应得本地文件系统权限;
smbstatus命令:
显示samba服务得相关共享得访问状态信息:
-b:显示简要格式信息;
-v:显示详细格式信息;
samba服务的使用,类似于ftp服务,使用smbclient客户端连接:
yum whatprovides smbclient
yum install -y samba-client
smbclient -h # 查看smbclient命令的帮助
samba服务配置文件参数及使用
配置文件:/etc/samba/smb.conf
testparm # samba服务自带的测试配置文件的格式的命令,可以通过 man samba查看
systemctl start nmb.service smb.service
可以在另外一台机器(192.168.1.9)安装subclient命令连接samba服务:
yum install -y samba-client
subclient -L 192.168.1.8 # 匿名用户访问
在192.168.1.8机器上创建一个可以访问samba服务的账号:
useradd smbuser1
smbpasswd -a smbuser1 # -a 表示将用户添加为samba用户,然后就能访问自己家目录中的文件
smbpasswd -h # 查看帮助
smbclient -L 192.168.1.8 -U smbuser1 # samba用户登录 如下图1
smbclient //192.168.1.8/smbuser1 -U smbuser1 # samba用户登录到自己的家目录
登录到sambauser1用户家目录后,可以进行上传下载操作了:# 如下图2
图1:
图2:
创建一个共享
在192.168.1.8机器上:
mkdir /data/samba/files
vim /etc/samba/smb.conf
添加:
[myfiles]
comment = A test shared dir.
path = /data/samba/files
public = yes
writable = yes
browseable = yes