本篇笔记包含以下内容
FTP 原理
File Transfer Protocol 文件传输协议,基于 TCP 协议,采用 C/S 模式,控制连接端口 21,数据连接端口 20。
- 控制连接:负责 FTP 客户端与服务器交互命令与信息的传输,在整个会话过程中始终打开。
- 数据连接:负责客户端与服务器数据的传输,传输完毕就会关闭
文件类型: 一共有4种,但目前主流仅支持以下两种。
- ASCII:默认模式,发送方将文件转为 ASCII 码传输,适合文本文件传输
- 二进制:也称图像文件传输模式,按比特流传输,适合程序文件传输
格式控制:有三种选项,但目前主流配置只允许非打印。非打印:表示文件中不含有垂直格式信息。
数据结构:有四种选项,但主流配置只允许文件结构。文件结构认为数据是一个连续的字节流。
传输模式:有四种选项,但主流仅允许流方式,文件以字节流形式传输。对于文件节后,发送方在文件结束处提示关闭数据连接。
数据传输方式:
- 主动 PORT
- 首先客户端(随机端口)与服务器(21 端口)TCP 三次握手建立连接,建立控制连接通道
- 客户端向服务器发送 PORT 命令,告知服务器使用主动模式。
其中 PORT 命令携带参数(客户端 IP 地址, P1, P2),P1 与 P2 用于标识客户端数据连接的临时端口号,具体为 256*P1+P2,IP 地址也是四段,每段用逗号分隔 - 服务器收到 PORT 命令后按照参数用 20 端口与客户端指定端口三次握手建立数据传输通道。
- 数据传输完毕,发送方发送 FIN 报文,关闭数据连接
注:若客户端在防火墙内部网络,主动方式会出现问题,因为客户端提供的端口是随机的,防火墙若未放行该端口,则无法建立 FTP 连接。此时需要使用被动方式建立连接
- 被动 PASV
- 首先客户端(随机端口)与服务器(21 端口)TCP 三次握手建立连接,建立控制连接通道
- 客户端向服务器发送 PASV 命令,参数与 PORT 一致。但 IP 是服务器的,标识的是服务器端的临时端口号。
- 客户端用随机端口与服务器的指定临时端口 TCP 三次握手建立数据连接通道。
- 数据传输完毕,发送方发送 FIN 报文,关闭数据连接
FTP 应答格式:
服务器端处理完命令后,会将状态信息,如命令是否执行成功、出错类型、是否就绪等,通过控制连接发送给客户端,即应答。应答的目的就是对数据传输过程进行同步,也为了让客户端了解服务器目前的状态。
FTP 应答由 3 个 ASCII 码数字组成,并跟随解释性文本符号。数字面向机器,文本面向用户。
- 第一位:
- 1:确定预备应答:仅仅是在发送另一个命令前期待另一个应答时启动
- 2:确定完成应答:要求的操作已完成,可接受新命令
- 3:确定中间应答:该命令已被接受,另一个命令必须被发送
- 4:暂时拒绝完成应答:请求的命令没有执行,但差错状态是暂时的,命令以后可以再发。
- 5:永久拒绝完成应答:该命令不被接受,并要求不要再重试。
- 第二位:
- 0:语法错误
- 1:一般性的解释信息
- 2:与控制和数据连接有关
- 3:与认证和账户登录过程有关
- 5:与文件系统有关
- 第三位:未明确规定,指示对第二位的进一步细化。
常见 FTP 应答:
- 110:重新启动标记应答
- 120:服务在多久时间内准备
- 125:数据连接打开,传输开始
- 150:文件状态正常,打开数据连接端口
- 200:命令执行成功
- 202:命令执行失败
- 211:系统状态或是系统求助响应
- 212:目录的状态
- 213:文件的状态
- 214:帮助信息
- 215:名称系统类型
- 220:新的联机服务准备
- 221:服务控制连接关闭,可注销
- 225:数据连接开启,但无传输动作
- 226:关闭数据连接端口,请求的文件操作成功
- 227:进入 passive modes
- 250:请求的文件操作完成
- 331:用户名已接受,需要输入密码
- 332:登录时需账号信息
- 350:请求的命令需要进一步的命令
- 421:无法提供服务,关闭控制连接
- 425:无法开启数据连接
- 426:关闭联机,终止传输
- 450:请求的操作未执行
- 451:命令终止,有本地错误
- 452:未执行命令,磁盘空间不足
- 500:格式错误,无法识别命令
- 501:参数语法错误
- 502:命令执行失败
- 503:命令顺序错误
- 504:命令所接的参数不正确
- 530:未登录
- 532:存储文件需要账户登录
- 550:未执行请求的操作
- 551:请求的命令终止,类型未知
- 552:请求的文件终止,储存位溢出
- 553:未执行请求的命令,名称不正确
VSFTP 搭建
Very Secure FTP 安全文件传输软件。针对系统的程序权限设计,有以下特点:
- 将 PID 的权限降低
- 使用 chroot 机制
- 服务的启动者就是一个一般用户
- 任何需要执行具有较高执行权限的 VSFTP 指令都由特殊的上层程序控制
VSFTPD 有两种启动方式:
- stand alone:CentOS 默认使用该方式启动 VSFTPD,适合主要用于提供大量下载的任务,服务速度快。使用 systemd 管理就是 stand alone
- super daemon:适合内部人员小范围使用。使用 xinetd 管理就是 super daemon
服务器端
安装 vsftpd 服务yum install vsftpd
systemctl enable vsftpd
systemctl start vsftpd
安装完在/etc/vsftpd
中有四个默认文件:
ftpusers
:指定哪些用户不能访问 FTP 服务器,即黑名单user_list
:实行访问控制的用户列表vsftpd.conf
:VSFTP 主配置文件vsftpd_conf_migrate.sh
:VSFTPD 操作的一些变量和设置的脚本
配置文件/etc/vsftpd/vsftpd.conf
简单解析
listen = YES # IPv4监听,默认是以StandAlone方式启动 |
认证访问控制
VSFTPD 提供三种认证方式:
- 匿名访问 anoymous:无需认证即可登入
- 本地用户 local:使用 ftp 服务器中的用户登录
- 虚拟用户:创建独立 ftp 账户。是最安全的
匿名访问
无需提供真正用户名和密码就能登录 FTP 服务器。最好不要开启匿名登录,若要开启就进行限制行为。
- 只允许匿名用户使用少量基本的操作命令
- 限制文件下载数量,不要允许上传
- 限制匿名登录的最大同时联机数
配置文件相关参数:
anonymous_enable = YES # 是否允许匿名用户登录,默认YES |
在客户端上匿名登录 ftp 服务器:只要在输用户名时输入 anonymous,并任意输入字符串作为密码
本地用户
使用 ftp 服务器本地的用户进行登录,会更加安全,也是最常用的方式。
配置文件相关参数:
local_enable = YES # 允许本地用户登录ftp,默认YES,在实际工作环境中,应该将这项设为NO |
虚拟用户
本地用户登录时会自动转为虚拟用户,即使有大量用户登录,但最终也仅仅转为一个虚拟用户,避免了创建大量的系统用户。
guest_enable = YES # 是否开启虚拟账户 |
使用本地用户认证
创建 FTP 用户限制该用户仅能登录 FTP 服务器useradd ftpuser -s /sbin/nologin
并设置密码。
为该用户创建一个主目录,即用户登录 FTP 后的根目录。mkdir -p /data/ftp/ftpuser/pub
。
其中/data/ftp/ftpuser
为用户ftpuser
的主目录,该目录不得上传文件,该目录下的pub
目录供 ftpuser 用户上传文件。usermod -d /data/ftp/ftpuser ftpuser
chmod a-w /data/ftp/ftpuser
chmod a+w -R /data/ftp/ftpuser/pub
配置文件中几条修改项:
local_enable = YES |
使用虚拟账户
首先创建虚拟用户文件/etc/vsftpd/visualusers
,文件中列出虚拟用户名和密码
ftp_visual_1 |
生成虚拟用户数据库(可选)。需要工具libdb4-utils
(Berkeley DB 工具,CentOS 中是该软件包)
db_load -T -t hash -f /etc/vsftpd/visualusers /etc/vsftpd/visualusers.db
,然后修改该备份文件的访问权限chmod 600 /etc/vsftpd/{visualusers,visualusers.db}
创建 PAM 文件,设置账户验证。
PAM 配置文件位于/etc/pam.d/vsftpd
,该文件的名称取决于 vsftpd 主配置文件的pam_service_name
字段。将默认配置注释,然后添加以下内容:
auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/visualusers.db |
所有的虚拟用户都需要映射到一个真实的系统用户,因此需要添加一个系统账户并设置家目录。
useradd -s /sbin/nologin -d /home/virtual virtual
查看修改主配置文件(有的不用改):
local_enable = YES |
创建虚拟用户配置文件的存放目录/etc/vsftpd/visual_config
,这样可以为每个账户做单独的权限设置
创建用户visual
的独立配置(举例):
# vim /etc/vsftpd/visual_config/visual |
常用客户端软件
TFTP 原理
Trivial File Transfer Protocol 简单文件传输协议,基于 UDP 协议,端口号 69
特点:
- 仅提供简单文件传输功能(上传,下载)
- 无存取授权与认证机制,无目录功能
- 由客户端发起
下载过程:
- 客户端向服务器发送读请求
- 服务器根据请求回应数据报文(块编号从 1 开始)
- 客户端收到数据后回应确认报文。重复 2.3 步直至完成下载
上传过程:
- 客户端向服务器发送写请求
- 服务器回应确认报文(块编号为 0)
- 客户端发送数据报文(块编号从 1 开始)
- 服务器收到后回应确认报文。重复 3,4 步直至上传完成
文件传输时,将文件分成多个文件块,封装到数据报文中并打上文件块编号
传输文件模式:
- netASCII:对应 FTP 的 ASCII 模式
- octet:对应 FTP 二进制模式
协议报文:
- RRQ 读请求报文
- WRQ 写请求报文
- 数据报文
- 确认正确/错误报文
报文的头两个字节是操作码字段,1 为读请求,2 为写请求,3 为数据报文,4 为确认正确,5 为错误。
文件传输过程中读写出错就发送差错报文,数据传输就停止,差错报文不会被确认也不会重传。
TFTP 每次传输的数据报文中文件块大小固定为 512 字节,若文件大小刚好是 512 字节的整数倍,则传完文件后还要再发一个空文件块的数据报文表明文件传输完成。