这个问题类似于网络端口打开,但没有附加进程?和netstat 显示没有 pid 的监听端口,但 lsof 没有
我尝试了所有我能做的(以 root 身份:netstat、lsof、ls -al /proc/*/fd 等),但我找不到 pid。
无论如何,我必须关闭或释放没有 pid 的端口,因为我的进程想要监听它。有什么办法吗?
我不想重启服务器。因为我的系统中有一个进程,它会更新我所有服务器中的 bin 文件,然后自动部署所有服务器。当 7123 或其他端口被监听时,部署将失败。
谢谢。
更多细节
这种情况有三台服务器,全部都是 Rackspace 的服务器,并且所有“坏端口”都是 udp 端口 7123。
重启可以解决这个问题,我已经在三台服务器中的一台上尝试过了。但我不想重启服务器。
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
udp 213120 0 134.213.205.214:7123 0.0.0.0:* -
nmap的结果显示该端口并未关闭。(@Enzo)
root@auto:~# nmap 134.213.205.214 -p 7123 -sU
Starting Nmap 6.40 ( http://nmap.org ) at 2018-04-16 12:01 UTC
Nmap scan report for auto (134.213.205.214)
Host is up.
PORT STATE SERVICE
7123/udp open|filtered unknown
Nmap done: 1 IP address (1 host up) scanned in 2.12 seconds
更新
目前,重启是关闭/释放此端口的唯一方法。但重启不是一个好主意,它会导致服务停止。
答案1
您的系统可能处于不一致的状态。我会先进行一些基本诊断。
检查UDP套接字及其进程。
运行sudo netstat -lunp
或sudo ss -lunp
查看 UDP 套接字(在端口 7123 上)是否繁忙sudo
。普通的用户提升权限并查看 PID 和进程名称 who's "聆听“在该端口上。如果没有,sudo
则会有一个-
代替 PID 和进程名称。记下 PID。如果没有列出,那么您可以开始认为您的系统已被入侵,因为该进程能够通过操纵进程的内部内核结构来隐藏自己!
如果您看不到具有高权限的 PID,那么您最好隔离该服务器,因为它可能已被破坏和黑客入侵。
检查监听过程是否也“说“
我建议使用nmap或者更一般的网猫工具。nmap
你可以尝试以下命令:
sudo nmap -sV -v -Pn -sU -p U:7123 134.213.205.214
它尝试理解端口 UDP:7123 上使用的协议。sudo
特定扫描类型(UDP 服务扫描)需要此协议。如果您看到的数据与您的预期不符,则可能是进程失控或处于不一致的状态。或者它已被其他(恶意?)代码替换。
您netcat
需要一些手动干预来为服务器生成流量:
netcat -u 134.213.205.214 7123
无论您输入什么,都将通过端口 UDP:7123 发送到您的应用程序。您还可以使用以下命令传输一些随机数据(但不要期望任何有意义的结果):
cat /dev/urandom | netcat -u 134.213.205.214 7123
检查系统和应用程序日志(如果有)
前者通常存储在/var/log/
目录中。应用程序日志可能位于其他任何地方。lsof
如果您检查其第二列上的 PID,该工具可能会有所帮助。我会在后续操作中密切关注这些日志。
检查该 PID 的进程表
该命令ps
可以提供很多有关进程的详细信息。我个人最喜欢的是:
PS_FORMAT="ruser,pid,ppid,s,%cpu,rss,cmd" ps ax --sort=pid
您可以在第二列中看到要查找的 PID,以及真实用户ID(ruser,第一栏),父 PID(ppid,第 3 列),地位(s,第四),% CPU使用率(%cpu,第 5 位),驻留集大小(rss,第 6)和命令行带参数(cmd,第 7 个)。在我看来,对于这种情况,进程状态(单个字母)和 CPU 使用率百分比以及命令行是关键值。
检查手册页了解所有细节ps
并微调输出。
检查二进制文件
如果您有另一台具有相同架构和操作系统的机器,并且相同的进程以预期的方式运行,您可以检查二进制文件是否逐字节匹配。如果不匹配,您最好从已知的安全来源重新安装这些二进制文件。
假设程序是/usr/local/bin/myserver
。
计算并记下它的校验和。如下所示:
sha512sum /usr/local/bin/myserver
如果程序已编译为使用动态库,那么您还需要检查它们。使用以下方法可获得已使用的动态库列表:
ldd /usr/local/bin/myserver
请注意:输出可能很长,但对于每一行,您都需要计算并记下校验和以供比较。
如果发现与参考受信任系统有任何差异,我建议重新安装整个系统和应用程序。这是一种激进的方法,但我认为目标系统不再值得信任。
终止并重新启动进程
我会尝试终止恶意进程(前提是你知道它的 PID)并重新启动它,以检查恶意行为是否持续。为了根据 PID 终止进程,你可以运行:
sudo kill -s SIGKILL <PID>
我需要提醒您,在很多情况下,进程不会终止或终止时间比预期的要晚。这主要取决于ps
之前运行的命令所显示的进程状态。所引用的手册页在“进程状态代码”段落中报告了有关进程状态列的一些信息。
使用该命令ps
再次检查进程状态。它通常会在几秒钟内被踢出并从进程列表中消失。
一旦进程被终止,您可以尝试重新启动它并查看恶意行为是否会重复。
一般来说,如果您不对系统进行任何更改,则行为几乎也不会改变。也就是说,仅仅重新启动应用程序或系统几乎无法解决问题:它只会被推后一段时间。