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	ools:共享,共享名(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
原文地址:https://www.cnblogs.com/zhangchaocoming/p/14923044.html