linxux_ftp

安装&运行

yum

1
yum -y install vsftpd

开机自启&启动服务

1
2
systemctl enable vsftpd.service
systemctl start vsftpd.service

查看监听端口

1
netstat -antup | grep ftp

配置vsftpd

为FTP服务创建一个Linux用户

1
adduser ftptest

修改用户密码

1
passwd ftptest

创建一个供FTP服务使用的文件目录

1
mkdir /var/ftp/test

创建测试文件

1
touch /var/ftp/test/testfile.txt

更改/var/ftp/test目录的拥有者为ftptest

1
chown -R ftptest:ftptest /var/ftp/test

修改配置文件

1
vim /etc/vsftpd/vsftpd.conf

如果使用的是apt install vsftpd安装命令,则配置文件路径为/etc/vsftpd.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#除下面提及的参数,其他参数保持默认值即可。

#修改下列参数的值:
#禁止匿名登录FTP服务器。
anonymous_enable=NO
#允许本地用户登录FTP服务器。
local_enable=YES
#监听IPv4 sockets。
listen=YES

#在行首添加#注释掉以下参数:
#关闭监听IPv6 sockets。
#listen_ipv6=YES

#在配置文件的末尾添加下列参数:
#设置本地用户登录后所在目录。
local_root=/var/ftp/test
#全部用户被限制在主目录。
chroot_local_user=YES
#启用例外用户名单。
chroot_list_enable=YES
#指定例外用户列表文件,列表中用户不被锁定在主目录。
chroot_list_file=/etc/vsftpd/chroot_list
#开启被动模式。
pasv_enable=YES
allow_writeable_chroot=YES
#本教程中为Linux实例的公网IP。
pasv_address=<FTP服务器公网IP地址>
#设置被动模式下,建立数据传输可使用的端口范围的最小值。
#建议您把端口范围设置在一段比较高的范围内,例如50000~50010,有助于提高访问FTP服务器的安全性。
pasv_min_port=<port number>
#设置被动模式下,建立数据传输可使用的端口范围的最大值。
pasv_max_port=<port number>

chroot_list文件,并在文件中写入例外用户名单

1
vim /etc/vsftpd/chroot_list

重启服务

1
systemctl restart vsftpd.service

/etc/vsftpd目录下文件说明如下:

  • /etc/vsftpd/vsftpd.conf是vsftpd的核心配置文件。
  • /etc/vsftpd/ftpusers是黑名单文件,此文件中的用户不允许访问FTP服务器。
  • /etc/vsftpd/user_list是白名单文件,此文件中的用户允许访问FTP服务器。

用户登录控制参数说明

参数 说明
anonymous_enable=YES 接受匿名用户
no_anon_password=YES 匿名用户login时不询问口令
anon_root=(none) 匿名用户主目录
local_enable=YES 接受本地用户
local_root=(none) 本地用户主目录

用户权限控制参数说明

参数 说明
write_enable=YES 可以上传文件(全局控制)
local_umask=022 本地用户上传的文件权限
file_open_mode=0666 上传文件的权限配合umask使用
anon_upload_enable=NO 匿名用户可以上传文件
anon_mkdir_write_enable=NO 匿名用户可以建目录
anon_other_write_enable=NO 匿名用户修改删除
chown_username=lightwiter 匿名上传文件所属用户名

出现问题

image-20210907203159011

解决方法禁用SELinux

暂时禁用

1
2
setenforce 0
setenforce Permissive

永久禁用

1
2
vi /etc/selinux/config
SELINUX=disabled

打开ftp服务器上的文件夹时发生错误,请检查是否有权限访问该文件夹

image-20210907202342604

解决方法:打开 “网络和共享中心”,找到“Internet选项” –>【高级】这页,取消掉“使用被动FTP(用于防火墙和DSL调制解调器的兼容)”

windows_ftp

Windows server 2016 FTP服务器的搭建

使用命令

命令 描述
! 在本地机中执行交互shell,exit回到ftp环境
dir 显示远程计算机上的目录文件和子目录列表
cd 指定要更改的远程计算机上的目录
lcd 更改本地计算机上的工作目录。默认情况下,工作目录是启动 ftp 的目录
get 使用当前文件传输类型将远程文件复制到本地计算机。
open 与指定的 FTP 服务器连接
put/send 使用当前文件传输类型将本地文件复制到远程计算机上

日志分析

linux

默认情况下,Vsftp不单独记录日志,也就是说不会输出到一个单独的文件中存储,而是统一存放到/var/log/messages文件中。

常见解决方案

  1. xferlog_enable=YES
  2. xferlog_std_format=YES
  3. xferlog_file=/var/log/xferlog
  4. dual_log_enable=YES
  5. vsftpd_log_file=/var/log/vsftpd.log

在配置文件中启用xferlog_enable=YES,它表示将客户机登录服务器后上传或下载的文件具体信息记录。

image-20210908112713651

xferlog_std_format=YES 传输日志文件将以标准 xferlog 的格式书写,该格式的日志文件默认为 /var/log/xferlog

dual_log_enable=YES,它表示启用双份日志,将生成两个相似的日志文件,默认在 /var/log/xferlog/var/log/vsftpd.log 目录下。前者是 wu-ftpd 类型的传输日志,可以利用标准日志工具对其进行分析;后者是Vsftpd类型的日志。

syslog_enable原本应该输出到/var/log/vsftpd.log中的日志,将输出到系统日志中。

vsftpd.log

image-20210908113502525

日志仅反映了部分Ftp登录情况:例如登录IP地址、用户名

成功登录标识

1
2
Wed Sep  8 21:02:29 2021 [pid 340294] [longer] FTP command: Client "192.168.79.132", "PASS <password>"
Wed Sep 8 21:02:29 2021 [pid 340293] [longer] OK LOGIN: Client "192.168.79.132"

Xferlog

1
2
Wed Sep  8 19:08:51 2021 1 ::ffff:192.168.79.132 0 /test_ftp.txt a _ o r longer ftp 0 * c
Wed Sep 8 21:03:00 2021 1 192.168.79.132 0 /testfile.txt a _ o r longer ftp 0 * c
记录 含义
Tue Sep 7 15:35:57 2021 FTP传输时间
1 传输文件所用时间。单位/秒
192.168.79.132 ftp客户端名称/IP
0 传输文件大小。单位/Byte
/testfile.txt 传输文件名,包含路径
a 传输方式: a以ASCII方式传输; b以二进制(binary)方式传输;
_ 特殊处理标志位:”_”不做任何处理;”C”文件是压缩格式;”U”文件非压缩格式;”T”文件是tar格式;
o 传输方向:”i”上传;”o”下载;
r 用户访问模式:“a”匿名用户;”g”访客模式;”r”系统中用户;
longer 登录用户名
ftp 服务名称,一般都是ftp
0 认证方式:”0”无;”1”RFC931认证;
* 认证用户id,”*”表示无法获取id
c 完成状态:”i”传输未完成;”c”传输已完成;

为啥会出现::ffff:,因为之前vsftpd.conf中默认listen=YES#listen_ipv6=YES这个忘记注释掉。

IPv4 映射的 IPv6 地址使用此替代格式。此类型的地址用于将 IPv4 节点表示为 IPv6 地址。它允许 IPv6 应用程序直接与 IPv4 应用程序通信。例如,0:0:0:0:0:ffff:192.1.56.10::ffff:192.1.56.10/96(短格式)。

windows

日志位置

win+r ,输入inetmgr

image-20210908174120348

image-20210908174347526

字段

1
2
3
4
5
6
7
8
9
#Software: Microsoft Internet Information Services 10.0
#Version: 1.0
#Date: 2021-09-08 09:21:23
#Fields: date time c-ip cs-username s-ip s-port cs-method cs-uri-stem sc-status sc-win32-status sc-substatus x-session x-fullpath
2021-09-08 09:21:23 192.168.79.132 - 192.168.77.175 21 ControlChannelOpened - - 0 0 ab78edb1-c781-42ff-8056-24cc80701847 -
2021-09-08 09:21:23 192.168.79.132 - 192.168.77.175 21 OPTS UTF8+ON 200 0 0 ab78edb1-c781-42ff-8056-24cc80701847 -
2021-09-08 09:21:30 192.168.79.132 - 192.168.77.175 21 USER anonymous 331 0 0 ab78edb1-c781-42ff-8056-24cc80701847 -
2021-09-08 09:21:32 192.168.79.132 - 192.168.77.175 21 PASS eeee 230 0 0 ab78edb1-c781-42ff-8056-24cc80701847 /
2021-09-08 09:23:42 192.168.79.132 - 192.168.77.175 21 ControlChannelClosed - - 258 0 ab78edb1-c781-42ff-8056-24cc80701847 -

image-20210909095011088

FTP状态码

常用

状态码 描述
230 用户登录
226 请求的文件操作成功
213 文件状态
530 账号或密码错误
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
FTP应答码&响应码

110: 重新启动标记应答。
120: 在n分钟内准备好
125: 连接打开准备传送
150: 打开数据连接
200: 命令成功
202: 命令失败
211: 系统状态
212: 目录状态
213: 文件状态
214: 帮助信息
215: 名字系统类型
220: 新用户服务准备好了
221: 服务关闭控制连接,可以退出登录
225: 数据连接打开,无传输正在进行
226: 关闭数据连接,请求的文件操作成功
227: 进入被动模式
230: 用户登录
250: 请求的文件操作完成
257: 创建”PATHNAME”
331: 用户名正确,需要口令
332: 登录时需要帐户信息
350: 下一步命令
421: 不能提供服务,关闭控制连接
425: 不能打开数据连接
426: 关闭连接,中止传输
450: 请求的文件操作未执行
451: 中止请求的操作:有本地错误
452: 未执行请求的操作:系统存储空间不足
500: 格式错误,命令不可识别
501: 参数语法错误
502: 命令未实现
503: 命令顺序错误
504: 此参数下的命令功能未实现
530: 未登录
532: 存储文件需要帐户信息
550: 未执行请求的操作
551: 请求操作中止:页类型未知
552: 请求的文件操作中止,存储分配溢出
553: 未执行请求的操作:文件名不合法

FTP术语
150    文件状态良好,打开数据连接
200    命令成功
202    命令未实现
211    系统状态或系统帮助响应
212    目录状态
213    文件状态
214    帮助信息,信息仅对人类用户有用
215    名字系统类型
220    对新用户服务准备好
221    服务关闭控制连接,可以退出登录
225    数据连接打开,无传输正在进行
226    关闭数据连接,请求的文件操作成功
227    进入被动模式
230    用户登录
250    请求的文件操作完成
257    创建”PATHNAME”
331    用户名正确,需要口令
332    登录时需要帐户信息
350    请求的文件操作需要进一步命令
421    连接用户过多
425    不能打开数据连接
426    关闭连接,中止传输
450    请求的文件操作未执行
451    中止请求的操作:有本地错误
452    未执行请求的操作:系统存储空间不足
500    格式错误,命令不可识别
501    参数语法错误
502    命令未实现
503    命令顺序错误
504    此参数下的命令功能未实现
530    账号或密码错误
532    存储文件需要帐户信息
550    未执行请求的操作
551    请求操作中止:页类型未知
552    请求的文件操作中止,存储分配溢出
553    未执行请求的操作:文件名不合法

连接模式

主动模式PORT

img

被动模式PASV

img

比较

主动模式和被动模式的不同简单概述为: 主动模式传送数据时是“服务器”连接到“客户端”的端口(客户端开启数据端口);被动模式传送数据是“客户端”连接到“服务器”的端口(服务端开启数据端口)。

主动模式需要客户端必须开放端口给FTP服务端,很多客户端都是在防火墙内,开放端口给FTP服务器访问比较困难。

被动模式只需要服务器端开放端口给客户端连接就行了,如果服务端在防火墙内,也需要做端口映射才行。

参考链接

FTP的主动模式和被动模式工作原理及抓包分析

手动搭建FTP站点

FTP服务器日志解析

vsftp日志xferlog格式分析

FTP应答码&响应码