我找不到如何列出或“读取”Linux 上打开的端口列表。我有一台基于 Debian 的服务器。我找到了大量列出打开端口的命令,但我找不到任何列出可以从外部访问的打开端口的命令。我知道 3309 是打开的,但我已经将 mySQL 配置为仅回复本地主机,但该端口仍列为打开。再说一次,我只对向外界开放的端口感兴趣。
如果没有这样的命令,也许有一个 grep 可以过滤掉仅限内部的端口?
答案1
您可能无法找到一个简单的答案,因为这个问题比您想象的要复杂得多。至少有 3 个可能值得关注的点:
服务器上正在监听的端口。
netstat -an | grep LISTEN
将为您提供一个大致的概念。查找源地址 0.0.0.0 或特定的“外部”接口(如果适用,请不要忘记 IPv6 地址)。服务器防火墙(通常是 iptables)。
iptables -l
将提供一些允许哪些流量的信息。但它还应该向您显示服务器级别执行的任何 NAT/端口重定向。例如,您的端口 3309 可能会重定向到 127.0.0.1:3309。因此,即使您的 mysql 可能只在本地主机上监听,从技术上讲它也可以从“外部”世界访问。您的边缘防火墙。这是您的互联网路由器/网关。这里最简单的做法是转到“外部世界”中的服务器(无论是开放的互联网,还是您网络上的其他地方,等等 - 问题中没有明确定义),然后运行
nmap <your-external-ip>
并查看它报告为开放的内容。这样做的缺点是,如果您的服务器没有专用 IP,您可能会看到很多不适用于您的特定服务器的内容。
这三件事将回答您的大部分问题,但我相信其他人会有更多的想法/建议。
答案2
您好,欢迎来到 ServerFault。
这个怎么样?
ss -tulpen | grep -vEe "\s+127[.]|::1"
这将从输出中删除 127.0.0.0/8 和 ::1 地址。
虽然这确实列出了所有在此框上可访问的地址上侦听的 TCP 和 UDP 端口,但它没有告诉你它们是否实际上可访问。防火墙(IPTables/Netfilter、外部设备)或安全策略(SELinux、SystemD、tcpwrappers)可能仍会阻止访问。
编辑 如果你想知道端口确实可以从外界访问,将一个主机放置在所述“外部世界”(例如互联网)中,并在该主机上运行针对您的服务器的端口扫描器(如 nmap)。
nmap 示例:
sudo nmap -sS -p1-65535 <your_server's_ip>
答案3
您可以使用 netstat 命令。需要与 netstat 命令一起使用的开关来显示守护进程在服务器上监听的程序名称、端口号和协议,如下所示。
netstat -ntlp