日志格式解析
拿到一份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
看着像天书对吧?我来拆开讲每个字段。
| 字段序号 | 示例值 | 含义 |
|---|---|---|
| 1 | Tue Mar 21 10:15:30 2023 | 时间戳(服务器本地时间) |
| 2 | 1 | 传输时间(秒),这里是 1 秒 |
| 3 | 192.168.1.100 | 客户端IP地址 |
| 4 | 21 | FTP控制端口,通常是 21 |
| 5 | /var/ftp/pub/test.txt | 传输的文件完整路径 |
| 6 | b | 传输方向:b 表示上传(从客户端到服务器),a 表示下载(从服务器到客户端),d 表示删除 |
| 7 | _ | 特殊标记位,通常为下划线,偶尔出现 “r” 表示重命名等 |
| 8 | o | 认证类型:o 表示匿名(Other),r 表示真实用户(Real),g 表示访客(Guest) |
| 9 | a | 身份验证结果:a 表示成功,c 表示失败 |
| 10 | user@example.com | 用户名或邮件地址(匿名通常是邮件地址) |
| 11 | ftp | 服务类型,固定为 ftp |
| 12 | 0 | 认证方法:0 无认证,1 RFC931,2 其他 |
| 13 | * | 认证用户ID,通常为 * |
| 14 | c | 是否完成: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
| 字段序号 | 示例值 | 含义 |
|---|---|---|
| 1 | Mon Mar 21 10:15:30 2023 | 时间戳(同 vsftpd) |
| 2 | 3 | 传输时间(秒) |
| 3 | 192.168.1.105 | 远端IP地址 |
| 4 | 43210 | 数据端口(不是控制端口,是实际传输数据的动态端口) |
| 5 | /home/ftp/pub/data.zip | 文件路径 |
| 6 | 12345673 | 文件大小(字节) |
| 7 | 1 | 特殊标志位:1 正常,0 异常 |
| 8 | 1 | 传输方向:1 表示上传,0 表示下载(vsftpd 是字母,wu-ftpd 是数字,注意区分) |
| 9 | user1 | 用户名(匿名显示 anonymous) |
| 10 | ftp | 服务类型 |
| 11 | 0 | 认证方法 |
| 12 | * | 用户ID |
| 13 | a | 传输状态: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 日志,都能一秒定位关键字段。