我在服务器上运行 API。客户每秒轮询服务器 8-10 次 API 请求。我知道这是不好的做法,我正在努力让客户改变。但与此同时,过了一段时间,服务器阻止了互联网访问。我无法看到内部局域网之外,也无法从外部看到它。它正在运行,我可以从内部网络上的另一台服务器 ssh 进入。我重新启动了 apache,但这没有用。重新启动总是可以解决问题,所以我认为不是防火墙的问题。看起来好像有什么东西检测到了 DDOS 攻击尝试并关闭了互联网外部访问。
服务器运行的是 Centos 7,并安装了所有最新补丁和升级。我通过限制 API 访问来正确修复此问题,但我想了解内部发生了什么。是否有作为 Centos 默认程序的一部分运行的实用程序可以执行此操作?
感谢您的见解。这是我的访问日志的片段...您可以看到他每秒访问我们 8 次。
xx.73.83.167 - - [25/Jun/2019:13:47:59 -0700] "POST /auth HTTP/1.0" 200 215 "-" "Java/11.0.3"
xx.73.83.167 - - [25/Jun/2019:13:47:59 -0700] "POST /auth HTTP/1.0" 200 215 "-" "Java/11.0.3"
xx.73.83.167 - - [25/Jun/2019:13:47:59 -0700] "POST /measurements HTTP/1.0" 200 67 "-" "Java/11.0.3"
xx.73.83.167 - - [25/Jun/2019:13:47:59 -0700] "POST /measurements HTTP/1.0" 200 67 "-" "Java/11.0.3"
xx.73.83.167 - - [25/Jun/2019:13:47:59 -0700] "POST /auth HTTP/1.0" 200 215 "-" "Java/11.0.3"
xx.73.83.167 - - [25/Jun/2019:13:47:59 -0700] "POST /auth HTTP/1.0" 200 215 "-" "Java/11.0.3"
xx.73.83.167 - - [25/Jun/2019:13:47:59 -0700] "POST /measurements HTTP/1.0" 200 67 "-" "Java/11.0.3"
xx.73.83.167 - - [25/Jun/2019:13:47:59 -0700] "POST /measurements HTTP/1.0" 200 67 "-" "Java/11.0.3"
xx.73.83.167 - - [25/Jun/2019:13:48:00 -0700] "POST /auth HTTP/1.0" 200 215 "-" "Java/11.0.3"
xx.73.83.167 - - [25/Jun/2019:13:48:00 -0700] "POST /auth HTTP/1.0" 200 215 "-" "Java/11.0.3"
xx.73.83.167 - - [25/Jun/2019:13:48:00 -0700] "POST /pwi HTTP/1.0" 200 165 "-" "Java/11.0.3"
xx.73.83.167 - - [25/Jun/2019:13:48:00 -0700] "POST /measurements HTTP/1.0" 200 67 "-" "Java/11.0.3"
xx.73.83.167 - - [25/Jun/2019:13:48:00 -0700] "POST /auth HTTP/1.0" 200 215 "-" "Java/11.0.3"
xx.73.83.167 - - [25/Jun/2019:13:48:00 -0700] "POST /auth HTTP/1.0" 200 215 "-" "Java/11.0.3"
xx.73.83.167 - - [25/Jun/2019:13:48:00 -0700] "POST /measurements HTTP/1.0" 200 67 "-" "Java/11.0.3"
xx.73.83.167 - - [25/Jun/2019:13:48:00 -0700] "POST /measurements HTTP/1.0" 200 67 "-" "Java/11.0.3"
xx.73.83.167 - - [25/Jun/2019:13:48:00 -0700] "POST /auth HTTP/1.0" 200 215 "-" "Java/11.0.3"
xx.73.83.167 - - [25/Jun/2019:13:48:01 -0700] "POST /auth HTTP/1.0" 200 215 "-" "Java/11.0.3"
xx.73.83.167 - - [25/Jun/2019:13:48:01 -0700] "POST /measurements HTTP/1.0" 200 67 "-" "Java/11.0.3"
xx.73.83.167 - - [25/Jun/2019:13:48:01 -0700] "POST /measurements HTTP/1.0" 200 67 "-" "Java/11.0.3"
xx.73.83.167 - - [25/Jun/2019:13:48:01 -0700] "POST /auth HTTP/1.0" 200 215 "-" "Java/11.0.3"
xx.73.83.167 - - [25/Jun/2019:13:48:01 -0700] "POST /auth HTTP/1.0" 200 215 "-" "Java/11.0.3"
xx.73.83.167 - - [25/Jun/2019:13:48:01 -0700] "POST /pwi HTTP/1.0" 200 165 "-" "Java/11.0.3"
谢谢!
更新:
这种情况已经发生了三次。当我尝试使用浏览器访问服务器时,出现服务器未找到错误。我可以通过内部网络进入服务器。一切都在运行。firewalld 中的端口已打开。我重新启动了 apache,没有帮助。我重新启动了 firewalld,也没有帮助。我重新启动,一切都修好了。某个地方的某个进程阻止了外部互联网访问。我假设由于重新启动工作,所以不可能是外部交换机或防火墙的问题?虚拟机是 VMware,因此它们正在运行 NIC 池,因此如果是 NIC 问题,其他系统也会遇到这种情况?我还可以检查哪些其他日志?有人建议使用 dmesg,但输出很冗长且带有编码。我不知道要查找什么。有什么想法下一步要检查什么?我正在构建一个新的虚拟机并将迁移到该虚拟机,但我真的想知道是什么原因导致这种情况的。还有一件事......这台机器已经运行良好三年了。我已经应用了所有更新,因此服务器是最新的。
答案1
如果可以的话,我建议用小型 SOHO 路由器进行测试,或者从路由器中删除 DPI。
由于它在 LAN 中工作而不是通过 WAN,请注意一些企业级路由器会执行 DPI、深度数据包检查,并且在大量流量通过时会遇到困难。
我在使用旧的 Cisco ASA 和客户的邮件服务器时也遇到过类似的问题,即随机丢弃一些收到的电子邮件。
重新启动后问题消失的事实很容易解释,因为服务器不再接受任何东西,它间接地卸载了路由器
答案2
解决问题的步骤:
运行
tcpdump
并检查流量。您看到传入
TCP-SYN
数据包了吗?如果没有看到,或者您看到传入TCP-SYN
数据包并重复发送TCP-SYN-ACK
- 请检查服务器前的网络设备。您看到传入的
TCP-SYN
数据包,但没有看到任何回复。使用 检查防火墙iptables-save -c
。规则的顺序非常重要。您使用 fail2ban 吗?还使用ip route get <server-ip> from <client-ip> iif <iface>
和ip route get <dst> from <server-ip>
命令检查路由。它必须显示有效路由。问题可能是由 conntrack 表溢出引起的。检查
dmesg
和的输出conntrack -S
。问题可能是由于超出打开套接字的限制(通常是半关闭套接字)造成的。使用
ss
和nstat
检查。仔细调查
nstat -az
命令的输出。它列出了大量的指标和错误计数器。增加服务器的日志记录。检查错误日志。故障排除的下一步是使用该
strace
工具跟踪系统调用的执行。
答案3
一些有关故障排除的说明:
跑步网络状态查看连接到每个套接字的连接和进程:
sudo netstat -nlpt
检查该进程是否符合您认为应该监听和服务的进程(Apache)
使用 ulimit 检查系统限制,查看是否已达到最大进程数:
ulimit -a
尝试从本地主机(你的 ssh 会话)访问 Web 服务器,使用获得或卷曲。
检查内存、CPU 和系统日志。使用顶部 第一个和最后一个命令为 -f /var/log/syslog 或系统中的相应命令。在重启后并访问 Web 服务器时执行此操作。