应用层(通常可以跨平台):ftp

内核(作为内核的子系统工作的):nfs,很难跨平台。

跨平台samba:在linux实现cifs(smb公用信息块) 协议,

如今网络上有三种存储

DAS 直接附加存储(直接附加在主板上的存储)

NAS 网络附加存储,网络服务器提供共享存储  nfs和samba实现的cifs协议其实就是NAS的一种实现

市面上很多NAS专业级的存储设备无非就是优化了内核和背后支持的cifs/nfs的服务器而已

SAN 通过块级别协议将文化存储在远程的共享存储中的,与NAS不同的是,SAN是块级别,NAS工作在应用层协议的,而SAN则是工作在内核模式下的。

对于SAN来说,拿到后得需要分区,格式化等等,的、而对于NAS则可以拿来直接使用。.0

 

FTP:文件传输协议,基于TCP工作,应用层协议。基于socket模式进行通信,基于应用层协议的请求和响应来实现客户端和服务器端的交互。

 

C/S 架构

  Client:程序

Server:程序

基于socket通信,而且fto仅支持ipv4 domain和ipv6 domain方式

即使C和S都在本机,也不会基于Unix socket进行通信,服务器会监听在

数据:

ftp有 命令连接:文件管理类命令

数据连接:以完成数据传输

工作模型:服务器端只监听命令连接,在tcp的21号端口。所以当客户端第一次访问服务器端,套接字文件会访问21号端口。当客户端要上传或下载一个数据时,我们的ftp的服务器端会启动系统调用,向底层要这个文件,而后把这个文件分割包, 需要另外一个连接发送给客户端。所以说命令连接和数据连接是两个不同的连接,也可以说命令连接本身是一致建立的,直到你说bye以后(始终在线的连接),而数据连接则是按需建立及关闭的连接。

ftp也是多进程工作,而且ftp也是允许并发连接的。数据在网上传输有个编码格式,比如http超文本传输协议传输的是编码成文本格式的,如果是图片呢?图片是二进制格式编码的,如何进行图片的传输呢?base64!通过base64把二进制编码成文本,到目标端,通过base64换成图片。

而ftp呢?是哪种传输格式呢?

ftp即支持文本传输,又支持二进制传输。

数据连接有主动和被动两种模式

命令连接:肯定是客户端请求,服务器端响应建立起来的会话。

数据连接呢?:

如果我们站在服务器角度来讲

主动是由服务器端创建连接

当客户端发起一个下载数据的请求,服务器端就主动创建一个连接与客户端进行数据传输。但服务器端怎么知道客户端在哪个端口呢?

当服务区主动连接客户端时,会在server端的20号端口上主动连接客户端50000+1的端口。客户端在命令连接时就已经告诉服务器端它自己在哪个端口等着。

大多情况下,服务器的主动连接都存在弊端,那就是当服务器端主动发起数据连接时,客户端往往有防火墙。

于是诞生被动模式:

命令连接依然有客户端发起的,而数据连接也是由数据连接, 数据连接时,客户端用自己的50000+1的端口连接服务器的随机端口,而客户端怎么知道服务器端的随机端口呢?其实在客户端主动发起命令连接时,服务器端就已经告诉客户端已开启一个子进程来响应数据连接而把随机端口告诉了客户端。告知方式是121,23就是121*256+23。

服务器的防火墙可以检查连接的相关性,叫连接追踪的功能。

ftp是C/S架构的应用层协议

server:windows(IIS)

           wu-ftpd

           proftpd

           pureftpd

           vsftpd:Very Secure ftpd

           ServU(win)

Client(linux下):

          ftp

          lftp

          wget

          curl

          lftpget

          filezilla(开源ftp功能)

         gtp(linux的GUI)工具

         flashfxp

         cuteftp

ftp协议与http协议近似,也有响应码

1xx:纯粹是信息码

2xx:成功

3xx:需要进一步提示补全信息

4xx:客户端错误

5xx:服务端错误

用户认证:

     mysql与ftp区别

mysql与ftp都是应用层协议,但背后存储不一样,

ftp

mysql存数据,不会直接存成块的,会存成关系型数据库组织的格式的

mysql提供的是结构化数据(非常方便组织数据结构,描述数据本身的组织格式),ftp提供非结构化数据。

而html是属于半结构化的数据,可以自己贴标签的。

ftp要实现用户认证,如何授权?再说mysql,mysql使用的账号与操作系统的账号没有半毛钱的关系,mysql的用户账号在mysql的user表中存放。 

虚拟用户,此用户账号仅用于某特定服务中的资源。

而早期的ftp服务使用系统账号认证用户,ftp也支持虚拟用户,ftp也可以把自己的账号放到mysql中,除了ftp,很多软件也要用到用户认证功能,所以我们应该做成一个共享服务框架,让大家都可以调用。

系统上两个应用,一个是nsswitch(网络服务转换)实现名称解析的框架, 而nsswitch的配置文件在/etc/nsswitch.conf

模块在/lib64/libnss*,/usr/lib64/libnss*

另一个是pam实现用户认证的框架。pam:插入认证模块

pam的模块在/lib64/security,针对64平台

pam的配置文件在/etc/pam.d/*

pam的主配置文件/etc/pam.conf

计算机识别用户都是根据id号识别的,而我们更容易记得是用户名称,很多软件更是要依靠名称解析,譬如说把ip地址转换成FQDN,用户的id号转换成用户名,组id号转换成组名,进程id号转换成进程名称。而解析就是查找数据库的对应关系,服务器端程序在已知库查找对应关系。

而给我们的启示是:软件如果想更通用,就尽可能脱离底层平台的功能。

 

vsftpd:

也支持系统用户,

也支持匿名用户,尽管说你是匿名的,到系统上运行时还是以系统上某个身份访问。

所以说不管是虚拟用户还是匿名用户,只要访问到资源上的资源要使用系统的服务进程,最终还是要使用某个系统用户的身份进行的。

CentOS系统上ftp服务器是

Vsftpd:

yum install vsftpd

如果开防火墙,先要关闭。

CentOS6.5:vsftpd

用户认证配置文件在:/etc/pam.d/vsftpd,如果不想在/etc/passwd中读取文件,首先要改的就是这个配置文件。

服务脚本:/etc/rc.d/init.d/vsftpd
配置文件目录:/etc/vsftpd/

主配置文件vsftpd.conf

其他文件主要跟用户控制有关,默认情况下,vsftpd使用系统账号认证用户,只要在/etc/passwd下有密码,就可以启动系统上的ftp服务,但ftp是明文的,用户认证发送过程也是明文的。

/etc/vsftpd/ftpusers
/etc/vsftpd/user_list 控制哪些用户能登录,哪些用户不能登录的。

/usr/sbin/vsftpd主应用程序

匿名用户(被映射为ftp用户)的共享资源位置:/var/ftp

系统用户通过ftp访问的资源位置:用户自己的家目录

虚拟用户:通过ftp访问的资源位置在:给虚拟用户指定的映射成为的系统用户的家目录。

vsftpd服务开启了,确实监听在32号端口

[root@libin cdrom1]# service vsftpd start
Starting vsftpd for vsftpd:                                [  OK  ]
[root@libin cdrom1]# ss -tnlp | grep vsftpd
LISTEN     0      32                        *:21                       *:*      users:(("vsftpd",2799,3))

作为实验我们准备两台机子

一台192.168.1.162是vsftpd的服务器端

一台192.168.1.150是ftp的客户端。

由ftp发起请求

[root@localhost cdrom]# ftp 192.168.1.162
Connected to 192.168.1.162 (192.168.1.162).
220 (vsFTPd 2.2.2)
Name (192.168.1.162:root): ftp(匿名用户映射为ftp用户)
331 Please specify the password.(提示你补全密码)
Password:
230 Login successful.(显示连接成功)
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> (可以开始连接了!)

ftp>  pwd
257 "/"

显示为根!

其实上并不是根 而是/var/ftp,有意实现的根切换

对于vsftpd服务端来讲,如何定义ftp工作特性?

先对vsftpd.conf做一个备份。

[root@libin cdrom1]# cd /etc/vsftpd/ 进入配置文件目录
[root@libin vsftpd]# ls
ftpusers  user_list  vsftpd.conf  vsftpd_conf_migrate.sh

编辑vsftpd.conf

anonymous_enable=YES
#
# Uncomment this to allow local users to log in.
local_enable=YES
#
# Uncomment this to enable any form of FTP write command.
write_enable=YES
#
# Default umask for local users is 077. You may wish to change this to 022,
# if your users expect that (022 is used by most other ftpd's)
local_umask=022

对于vsftpd配置文件来讲,多一个空白字符都可能让配置不生效!注意!

匿名用户的配置:

# Please read the vsftpd.conf.5 manual page to get a full idea of vsftpd's
# capabilities.
#
anonymous_enable=YES

是否启用匿名用户

#anon_upload_enable=YES默认设置匿名用户不可以上传

我们可以试一试,用匿名用户身份登录:

[root@localhost cdrom]# ftp 192.168.1.162
Connected to 192.168.1.162 (192.168.1.162).
220 (vsFTPd 2.2.2)
Name (192.168.1.162:root): ftp  
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>

然后我们试试切换目录上传文件

ftp> lcd /etc
Local directory now /etc

-----------------------------------------------------------

ftp> put /etc/issue
local: /etc/issue remote: /etc/issue
227 Entering Passive Mode (192,168,1,162,140,248).
550 Permission denied.显示没有权限!

这样我们把服务器端匿名用户上传启动起来,再看看!

然后我们重新用客户端连接服务器端,再次切换/etc目录,上传文件试试?显示:

ftp> put issue
local: issue remote: issue
227 Entering Passive Mode (192,168,1,162,223,177).
553 Could not create file.

不能创建文件?

[root@libin vsftpd]# ls -ld /var/ftp
drwxr-xr-x 3 root root 4096 Aug 16 19:01 /var/ftp

/var/ftp目录文件属主是root,属组也是root,对于other来说只有读和执行的权限没有写权限,意味没有办法在里面创建文件的!

ftp       3222  0.0  0.2  54652  1228 ?        S    19:49   0:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf

而我们是以ftp用户身份运行,它不属于root组,只是other,没有w权限的!而ftp这个目录默认不允许你修改目录自己的权限,如果我们坚持想让ftp这个匿名用户上传文件怎么办?

那就在/var/ftp目录下再创建一个目录,我们就叫它upload好了

然后setfacl

setfacl -m u:ftp:rwx /var/ftp/upload

getfacl查看下

[root@libin vsftpd]# getfacl /var/ftp/upload
getfacl: Removing leading '/' from absolute path names
# file: var/ftp/upload
# owner: root
# group: root
user::rwx
user:ftp:rwx
group::r-x
mask::rwx
other::r-x

然后在客户端下连接服务器端,ls查看一下

drwxr-xr-x 2 0 0 4096 Mar 01 2013 pub
drwxrwxr-x 2 0 0 4096 Aug 16 11:55 upload

257 "/upload"
ftp> lcd /etc/
Local directory now /etc
227 Entering Passive Mode (192,168,1,162,142,102).
150 Ok to send data.
226 Transfer complete.
103 bytes sent in 0.0381 secs (2.70 Kbytes/sec)

传输文件完成

#anon_mkdir_write_enable=YES 是否可以创建目录,默认是关闭的

如果想让匿名用户删除文件或者目录,还需要自己手动添加一个选项叫

anon_other_write_enable=YES

于是网络用户的共享权限遵循两个法则,一是共享用户权限和二文件系统权限。

系统用户配置:

# Uncomment this to allow local users to log in.
local_enable=YES

是否允许本地用户呢?让我们创建一个叫bigtom的系统用户

[root@libin ~]# useradd bigtom
[root@libin ~]# passwd bigtom
Changing password for user bigtom.
New password:
BAD PASSWORD: it is based on a dictionary word
BAD PASSWORD: is too simple
Retype new password:
passwd: all authentication tokens updated successfully.

然后切换到客户端,看看客户端能不能登录?

[root@localhost cdrom]# ftp 192.168.1.162
Connected to 192.168.1.162 (192.168.1.162).
220 (vsFTPd 2.2.2)
Name (192.168.1.162:root): bigtom
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>

使用pwd看看路径

ftp> pwd
257 "/home/bigtom"是系统用户bigtom的家目录啦!

而且他可以使用cd 到/etc目录!看:

ftp> cd /etc
250 Directory successfully changed.
ftp> ls
227 Entering Passive Mode (192,168,1,162,244,7).
150 Here comes the directory listing.
drwxr-xr-x    5 0        0            4096 Jun 29 09:16 ConsoleKit
-rw-r--r--    1 0        0            4439 Oct 17  2013 DIR_COLORS

本地用户还有一个可写的权限

#
# Uncomment this to enable any form of FTP write command.
write_enable=YES

默认是打开的,我们用刚才创建的系统用户bigtom试验一下:

[root@localhost cdrom]# ftp 192.168.1.162
Connected to 192.168.1.162 (192.168.1.162).
220 (vsFTPd 2.2.2)
Name (192.168.1.162:root): bigtom
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>

然后我们再创建一个叫15的目录,ls查看下。

ftp>  mkdir 15
257 "/home/bigtom/15" created
ftp> ls
227 Entering Passive Mode (192,168,1,162,208,125).
150 Here comes the directory listing.
drwxr-xr-x    2 507      518          4096 Aug 16 13:01 15
226 Directory send OK.
ftp>

ftp> rmdir 15
250 Remove directory operation successful.

而且还能删除

另外我们利用系统用户来看看文件的权限

ftp> put 1.tar
local: 1.tar remote: 1.tar
227 Entering Passive Mode (192,168,1,162,59,149).
150 Ok to send data.

传输成功一个叫1.tar的文件

-rw-r--r--    1 507      518       6540594 Aug 16 13:05 1.tar

而1.tar的默认权限是644,这里服务器端就规定了umask的具体数值了,

# Default umask for local users is 077. You may wish to change this to 022,
# if your users expect that (022 is used by most other ftpd's)
local_umask=022

假设我们改为077试一下

-rw-------    1 507      518       5031834 Aug 16 13:09 httpd-2.4.10.tar.bz2

可见这个umask仅是定义在ftp传输中的权限的。

如何把本地用户锁定在“家目录上”

#chroot_local_user=YES开启了以后,就被禁锢了。

[root@localhost cdrom]# ftp 192.168.1.162
Connected to 192.168.1.162 (192.168.1.162).
220 (vsFTPd 2.2.2)
Name (192.168.1.162:root): bigtom
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/"
ftp>

开启以后就被禁锢了~再也看不见/home/bigtom了

但是我们有时候可以给一些用户一些特权,让它可以在别的目录游荡,于是我们可以定义下面的两项:

#chroot_list_enable=YES
# (default follows)
#chroot_list_file=/etc/vsftpd/chroot_list

把那些特权用户放到list中,默认的文件是/etc/vsftpd/chroot_list

,如果你没有启用的话,是没有那个文件的。

[root@libin ~]# cat /etc/vsftpd/chroot_list
cat: /etc/vsftpd/chroot_list: No such file or directory

我们可以定义一个:chroot_list列表文件

然后在创建一个新的用户,譬如说叫bigjerry,然后把bigjerry放到列表文件中,看看实际效果:是不是bigjerry被禁锢了。

[root@libin vsftpd]# vim chroot_list

[root@libin vsftpd]# cat chroot_list
bigjerry


[root@libin vsftpd]# useradd bigjerry
[root@libin vsftpd]# passwd bigjerry
Changing password for user bigjerry.
New password:
BAD PASSWORD: it is based on a dictionary word
Retype new password:
passwd: all authentication tokens updated successfully.

然后我们用客户端连接服务端,看看实际效果

这是bigtom用户的:

ftp> pwd
257 "/home/bigtom"

关于bigjerry

Name (192.168.1.162:root): bigjerry  
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/"

系统用户 bigjerry就被禁锢住了!