尽管有很多类似的问题,但我还是决定发布这个问题,但没有一个能回答我的问题。
- 我定期检查我的服务器监听的端口。
- 我的 ubuntu 操作系统的输出为
lsb_relase -a
:
Distributor ID: Ubuntu
Description: Ubuntu 20.04.3 LTS
Release: 20.04
Codename: focal
- 我运行该命令
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
- 我使用过许多工具和指南来查明为什么我的服务器正在监听端口,
51820
但却没有找到答案。 - 我努力了:
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 [::]:*
- 我查看了以下答案并没有找到解决方案:
在网上搜索有关端口的信息后,51820
我发现是我安装的“wireguard”正在监听该端口,但问题仍然一样,因为我尝试过的任何命令都无法找到它。
答案1
您正在运行将 Wireguard 作为内核模块实现的操作系统。您的内核正在监听此端口,并且由于没有进程拥有该套接字,因此不会报告任何 PID netstat
。
答案2
一般:
经过两天对该问题的搜索,我发现和 Michael Hampton 和 Peter Zhabin 一样,没有现有的解决方案可以通过监听端口显示内核进程 ID。
此外,在这两天里,我还寻找了一些commands
可以带来想要的答案的组合,但找不到任何简单或方便的方法来做到这一点。
我创建的解决方案是初步的,我相信社区成员可以对其进行改进。
定位流程折扣
- 进程运行在内核层或者其他任何避免进程拥有id(PID)的层上。
- 通过给定命令的输出未找到进程 ID 或进程程序:
lsof
,,,,。netstat
ss
fuser
- 我们确实从上述命令的输出中找到了监听端口 - 但是我们无法配置导致监听的程序或 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
- 跳过任何具有与模式匹配的名称后缀的命令行目录。
并具体忽略sys
和proc
目录在我们的具体案例中 是为了避免不必要的输出。
例如: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
模式过滤器,它可以精确定位我们并加快解决方案,毕竟我们正在寻找一个数字作为模式,这可能会导致许多不必要的结果。 - 如果您无法根据给定的输出得出结论,请使用您找到的选定关键词在网络上进行搜索。