如何在没有进程 ID 的情况下找出哪些服务正在 Ubuntu 服务器上监听特定端口?

如何在没有进程 ID 的情况下找出哪些服务正在 Ubuntu 服务器上监听特定端口?

尽管有很多类似的问题,但我还是决定发布这个问题,但没有一个能回答我的问题。

  1. 我定期检查我的服务器监听的端口。
  2. 我的 ubuntu 操作系统的输出为lsb_relase -a
Distributor ID: Ubuntu
Description:    Ubuntu 20.04.3 LTS
Release:    20.04
Codename:   focal
  1. 我运行该命令netstat -tulpn4,输出显示一个未知端口:
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      580/systemd-resolve 
tcp        0      0 0.0.0.0:62176           0.0.0.0:*               LISTEN      900/sshd: /usr/sbin 
tcp        0      0 0.0.0.0:1122            0.0.0.0:*               LISTEN      1158/sshd: username    
tcp        0      0 0.0.0.0:3333            0.0.0.0:*               LISTEN      1158/sshd: username    
udp        0      0 0.0.0.0:51820           0.0.0.0:*                           -                   
udp        0      0 127.0.0.53:53           0.0.0.0:*                           580/systemd-resolve 
udp        0      0 X.X.X.X:1194           0.0.0.0:*                           870/openvpn         
  1. 我使用过许多工具和指南来查明为什么我的服务器正在监听端口,51820但却没有找到答案。
  2. 我努力了:
    • sudo lsof -i :51820- 并得到一个空的输出。
    • sudo netstat -ltnp | grep -w ':51820'- 并得到一个空的输出。
    • sudo fuser 51820/udp- 并得到一个空的输出。
    • sudo netstat -peanut | grep ":51820"- 输出为:
udp        0      0 0.0.0.0:51820           0.0.0.0:*                           0          26262      -                   
udp6       0      0 :::51820                :::*                                0          26263      - 
  • sudo ss -nlp | grep 51820输出为:
udp     UNCONN   0        0                                             0.0.0.0:51820                                             0.0.0.0:*                                                                                                     
udp     UNCONN   0        0                                                [::]:51820                                                [::]:*  
  1. 我查看了以下答案并没有找到解决方案:

在网上搜索有关端口的信息后,51820我发现是我安装的“wireguard”正在监听该端口,但问题仍然一样,因为我尝试过的任何命令都无法找到它。

答案1

您正在运行将 Wireguard 作为内核模块实现的操作系统。您的内核正在监听此端口,并且由于没有进程拥有该套接字,因此不会报告任何 PID netstat

答案2

一般:

经过两天对该问题的搜索,我发现和 Michael Hampton 和 Peter Zhabin 一样,没有现有的解决方案可以通过监听端口显示内核进程 ID。

此外,在这两天里,我还寻找了一些commands 可以带来想要的答案的组合,但找不到任何简单或方便的方法来做到这一点。

我创建的解决方案是初步的,我相信社区成员可以对其进行改进。

定位流程折扣

  • 进程运行在内核层或者其他任何避免进程拥有id(PID)的层上。
  • 通过给定命令的输出未找到进程 ID 或进程程序:lsof,,,,。netstatssfuser
  • 我们确实从上述命令的输出中找到了监听端口 - 但是我们无法配置导致监听的程序或 pid。

关于grep

我们将使用grep来查找有关开放端口的更多信息。

grep- 打印与模式匹配的行。

通过命令从grep手册页man grep

DESCRIPTION
grep  searches  for  PATTERNS  in  each  FILE.  PATTERNS is one or more
       patterns separated by newline characters, and  grep  prints  each  line
       that  matches a pattern.  Typically PATTERNS should be quoted when grep
       is used in a shell command.
  • 这里是关于如何正确有效地使用命令的一个重要话题。

如何通过以下方式定位使用给定端口的 PID 或程序grep

就我而言,执行sudo grep --exclude-dir={sys,proc} -rnw / -e 51820 | grep -i port解决了该问题并显示了有关使用该端口的程序的分配信息。

给定的输出:

iptables.service:6:ExecStart=/usr/sbin/iptables -I INPUT -p udp --dport 51820 -j ACCEPT
/home/username/wireguard-install.sh:238:    read -p "Port [51820]: " port
/home/username/wireguard-install.sh:241:        read -p "Port [51820]: " port
/home/username/wireguard-install.sh:243:    [[ -z "$port" ]] && port="51820"
/usr/share/doc/netplan/examples/wireguard.yaml:9:      port: 51820
/etc/wireguard/wg0.conf:8:ListenPort = 51820
/etc/systemd/system/wg-iptables.service:6:ExecStart=/usr/sbin/iptables -I INPUT -p udp --dport 51820 -j ACCEPT
/etc/systemd/system/wg-iptables.service:10:ExecStop=/usr/sbin/iptables -D INPUT -p udp --dport 51820 -j ACCEPT

使用如此多标志的原因在于我尝试过的其他组合会产生大量不必要的输出。

命令的参数grep代表什么:

  • --exclude-dir- 跳过任何具有与模式匹配的名称后缀的命令行目录。

并具体忽略sysproc目录在我们的具体案例中 是为了避免不必要的输出。

例如:grep --exclude-dir={dir1,dir2}在搜索过程中将避免使用 dir1 和 dir2。

  • -r或者-R是递归的。
  • -n是行号。
  • -w代表匹配整个单词。
  • /代表从上到下开始搜索的“最高”目录。
  • -e- 是搜索过程中使用的模式。
  • 51820在我们的具体情况下,这是上述网络监控命令之一发现的端口号。
  • |- 是将第一个命令部分的输出重定向到第二个命令部分的输出的管道。

在我们的例子中:将sudo grep --exclude-dir={sys,proc} -rnw / -e 51820输出重定向到下一个命令grep -i port

  • -i- 忽略模式和输入数据中的大小写区别,使得仅大小写不同的字符相互匹配。
  • port- 为了将结果缩小到我们执行搜索的目的,找到有关标志后定义的特定端口的更多信息-e

尖端:

  • 从目录开始,在第一步中尽可能地使扫描范围最大/,并使用最少的标志来过滤输出,以确保您不会错过我们可以实现的任何细节。
  • 找到想要的输出后,或者由于分配不需要的输出而无法找到想要的输出后,开始逐个添加标志。
  • 指定端口号作为模式,毕竟这是我们的起点和最终目标。
  • 使用双grep命令将第一次扫描重定向到port模式过滤器,它可以精确定位我们并加快解决方案,毕竟我们正在寻找一个数字作为模式,这可能会导致许多不必要的结果。
  • 如果您无法根据给定的输出得出结论,请使用您找到的选定关键词在网络上进行搜索。

相关内容