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

Cra*_*Tux 9 networking ubuntu port process

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

  1. 我定期检查我的服务器侦听的端口。
  2. 我的 ubuntu 操作系统的输出为lsb_relase -a
Distributor ID: Ubuntu
Description:    Ubuntu 20.04.3 LTS
Release:    20.04
Codename:   focal
Run Code Online (Sandbox Code Playgroud)
  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         
Run Code Online (Sandbox Code Playgroud)
  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      - 
Run Code Online (Sandbox Code Playgroud)
  • sudo ss -nlp | grep 51820输出是:
udp     UNCONN   0        0                                             0.0.0.0:51820                                             0.0.0.0:*                                                                                                     
udp     UNCONN   0        0                                                [::]:51820                                                [::]:*  
Run Code Online (Sandbox Code Playgroud)
  1. 我查看了以下答案,但没有找到解决方案:

在网上搜索有关端口的信息后,51820我发现我安装的“wireguard”正在该端口上侦听,但问题仍然与我尝试过的任何命令相同,我无法找到答案。

Pet*_*bin 7

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

  • 我曾经花了相当长的时间挖掘内核代码,看看是否有办法做到这一点,并发现内核在内核套接字的“proto_ops”字段中记录了对拥有套接字的模块的引用,但我不知道可以转储它的用户态工具。 (2认同)

Cra*_*Tux 4

一般:

经过两天的搜索后,我围绕这个问题进行了搜索,我发现像 Michael Hampton 和 Peter Zhabin 一样,没有现有的解决方案可以通过侦听端口显示内核进程 ID。

另外,在那两天里,我还搜索了一些commands 可以带来想要的答案的组合,但没有找到简单或方便的方法来做到这一点。

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

查找流程的折扣

  • 该进程运行在内核级别或任何其他级别,避免进程拥有 id (PID)。
  • 给定命令的输出未找到进程 ID 或进程程序:lsofnetstatssfuser
  • 我们确实从上述命令的输出中找到了一个监听端口 - 但我们无法配置导致监听的程序或 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.
Run Code Online (Sandbox Code Playgroud)
  • 是关于如何正确有效地使用该命令的一个很好的主题。

如何通过以下方式找到 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
Run Code Online (Sandbox Code Playgroud)

许多标志的原因是我尝试过的其他组合有大量不需要的输出。

命令参数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模式过滤器,它可以精确定位我们并加快解决速度,毕竟我们正在寻找数字作为模式,这可能会导致许多不需要的结果。
  • 如果您无法通过给定的输出得出结论,请使用您找到的选定关键字在网络上进行搜索。