尽管 Http-Server 未运行,但端口 80 上有流量

尽管 Http-Server 未运行,但端口 80 上有流量

再会

出于好奇,我在我的一个远程虚拟机上对 80 端口进行了 tcpdump。我看到大量请求发送到这个 http 端口,其中 95% 发往某个 AWS EC2 实例。奇怪的是:Web 服务器根本没有高负载。来自 tcpdump 的数据包如下所示:

20:57:16.860028 IP user123.example.net.http > ec2-55-155-123-123.ap-northeast-2.compute.amazonaws.com.12345: Flags [S.], seq 1234567, ack 12345567, win 12300, options [mss 1460], length 0

(user123.example.net.http 是我的远程机器的地址)

它们看起来基本相同,唯一不同的是实际的 EC2 地址(又称 IP 地址)和目标端口。有时是传入包(也是到端口 80),但大多数是传出包。

我今天在办公室的 80 端口上运行了这个 tcpdump。现在流量是在远程虚拟机和另一个 IP 地址之间,不再是 AWS 实例了:

08:34:46.369161 IP user123.example.net.http  > 123.12.123.132.37176: Flags [R.], seq 0, ack 2821777444, win 0, length 0
08:34:46.388933 IP 123.12.123.132.55539 > user123.example.net.http : Flags [S], seq 2934790784, win 29200, length 0

在这种情况下,IP 地址不会改变。

唯一改变的是:我现在从我的工作地点远程登录,使用另一个 IP 地址(不是您在 tcpdump 中看到的那个)和另一个 SSH 客户端。

调查

我到目前为止尝试过但没有成功:

  • 我检查了 nginx 的日志文件,它们没有显示任何流量(我没有运行大型网站,只是运行一些小型私人项目)
  • 我停止了 nginx,这是此设置中唯一明显的 port80 守护进程
  • 我停止了所有其他非系统服务:没有变化

当前设置

我在跑步nginx在此服务器上的端口 80 和 443 上,但流量通常会路由到 HTTPS。此外,我还在运行PHP7.3 带有 FPM,但在套接字上,而不是通过 TCP。

除此之外,我还运营一些电子邮件服务(鸽舍, 后缀,...),不受约束,一个 *MySQL-*Server 和一个 *ELK-*stack。这就是网络状态-tulpn确认:(我固定了我的公共 IP 地址和 SSHD 端口,这不是默认的)

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:53            0.0.0.0:*               LISTEN      858/unbound
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      2806/master
tcp        0      0 x.x.x.x:25              0.0.0.0:*               LISTEN      2806/master
tcp        0      0 127.0.0.1:8953          0.0.0.0:*               LISTEN      858/unbound
tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN      7942/nginx -g daemo
tcp        0      0 0.0.0.0:4190            0.0.0.0:*               LISTEN      628/dovecot
tcp        0      0 0.0.0.0:993             0.0.0.0:*               LISTEN      628/dovecot
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      491/mysqld
tcp        0      0 127.0.0.1:587           0.0.0.0:*               LISTEN      2806/master
tcp        0      0 x.x.x.x:587             0.0.0.0:*               LISTEN      2806/master
tcp        0      0 0.0.0.0:143             0.0.0.0:*               LISTEN      628/dovecot
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      7942/nginx -g daemo
tcp        0      0 0.0.0.0:???             0.0.0.0:*               LISTEN      27952/sshd
tcp6       0      0 ::1:53                  :::*                    LISTEN      858/unbound
tcp6       0      0 ::1:25                  :::*                    LISTEN      2806/master
tcp6       0      0 ::1:8953                :::*                    LISTEN      858/unbound
tcp6       0      0 :::443                  :::*                    LISTEN      7942/nginx -g daemo
tcp6       0      0 :::4190                 :::*                    LISTEN      628/dovecot
tcp6       0      0 :::993                  :::*                    LISTEN      628/dovecot
tcp6       0      0 ::1:587                 :::*                    LISTEN      2806/master
tcp6       0      0 :::143                  :::*                    LISTEN      628/dovecot
tcp6       0      0 :::80                   :::*                    LISTEN      7942/nginx -g daemo
tcp6       0      0 :::???                  :::*                    LISTEN      27952/sshd
udp        0      0 127.0.0.1:53            0.0.0.0:*                           858/unbound
udp6       0      0 ::1:53                  :::*                                858/unbound

停止所有上述服务后,输出如下 - 端口 80 上的数据包仍然存在:

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:???             0.0.0.0:*               LISTEN      27952/sshd
tcp6       0      0 :::???                  :::*                    LISTEN      27952/sshd

这是输出服务状态-全部|grep +(用 * 标记了一些 - 这些在停止父进程时没有停止,仍然在尝试弄清楚)

 [ + ]  amavis-mc *
 [ + ]  amavisd-snmp-subagent *
 [ + ]  apache-htcacheclean *
 [ + ]  apparmor
 [ + ]  cron
 [ + ]  fail2ban
 [ + ]  gdomap
 [ + ]  ip6tables
 [ + ]  iptables
 [ + ]  lm-sensors
 [ ? ]  modules_dep.sh
 [ + ]  nscd
 [ ? ]  php-fpm-chroot-setup.sh (make PHP available after reboot)
 [ + ]  procps
 [ + ]  quota
 [ + ]  rc.local
 [ + ]  resolvconf
 [ + ]  rsyslog
 [ + ]  ssh
 [ + ]  sysstat
 [ + ]  udev
 [ + ]  unattended-upgrades
 [ + ]  urandom
 [ + ]  uwsgi

问题是..

为什么即使 nginx 没有运行,80 端口上也会有流量?这些流量来自哪里(哪个进程)?

答案1

如果您的 Web 服务器在端口 80 上发起传出请求,则停止 nginx Web 服务器不一定有帮助,因为许多服务可以在端口 80 上发起传出连接。

由于 tcpdump 是在以太网层,因此您无法获得更多详细信息。您需要找到问题的根源。大多数情况下,当您看到如此高的传出流量请求时,它源自外部,例如在您的某个站点上执行 PHP 脚本。但由于您禁用了 Nginx,因此这一点并不明显。但是,当 nginx 被禁用时,请仔细检查端口 80 或 443 上是否真的没有任何东西在监听,因为可以从 443 或您的 Web 服务器正在监听的任何其他端口调用这样的 PHP 文件。使用以下命令检查是否仍有某些东西在监听特定端口:

netstat -tulpn

如果端口 80 或 443 上确实没有任何运行,并且您仍然看到已启动的传出端口 80,我会阻止传入请求,查看它是否确实源自您的 Web 服务器本身。

如果是这种情况,请检查所有正在运行的服务,因为只有正在运行的服务才能成为发起者。您还可以使用:

netstat -tulpn

或者

service --status-all

检查可疑服务并尝试禁用它们,看看是否有帮助。

相关内容