一、简单介绍

ftp是一种非常古老的应用层协议,全称为文件传输协议(file transfer protocol),它比http协议年龄大的多,TCP/IP协议刚刚诞生不久,ftp就诞生了。主要用于在各主机之间完成文件传送

二、链接类型

1. 命令链接

用于传输命令

2. 数据链接

用于传输数据,只有需要进行数据传输时才建立,数据传输完成就拆除

  • 主动模式(PORT):当需要传输数据时,服务端会通过20/TCP端口去链接客户端命令链接端口随后的端口,而后开始传输数据
  • 被动模式(PASV):当需要传输数据时,客户端通过命令链接通知客户端一个随机端口,而后客户端也通过一个随机端口去链接客户端告知的端口。有意思的是,服务端并不会直接告诉客户端随机端口号,而是将随机端口号除以256后,将商和余数发送给客户端

三、ftp协议的实现

1. 服务端程序

  • Serv-U
  • IIS
  • filezilla
  • wuftpd
  • proftpd
  • pureftpd
  • vsftpd

2. 客户端程序

  • ftp命令
  • filezilla
  • CuteFTP
  • FlashFXP
  • lftp

四、vsftpd配置

1. 文件路径

  • 主配置文件:/etc/vsftpd/vsftpd.conf
  • unit文件:/usr/lib/systemd/system/vsftpd.service
  • 主程序:/usr/sbin/vsftpd
  • 共享文件路径:/var/ftp/

2. 用户类型

  • 匿名用户:
  • 系统用户:使用系统用户完成登录,有些具有管理权限的系统用户应该限制其登录,需定义在/etc/vsftpd/ftpuser文件中
  • 虚拟用户:使用非系统用户完成登录

3. 主配文件关键指令

  • anonymous_enable:是否开启匿名用户登录
  • anon_world_readable_only:是否为全局只读
  • anon_upload_enable:匿名用户是否可以上传文件
  • anon_mkdir_write_enable:匿名用户是否可以创建目录
  • anon_other_write_enable:匿名用户是否可以删除文件、删除目录
  • anon_umask:匿名用户上传文件的掩码
  • chown_uploads:定义上传文件是否修改其属主,需要结合chown_username选项使用
  • chown_username:定义上传的文件属主是谁
  • local_enable:是否启用本地用户
  • write_enable:是否允许本地用户上传、下载、删除
  • local_umask:本地用户上传文件的掩码
  • userlist_enable:是否启用登录限制列表
  • userlist_deny:设置登录用户的名单,YES为黑名单,NO为白名单,结合/etc/vsftpd/user_list使用
  • chroot_list_enable:定义系统用户是否可以chroot,设定完成后需要将系统用户家目录的写权限移除
  • chroot_list_file=/etc/vsftpd/chroot_list:定义锁定chroot的用户名称
  • xferlog_enable:是否启用ftp上传下载日志
  • xferlog_file:日志文件位置
  • accept_timeout:链接建立的超时时长
  • anon_max_rate:匿名用户传输速率
  • local_max_rate:本地用户的传输速率
  • max_clients:并发链接限制数
  • max_per_ip:单ip的最大并发连接数

4. 虚拟用户

可以使用虚拟账户对ftp登录进行认证,ftp可以用过pam机制对接多种认证方式,认证信息可以存放在文件中、数据库中,不过要是存放在数据库中需要pam可以链接相应的数据库,本部分讲解pam对接mariadb

(1) 安装环境依赖包,创建用户

yum install mariadb-server mariadb-devel pam-devel
yum groupinstall "Development Tools" "Server Platform Devlopment"
useradd vuser:虚拟用户需要映射到本地的一个用户,所以需要创建一个本地用户

(2) 编译安装pam-mysql

./configure --with-mysql=/usr --with-pam=/usr --with-pam-mods-dir=/usr/lib64/security/
make && make install
此时在/usr/lib64/security/目录中就存在pam_mysql.so模块了,可实现使用mysql完成认证

(3) 配置mysql并授权用户

MariaDB [vsftpd]> SELECT * FROM users;
+----+-------+-------------------------------------------+
| id | name | password |
+----+-------+-------------------------------------------+
| 1 | tom | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| 2 | jerry | *09FB9E6E2AA0750E9D8A8D22B6AA8D86C85BF3D0 |
+----+-------+-------------------------------------------+
2 rows in set (0.00 sec)

(4) 配置pam认证

编辑配置文件/etc/pam.d/vsftpd.vusers

auth required /usr/lib64/security/pam_mysql.so user=vsftpd passwd=123456 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=123456 host=127.0.0.1 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2

(5) 配置ftpd服务端

pam_service_name=vsftpd.vusers
guest_enable=YES
guest_username=vuser

(6) 虚拟账号权限设置

需要在配置文件中加入user_config_dir=/etc/vsftpd/vusers_config/,这个选项用来定义虚拟账号权限目录,在目录中使用与账号名称相同的名称创建文件,在文件中使用匿名权限关键词来做授权,如tom用户就需要在/etc/vsftpd/vusers_config/目录下创建一个tom文件,如果允许其上传就在文件中定义anon_upload_enable=yes

五、其他的一些小知识

  • DAS(Direct Attached Storage):直接附加设备,设备与主板直接通过总线相连。这种数据存取接口是以block的方式呈现的,常见的有SATA、SAS、IDE、SCSI、USB
  • NAS(Network Attached Storage):网络附加存储,可以将网络上的文件系统挂载到本地,就像使用本地的文件系统一样。这种数据存取方式是以文件的方式呈现,所以其不可以分区格式化。典型的存储协议有CIFS(samba)、NFS(Network File System)
  • SAN(Storage Area Network):存储区域网络,接口类型为块,但是其接口是通过网络进行输出的。常见的协议为ISCSI(IP-SAN)、FCSAN、FCoE