正向代理日志分析
Squid 的 access.log 按请求逐条记录客户端、目标与结果:默认格式包含请求时间(Unix 时间戳)、耗时、客户端 IP、结果码与状态、响应字节数、请求方法、URL。它能把内网主机的上网与下载行为还原出来,是判断“哪台内网机器下载了什么、访问了哪里”的关键数据。但要注意覆盖面:明文 HTTP 能看到完整 URL,HTTPS 走 CONNECT 方式时只能看到目标域名与端口,路径不可见。
基本信息
| 适用平台 | 部署 Squid 代理的 Linux/Unix 环境(含企业上网代理) |
|---|---|
| 日志位置 | /var/log/squid/access.log(Debian 系 /var/log/squid3/ 或发行版默认路径) |
| 默认字段 | 时间戳 / 耗时 / 客户端IP / 结果码状态 / 字节数 / 方法 / URL / 用户名 / 对端 / 内容类型 |
| 常见结果码 | TCP_HIT 与 TCP_MISS(缓存命中与回源)、TCP_DENIED(被策略拒绝)、TCP_TUNNEL(隧道,常见于 HTTPS) |
| 配置影响 | 自定义 logformat 会改变字段顺序,解析前先确认日志格式配置 |
典型使用场景
- 确认某台内网主机是否访问过恶意域名或下载了可疑文件
- 统计下载类请求的字节数,评估数据外带的规模
- 从被拒请求中识别绕过策略的尝试(访问被墙目标、使用非标准端口)
- 识别代理上的异常客户端:非业务网段的主机出现在代理日志中
- 为钓鱼事件补证:用户点击链接后的实际访问与下载行为
检索与聚合
检索与聚合
# 按客户端与 URL 聚合访问频次
awk '{print $3, $7}' access.log | sort | uniq -c | sort -rn | head -20
# 找下载量最大的请求(评估外带规模,第 5 列为字节数)
awk '{print $5, $7}' access.log | sort -rn | head -15
# 回源请求(未被缓存命中,实际访问了外部)
grep 'TCP_MISS/200' access.log | awk '{print $1, $7}' | head
# 被策略拒绝的访问尝试
grep 'TCP_DENIED' access.log | awk '{print $3, $7}' | sort | uniq -c | sort -rn | head -10
# HTTPS 隧道请求只能看到目标域名与端口
awk '$6=="CONNECT"{print $3, $7}' access.log | sort | uniq -c | sort -rn | head结果码与字段读法
| 项 | 含义 | 判读要点 |
|---|---|---|
| 时间戳 | Unix 时间戳(秒) | 需转换后与其它日志对齐,注意为 UTC |
| 客户端 IP | 发起请求的内网主机 | 结合 DHCP 与资产台账映射到具体机器 |
| 结果码 | 缓存命中或回源、拒绝等状态 | TCP_MISS 表示真实回源访问,TCP_HIT 为缓存响应 |
| 字节数 | 响应体积 | 异常大的单次响应往往是下载行为 |
| 方法 | GET/POST/CONNECT 等 | CONNECT 为 HTTPS 隧道,看不见路径 |
| URL | 请求地址(HTTP 可见完整路径) | 含敏感参数时引用前先脱敏 |
URL 里经常带用户名、会话标识与邮箱等敏感参数;报告引用前先脱敏,只保留域名与必要的路径片段。
缓存命中与回源条目要区分统计,否则同一资源会被重复计数,访问量评估会明显偏高。