如何判断服务器实际上做什么?

我得到了3个Linux服务器,其中一个是面向外部的,上面运行着Apache,另外两个我看起来没有太多用途。都在运行Redhat操作系统。
问题很简单:我如何知道这些服务器实际在做什么?创建者没有提供任何文档。

7进程列表、网络监听器(可能与基于 init 脚本应该运行的进行比较)... - HBruijn
给予的意思是“交付”吗?(供您自己使用?)
  • 如果是这样,可以擦除并重新安装,用于您想要的任何目的,他们做了什么有关系吗?
- Digital Lightcraft
1给予支持 - Bizmark
5该死!肯定有人知道他们是干什么的吧? 所以他们想让你支持他们,但自己却不知道他们做什么?! - Digital Lightcraft
2难以置信,这确实会发生。我曾经身处其中。 - Aaron Copley
3这绝对会发生。我已经在一个被遗弃的未记录环境中进行了两周的发现过程。但不同之处在于,我知道要寻找什么... 对于楼主,你是如何陷入这种境地的?我们可以用一般性的说法回答,但肯定有人更了解这个设置。 - ewwhite
前置的可能是一个负载均衡器,根据它们的负载将流量引导到其他两个。 - MonkeyZeus
11关闭它们。有人会立即告诉你,哪些地方出了问题。 - jscott
3正如jscott所说,即使在关闭状态下,它们仍然能够执行所有记录的任务 :) - Hagen von Eitzen
58请勿关闭电源。如果您想进行尖叫测试,请拔掉以太网线。如果您从未遇到过连续运行两年的设备无法重新启动,那么迟早会有这样的时刻。现在不是增加挫败感的时候。 - Aaron Copley
1@AaronCopley 非常明智的话。我自己也经历过这样的情况。为了记录一下:我并没有关闭它们。我收到了8个装在运输箱里的东西。有几个硬盘坏了,3个电源供应器也坏了。还有2个无法完全恢复一个脏RAID:显然他们只是随意拔掉了那些RAID控制器缓存的电源线和备用电池早已失效。 - Tonny
7除了其他人说的之外,还要:对它们运行nmap。 - Katherine Villyard
回答关于我如何得到这个的问题:这是一个新的支持合同,已经移交过来了。以前的合同不太正式,需要的文件很少。一些东西可以追溯到5年前,所以即使旧公司想帮助我们,实施服务器的技术人员也早已离开。 - Bizmark
2使用本地的数据包嗅探器(例如wireshark)来观察这三者之间以及与外界的交互。你可以录制一段时间,通过不同的方式筛选录制内容,核对端口号等等。只要你知道如何观察,整个画面都会呈现在你眼前 - goldilocks
有关Windows 2003服务器的相关问题。得票最高的答案不特定于操作系统。 - Lilienthal
@goldilocks的建议很好 - 如果你无法直接使用tcpdump/Wireshark,也许你可以将服务器的交换机端口镜像,并在工作站上记录流量而不干扰它。 - TessellatingHeckler
我同意Katherine关于对其运行nmap的说法(从远程机器上)。这很有用,可以为您提供一种“清单”,列出可能处于活动状态的任何开放端口(从而提供关于其功能的有用提示),但并非始终重要。在某些情况下,您甚至可以telnet到不同的端口,只是为了看看是否会收到响应或它们是否监听传入连接。如果您可以直接访问服务器,使用netstat -an同样很有用。 - SeligkeitIstInGott
虽然这个问题非常广泛而且过于笼统,但同时也不是如此。我们中的许多人面临着同样的挑战,尽管我们的具体解决方案会有很大的不同,但事实是,许多新专业人士甚至不知道从何处开始。这个问题似乎为任何人提供了一个良好的起点,即使是经验丰富的专业人士也可以从这里开始。一份清单将非常有帮助! - IceMage
6个回答

拔掉以太网线,看看谁会生气。
但说真的,像这样的神秘机器给团队带来了很多心理负担,而且通常并没有提供任何商业价值。和你的老板谈谈,如果没有人知道它的作用,也许就没有人在意它的作用。

44请勿关闭电源。如果您想进行尖叫测试,请拔掉以太网线。如果您从未遇到过连续运行两年的设备无法重新启动,那么迟早会有这样的时刻。现在不是增加挫败感的时候。(将此内容复制到这里是因为需要阅读。) - Aaron Copley
3你说得百分之百正确,我已经编辑了帖子以反映这一点。我当时有点挖苦,但我仍然可以幽默而不会推动灾难。 - Josh Rumbut
8在断开网络之前,最好保存每台服务器上正在运行的进程和打开的套接字列表 - 以防万一有些东西依赖于服务器之间的TCP连接,而这个连接已经保持了很多个月的ESTABLISHED状态,而没有人考虑自动化所需的步骤来首次打开它。(例如,如果有人临时需要一个ssh端口转发,然后忘记了它。) - kasperd
4别这样做。多么荒谬的建议。愚蠢无思考的IT人员让我浪费了那么多时间和工作。先问一下。如果你不知道该问谁,就向_每个人_都问一下。 - Lightness Races in Orbit
4确保给某人留出足够的时间来尖叫——有一次,我在服务器机房的机架上放了一台积满灰尘的台式机,没人知道它是干什么用的,直到我们拔掉电源线一个月后才有人注意到。结果发现它是工资系统的一部分,没有这台服务器,会计部门就无法生成每月的工资单。这台服务器至少已经无人看管地运行了3年,没有人关注它——所以这个“尖叫测试”是成功的,如果我们不这样做,这台服务器最终会自己死掉。最后我们将它转移到了我们的VMware集群中。 - Johnny
2是的,从直观的角度来看,关闭它可能很有趣,但这可能不明智,并且可能会让你陷入麻烦之中。 - Machavity

这是一个对于Serverfault格式来说比较宽泛的问题,但以下是一个好的开始:
- 检查正在运行的进程和系统启动时计划运行的进程。 - 查看每个进程的运行配置。 - 查看任何定义的数据目录。(也许有人安装了MySQL并启动了它,但没有数据库。) - 检查计划任务。 - 检查日志以查看: - 最近谁登录过(并询问他们)。 - 以及对于正在运行的内容有个大致了解。
由于您没有提到版本,所以我忽略了具体细节。

8有一件比配置系统启动时启动哪些服务更重要的事情。现在有哪些服务正在运行?启动一个服务然后忘记配置它在启动时自动启动并不是一个难犯的错误。相关地,在系统运行时查看其他系统状态是一个好主意,比如挂载点、路由表、iptables规则。所有这些都是在系统运行过程中容易改变的事物,而且可能会忘记更新在启动时使用的配置文件。 - kasperd
我会使用端口扫描器来查看哪些端口是开放的,然后尝试使用常用工具进行连接。举个(简单的)例子,如果端口443是开放的,你可以尝试使用网络浏览器进行连接。我经常不得不探索这些看似被遗弃的服务器,而在/etc和其他位置浏览配置文件的其中一个我最喜欢的工具是使用“lynx”或者如果你更喜欢的话,“links”。它们是基于字符的网络浏览器,作为文件浏览器同样表现出色,并且具有便捷的光标键导航功能。 - aseq
1@kasperd 对于运行与持久服务的公平竞争,我表示赞同。但是,我考虑了防火墙规则、挂载点等等。在我看来,这些似乎是附属组件,已经与现有的要点之一相关联。个人见解可能会有所不同。 - Aaron Copley
请添加 - 检查活动网络连接,并记录服务名称和端口号。最佳方法因操作系统而异。例如,使用net stat命令。另外,在计算机上加入某种跟踪功能,以便您可以查看其在一天中的工作情况。您可能还希望考虑到服务器上运行的程序可能具有恶意行为的情况。 - IceMage

有几件事情你可以做来尝试确定系统上运行了什么。
你可以检查服务器监听的端口,以了解其中的内容。一个好用的命令是:
 [root@server ~]# netstat -tulpn
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             Stat    e       PID/Program name
tcp        0      0 0.0.0.0:139                 0.0.0.0:*                   LIST    EN      1880/smbd
tcp        0      0 0.0.0.0:5666                0.0.0.0:*                   LIST    EN      1911/nrpe
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LIST    EN      1759/sshd

从上面的示例输出中可以看到,它向您呈现协议版本(tcp或udp)、正在被侦听的地址、打开的端口以及正在监听的程序。
在上述截断的示例中(一个服务器机器),您可以看到tcp端口139、5666和22正在侦听。这些分别对应samba、nrpe(Nagios代理)和ssh,并且在检查侦听该端口的程序时得到了确认。
此外,您还可以检查配置为在启动时启动的守护进程的列表,要执行此操作,请运行: chkconfig --list | grep "3:on" 示例:
[root@server ~]# chkconfig --list | grep "3:on"
NetworkManager  0:off   1:off   2:on    3:on    4:on    5:on    6:off
acpid           0:off   1:off   2:on    3:on    4:on    5:on    6:off
sshd            0:off   1:off   2:on    3:on    4:on    5:on    6:off
sysstat         0:off   1:on    2:on    3:on    4:on    5:on    6:off
udev-post       0:off   1:on    2:on    3:on    4:on    5:on    6:off
vncserver       0:off   1:off   2:on    3:on    4:on    5:on    6:off
webmin          0:off   1:off   2:on    3:on    4:off   5:on    6:off
x2gocleansessions       0:off   1:off   2:on    3:on    4:on    5:on    6:off
.
.
.

或者:
service --status-all

5我觉得netstat -plunt更容易记住。 - abligh
2此外,tcpdump 可能对确定实际使用每个服务的人很有帮助。 - abligh

另一种方法涉及检查/etc目录并查看修改日期。在全新安装后,该目录中的所有文件应该具有大致相同的日期/时间。由于安装通常会安装许多人们通常不使用的东西,只有那些具有较晚修改日期的文件才反映出服务器的实际用途。如果这是ext4文件系统,您还应该能够提取目录的创建日期,因此任务可能非常简单。
另一种方法涉及检查.bash_history文件以了解管理员的操作。这个文件可以提供丰富的信息。

检查防火墙规则。幸运的话,它应该配置为默认拒绝。这意味着每个允许的服务都有一个明确的规则。
这比netstat更好,因为它还可以显示开放的端口,例如夜间备份。

一个我还没有看到的答案:检查最近修改的文件。日志、数据库文件、其他输出文件等可能会被写入,这些文件可能提供线索。
find . -mtime -3 

这将在当前目录及其子目录中查找修改过的文件,最近3天内发生的更改。将数字3增加到一个合理的猜测,直到您获得一些可以调查的输出。
这并不是绝对可靠的,因为这些盒子可能只是处理一些网络服务调用,返回一些数据而从未写入任何内容。但是,结合上述提到的强大组合,它可能会提供一些线索。