【linux端口查看】是什么?理解网络端口
在Linux系统中,“端口”是网络通信中的一个重要概念。它可以被理解为应用程序或服务与网络通信的逻辑终点。每个IP地址可以有65535个端口,这些端口被用来区分同一台计算机上不同服务或进程的网络流量。
端口号从0到65535:
- 0-1023:保留端口(Well-known Ports),通常用于系统或常用服务,如HTTP(80)、HTTPS(443)、SSH(22)、FTP(20, 21)等。需要root权限才能绑定这些端口。
- 1024-49151:注册端口(Registered Ports),分配给用户进程或应用程序。
- 49152-65535:动态或私有端口(Dynamic/Private Ports),通常用于客户端进程的临时端口。
而“linux端口查看”通常指的是通过各种命令和工具,来查看当前Linux系统上哪些端口正在被使用(监听连接或建立了连接),被哪个进程使用,以及连接的状态(如监听中、已建立、等待关闭等)。
【linux端口查看】为什么重要?网络诊断与安全
查看Linux端口的重要性体现在多个方面:
- 故障排除: 当某个网络服务无法访问时,首先需要确认该服务是否在其预期的端口上正常监听。例如,Web服务器无法访问可能是因为80或443端口没有被监听。
- 安全审计: 检查系统上是否存在未授权或意外开放的端口。开放不必要的端口会增加系统的攻击面,可能被恶意利用。
- 性能分析: 查看端口连接状态和数量,可以帮助识别是否存在大量的僵尸连接、连接泄漏或异常的连接模式。
- 服务验证: 确认你部署的应用程序或服务是否成功启动并监听了正确的端口。
- 端口冲突: 当你尝试启动一个服务但报告端口已被占用时,需要查看哪个现有进程占用了该端口。
因此,掌握Linux端口查看的技能,是进行网络诊断、系统维护和安全管理的基础。
【linux端口查看】如何操作?核心命令介绍 (netstat vs ss)
在Linux中,查看端口信息最常用的两个命令是 netstat 和 ss。
- netstat (network statistics): 这是一个老牌且功能强大的工具,几乎在所有Unix/Linux系统上都可用。它可以显示网络连接、路由表、接口统计等信息。
- ss (socket statistics): 这是一个相对较新的工具,属于iproute2工具集的一部分。在处理大量连接时,`ss`通常比`netstat`更快、效率更高,因为它直接从内核获取socket信息。在现代Linux系统中,`ss`是更推荐使用的工具。
虽然`netstat`仍然广泛使用,但对于新的脚本或日常使用,建议优先学习和使用`ss`命令。它们的许多选项是相似的,方便过渡。
【linux端口查看】怎么用?netstat命令详解
netstat命令有很多选项,可以组合使用以获取所需的信息。以下是一些最常用的选项和组合:
常用选项:
-
-a (all): 显示所有连接(监听和非监听,即ESTABLISHED等状态的连接)。
-
-t (tcp): 仅显示TCP连接。
-
-u (udp): 仅显示UDP连接。
-
-l (listening): 仅显示正在监听(LISTEN状态)的端口。
-
-p (programs): 显示使用端口的进程的PID和程序名称。执行此选项通常需要root权限(使用sudo)。
-
-n (numeric): 不解析主机名、端口名和服务名,直接显示IP地址和端口号的数字形式。这会大大加快命令执行速度,特别是在网络配置有问题或DNS解析慢的情况下。
-
-r (routing): 显示内核路由表(与端口查看关系不大,但常与netstat一起使用)。
常用组合示例:
查看所有端口(监听和非监听):
netstat -a
查看所有TCP端口:
netstat -at
查看所有UDP端口:
netstat -au
仅查看监听端口:
netstat -l
查看所有TCP监听端口:
netstat -lt
查看所有UDP监听端口:
netstat -lu
显示进程ID和程序名称(常需sudo):
sudo netstat -p
或查看所有端口的进程信息:
sudo netstat -ap
显示数字地址和端口号(推荐):
netstat -n
常与其它选项组合,例如:
netstat -an
最常用的详细查看命令(监听中的TCP和UDP端口,显示数字地址、进程ID和程序名称):
sudo netstat -tulnp
执行
sudo netstat -tulnp后,你可能会看到类似以下的输出行:Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 789/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1012/master
tcp6 0 0 :::80 :::* LISTEN 1234/nginx
udp 0 0 0.0.0.0:68 0.0.0.0:* 0/systemd-network
解释:
Proto: 协议 (tcp, tcp6, udp, udp6)
Recv-Q: 接收队列的字节数
Send-Q: 发送队列的字节数
Local Address: 本地地址和端口。0.0.0.0表示监听所有IPv4地址,:::表示监听所有IPv6地址。:*表示不特定的远端地址。
Foreign Address: 远端地址和端口。对于LISTEN状态,通常是0.0.0.0:*或:::*。
State: 连接状态,LISTEN表示正在监听连接,ESTABLISHED表示连接已建立,CLOSE_WAIT等待关闭等等。
PID/Program name: 使用该端口的进程ID和程序名称。
【linux端口查看】怎么用?ss命令详解 (推荐!)
ss命令通常比netstat更快,特别是当系统有很多网络连接时。它的选项与netstat非常相似。
常用选项:
-
-a (all): 显示所有连接(监听和非监听)。
-
-t (tcp): 仅显示TCP连接。
-
-u (udp): 仅显示UDP连接.
-
-l (listening): 仅显示正在监听的端口。
-
-p (processes): 显示使用端口的进程的PID和程序名称(常需sudo)。
-
-n (numeric): 不解析主机名、端口名和服务名(推荐)。
-
-s (summary): 显示连接的统计信息摘要。
-
-4 (ipv4): 仅显示IPv4连接。
-
-6 (ipv6): 仅显示IPv6连接。
常用组合示例:
查看所有连接:
ss -a
查看所有TCP连接:
ss -t
查看所有UDP连接:
ss -u
仅查看监听中的TCP端口:
ss -lt
查看所有监听中的端口(显示数字地址和进程信息):
sudo ss -lntu -p
或更简洁的写法(选项顺序不重要):
sudo ss -tulnp
ss命令的输出通常比netstat更简洁,并且在同一行可能包含更多的socket信息(如队列长度、socket选项等)。
例如,sudo ss -tulnp的输出可能类似:Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:((“sshd”,pid=789,fd=3))
tcp LISTEN 0 100 127.0.0.1:25 0.0.0.0:* users:((“master”,pid=1012,fd=13))
tcp LISTEN 0 128 [::]:80 [::]:* users:((“nginx”,pid=1234,fd=6))
udp UNCONN 0 0 0.0.0.0:68 0.0.0.0:* users:((“systemd-network”,pid=0,fd=25))
注意ss在输出进程信息时,默认将PID和程序名包含在”users:(…)”字段中。
查看连接统计信息(快速了解有多少TCP/UDP连接,有多少处于监听状态等):
ss -s
此命令会输出摘要,例如:
Total: 155
TCP: 8 (estab 3, closed 0, orphaned 0, synrecv 0, timewait 0)
Transport Total: 9 TCP: 8 UDP: 1 RAW: 0这可以快速告诉你系统当前的网络连接概况。
【linux端口查看】如何过滤和查找特定端口?
虽然netstat和ss本身提供了一些过滤选项(如-t, -u, -l),但要查找特定端口号、服务名、IP地址或连接状态,通常需要结合使用管道(|)和 grep 命令。
使用grep过滤示例:
查找监听在特定端口(如80)的进程:
sudo ss -tulnp | grep :80
或者使用netstat:
sudo netstat -tulnp | grep :80
注意在端口号前加上冒号 : 可以更精确地匹配端口号,避免匹配到IP地址中的数字。
查找某个特定服务(如ssh)使用的端口:
sudo ss -tulnp | grep sshd
如果输出显示的是端口号而不是服务名,你可以尝试查找端口号22(ssh默认端口):
sudo ss -tulnp | grep :22
查找特定IP地址(如192.168.1.100)的连接:
ss -an | grep 192.168.1.100
使用`-n`选项确保显示的是IP地址而不是主机名。
查找处于特定状态(如ESTABLISHED)的TCP连接:
ss -ant | grep ESTAB
或使用netstat:
netstat -ant | grep ESTAB
查找由特定进程(如nginx)打开的端口:
sudo ss -tulnp | grep nginx
通过灵活使用grep,你可以从netstat或ss的输出中提取出你需要关心的特定信息。
【linux端口查看】如何区分TCP、UDP、IPv4、IPv6?
正如前面提到的,-t 选项用于显示TCP连接,-u 选项用于显示UDP连接。你可以单独使用它们,或者组合使用但不指定协议(netstat/ss会显示所有协议)。
区分IPv4和IPv6连接:
- netstat命令有 -4 和 -6 选项来分别过滤IPv4和IPv6。例如:
netstat -4 -an(仅IPv4)
netstat -6 -an(仅IPv6) - ss命令同样有 -4 和 -6 选项:
ss -4 -an(仅IPv4)
ss -6 -an(仅IPv6)
另外,通过查看“Local Address”和“Foreign Address”列的格式也可以区分:
- IPv4地址格式为点分十进制,如
192.168.1.100或0.0.0.0。 - IPv6地址格式通常包含冒号,如
fe80::1或::1(表示localhost),以及用于监听所有IPv6地址的:::。
例如,在 `netstat -tulnp` 或 `ss -tulnp` 的输出中:
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 789/sshd
表示sshd正在监听所有IPv4地址的22端口(TCP协议)。
tcp6 0 0 :::80 :::* LISTEN 1234/nginx
表示nginx正在监听所有IPv6地址的80端口(TCP协议)。
【linux端口查看】哪里可以找到更多信息?
除了netstat和ss命令的输出,Linux系统还通过伪文件系统 `/proc` 提供了底层的网络连接信息。
-
/proc/net/tcp:包含当前所有TCP连接的详细信息。
-
/proc/net/udp:包含当前所有UDP连接的详细信息。
-
/proc/net/tcp6:包含当前所有IPv6 TCP连接的信息。
-
/proc/net/udp6:包含当前所有IPv6 UDP连接的信息。
这些文件包含了原始的连接状态、本地/远程地址和端口(通常是十六进制表示)、inode号等信息。netstat和ss命令就是解析这些文件(或其他内核API)来生成用户友好的输出的。虽然直接查看这些文件(如使用 `cat /proc/net/tcp`)对于普通用户来说不太直观,但了解它们的存在有助于深入理解网络工具的工作原理。
另外,端口号与服务名的对应关系通常存储在文件 /etc/services 中。你可以查看这个文件来了解某个常用端口通常对应哪个服务,反之亦然。
【linux端口查看】有多少端口?如何统计?
一个系统理论上可以拥有的端口数量是固定的:0到65535,共 65536 个。
而“当前有多少端口在使用/监听”是一个动态变化的问题,取决于系统运行的服务和建立的网络连接数量。
要获取当前连接的统计信息,最快的方法是使用 ss -s 命令。它会给出一个快速的连接状态摘要,告诉你TCP、UDP连接的总数,以及处于各种状态(如ESTAB, LISTEN, TIME-WAIT等)的连接数量。
如果你想精确计算监听中的TCP端口数量,可以使用:
ss -tln | grep LISTEN | wc -l
这个命令链的含义是:
- ss -tln:列出所有TCP监听端口,以数字形式显示。
- grep LISTEN:从输出中过滤出包含”LISTEN”的行(即处于监听状态的端口)。
- wc -l:统计过滤后输出的行数,即监听端口的数量。
类似地,你可以修改选项来统计UDP端口、所有端口等。例如,统计所有监听端口:
ss -ln | grep LISTEN | wc -l
请注意,这些统计方法计算的是“监听的端口数量”或“连接的数量”,而不是系统中“总共有多少端口”。总端口数始终是65536。
总结与最佳实践
查看Linux端口是系统管理和网络故障排除的核心技能。
- 推荐使用 ss 命令,它在现代系统上通常比netstat更快。
- 始终优先使用 -n 选项来显示数字地址和端口号,可以显著提高命令速度和输出清晰度。
- 需要查看进程信息时,通常需要使用 sudo 执行命令,例如 sudo ss -tulnp。
- 结合 grep 命令可以方便地过滤输出,查找特定端口、服务或连接状态。
- 了解 ss -s 可以快速获得网络连接的统计概览。
通过熟练掌握这些命令和技巧,你可以轻松地查看和诊断Linux系统上的网络端口使用情况。