日志格式解析

拿到一份FTP日志,你第一眼看到的是什么?

一堆数字、时间、IP、文件名……说实话,刚入行那会儿我看着就头疼。后来我才明白,看不懂日志格式,等于没日志。今天咱就掰开了讲两种最常见的格式:vsftpd 和 wu-ftpd。

vsftpd 日志格式

vsftpd 可以说是 Linux 上用最多的 FTP 服务器了。它的日志默认长这样:

Tue Mar 21 10:15:30 2023 1 192.168.1.100 21 /var/ftp/pub/test.txt b _ o a user@example.com ftp 0 * c

看着像天书对吧?我来拆开讲每个字段。

字段序号示例值含义
1Tue Mar 21 10:15:30 2023时间戳(服务器本地时间)
21传输时间(秒),这里是 1 秒
3192.168.1.100客户端IP地址
421FTP控制端口,通常是 21
5/var/ftp/pub/test.txt传输的文件完整路径
6b传输方向:b 表示上传(从客户端到服务器),a 表示下载(从服务器到客户端),d 表示删除
7_特殊标记位,通常为下划线,偶尔出现 “r” 表示重命名等
8o认证类型:o 表示匿名(Other),r 表示真实用户(Real),g 表示访客(Guest)
9a身份验证结果:a 表示成功,c 表示失败
10user@example.com用户名或邮件地址(匿名通常是邮件地址)
11ftp服务类型,固定为 ftp
120认证方法:0 无认证,1 RFC931,2 其他
13*认证用户ID,通常为 *
14c是否完成:c 表示完成,i 表示未完成(incomplete)

我个人习惯:做审计时,我最先看第 6(方向)、第 9(结果)、第 14(完成状态)。这三个字段直接告诉你文件传到哪了、成没成功。

wu-ftpd 日志格式

wu-ftpd 虽然老了,但很多遗留系统还在用。它的格式跟 vsftpd 有很大不同:

Mon Mar 21 10:15:30 2023 3 192.168.1.105 43210 /home/ftp/pub/data.zip 12345673 1 1 user1 ftp 0 * a
字段序号示例值含义
1Mon Mar 21 10:15:30 2023时间戳(同 vsftpd)
23传输时间(秒)
3192.168.1.105远端IP地址
443210数据端口(不是控制端口,是实际传输数据的动态端口)
5/home/ftp/pub/data.zip文件路径
612345673文件大小(字节)
71特殊标志位:1 正常,0 异常
81传输方向:1 表示上传,0 表示下载(vsftpd 是字母,wu-ftpd 是数字,注意区分)
9user1用户名(匿名显示 anonymous)
10ftp服务类型
110认证方法
12*用户ID
13a传输状态:a 完成,i 未完成

我曾经就在项目里踩过坑:wu-ftpd 的数据端口是动态端口(第 4 字段),不是控制端口 21。有一次审计时我直接用 21 去匹配,结果漏了一大批外联数据。后来才反应过来,wu-ftpd 第 4 字段是数据端口,跟 vsftpd 完全不同。

核心字段对比表

含义vsftpd 位置wu-ftpd 位置
时间戳字段 1字段 1
传输耗时字段 2字段 2
客户端 IP字段 3字段 3
端口号字段 4(控制端口 21)字段 4(动态数据端口)
文件路径字段 5字段 5
文件大小不支持(默认字段里没有)字段 6
传输方向(上传/下载)字段 6(字母 b/a)字段 8(数字 1/0)
用户名字段 10字段 9
完成状态字段 14(c/i)字段 13(a/i)

说白了,两种格式大部分字段意义相同,但字段顺序和编码方式差很多。如果你用同一个解析脚本去处理,肯定乱套。我建议:先识别日志头或者文件来源,再选择对应解析方案。

解析时常见的坑

  • 空字段:vsftpd 第 7 字段有时会是下划线,wu-ftpd 第 7 字段有时是连字符。解析时别直接按空格 split 完事,要留意空值处理。
  • 文件名带空格:这个很要命。你想想看,如果文件名是 my report.txt,按照空格 split 就会把路径拆碎。我处理过一家公司的日志,文件名里居然有中文和空格混合,最后只能用正则匹配路径。
  • 长连接 vs 断点续传:wu-ftpd 的完成状态字段(13)在断点续传时可能出现 “i” 表示未完成,但文件部分已存在。审计时要配合传输耗时和文件大小判断实际状态。
  • 时间格式差异:vsftpd 用英文月份缩写(Mon, Tue...),wu-ftpd 也是类似,但如果你日志跨年,某些系统可能不带年份,需要根据文件修改时间推测。

我的经验:做日志解析时,不要直接依赖固定字段索引。更好的做法是写一个“格式探测器”——先拿前几行看第 6 字段是字母还是数字,是字母则走 vsftpd 解析器,是数字则走 wu-ftpd 解析器。这样维护起来省心得多。

FTP 日志格式解析流程 FTP 原始日志 格式探测器:第6字段 字母 (b/a) / 数字 (1/0) 字母 → 数字 → vsftpd 解析器 字段 1-14 方向 b/a | 状态 c/i wu-ftpd 解析器 字段 1-13 方向 1/0 | 状态 a/i 统一字段集 时间 | IP | 文件 | 方向 | 用户 | 状态 ⚠ 注意:vsftpd 文件大小 默认日志不包含,需 xferlog_enable=NO

嗯,这张图把我刚才说的解析逻辑画清楚了。你拿着这份对照表,以后看到任何一种 FTP 日志,都能一秒定位关键字段。