再会
出于好奇,我在我的一个远程虚拟机上对 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
检查可疑服务并尝试禁用它们,看看是否有帮助。