当我在 SSH 终端中检查 VPS 的统计数据时,我注意到网络状态和访问日志给出不同的结果。
当我使用时:
netstat -anp
我看到一名袭击者三十二端口的并发连接数80和123.217.100.19IP地址。
同时,在访问日志 ( /var/www/vhosts/domain.com/statistics/logs/access_log
) 中,只有以下日志条目123.217.100.199(还有一个9(末尾)IP 地址。没有特定的123.217.100.19访问日志中可以找到 IP 地址。
netstat 和 access log 中出现这种ip差异的原因是什么?
答案1
Easy.netstat
是一个命令行工具,用于向您显示实时发生的实时/真实网络流量。但是当您access_log
像这样说出并指向完整路径时:
/var/www/vhosts/domain.com/statistics/logs/access_log
该日志由服务器上的 Web 服务生成。我最好的猜测是 Apache 生成这些日志。您看到的日志数据access_log
比 Apache 少的原因直接来自于 Apache 处理这些连接的能力。
我认为,如果连接来自同一个浏览器且位于同一个 IP 地址,Apache 中有一个选项可以保持连接有效。因此,如果您设置了 32 个连接到端口 80 的项目,则可能存在“保持连接”逻辑。
或者更有可能的是,这种攻击是典型的 DDoS 攻击,即发出大量连接请求,但在连接建立之前就被丢弃。这在 DDoS 意义上是可行的,因为 Apache 需要能够响应这些请求,但如果攻击者发出的大量连接在建立连接之前“挂断”……那么就不会记录任何连接。
因此,以您的示例数据为例,实际上有 9 个连接正在与 Apache 建立。但其余 23 个请求在 Apache 可以执行任何操作之前就被丢弃了。
答案2
是的,有一个关键的区别。
在 netstat 上你会看到生的连接数据。无论是否执行上层协议握手,只要有 SYN 数据包经过,netstat 就会记录它。
另一方面,access_log 只会记录完成 HTTP 握手的连接。如果有人建立了连接但没有发送任何数据,access_log 将永远不会看到它。
运行 atail -f access_log
并远程登录到您的服务器的 80 端口。建立连接后,运行 a netstat
,然后关闭 telnet 连接而不发送任何内容。您将看到您的 IP 出现在 netstat 上,但不出现在 access_log 上。