对于 Linux 系统管理员来说,清楚某个服务是否正确地绑定或监听某个端口,是至关重要的。如果你需要处理端口相关的问题,这篇文章可能会对你有用。
端口是 Linux 系统上特定进程之间逻辑连接的标识,包括物理端口和软件端口。由于 Linux 操作系统是一个软件,因此本文只讨论软件端口。软件端口始终与主机的 IP 地址和相关的通信协议相关联,因此端口常用于区分应用程序。大部分涉及到网络的服务都必须打开一个套接字来监听传入的网络请求,而每个服务都使用一个独立的套接字。
推荐阅读:
套接字是和 IP 地址、软件端口和协议结合起来使用的,而端口号对传输控制协议(TCP)和用户数据报协议(UDP)协议都适用,TCP 和 UDP 都可以使用 0 到 65535 之间的端口号进行通信。
以下是端口分配类别:
- 0 - 1023: 常用端口和系统端口
- 1024 - 49151: 软件的注册端口
- 49152 - 65535: 动态端口或私有端口
在 Linux 上的 /etc/services
文件可以查看到更多关于保留端口的信息。
1 | # less /etc/services |
可以使用以下六种方法查看端口信息。
ss
:可以用于转储套接字统计信息。netstat
:可以显示打开的套接字列表。lsof
:可以列出打开的文件。fuser
:可以列出那些打开了文件的进程的进程 ID。nmap
:是网络检测工具和端口扫描程序。systemctl
:是 systemd 系统的控制管理器和服务管理器。
以下我们将找出 sshd
守护进程所使用的端口号。
方法 1:使用 ss 命令
ss
一般用于转储套接字统计信息。它能够输出类似于 netstat
输出的信息,但它可以比其它工具显示更多的 TCP 信息和状态信息。
它还可以显示所有类型的套接字统计信息,包括 PACKET、TCP、UDP、DCCP、RAW、Unix 域等。
1 | # ss -tnlp | grep ssh |
也可以使用端口号来检查。
1 | # ss -tnlp | grep ":22" |
方法 2:使用 netstat 命令
netstat
能够显示网络连接、路由表、接口统计信息、伪装连接以及多播成员。
默认情况下,netstat
会列出打开的套接字。如果不指定任何地址族,则会显示所有已配置地址族的活动套接字。但 netstat
已经过时了,一般会使用 ss
来替代。
1 | # netstat -tnlp | grep ssh |
也可以使用端口号来检查。
1 | # netstat -tnlp | grep ":22" |
方法 3:使用 lsof 命令
lsof
能够列出打开的文件,并列出系统上被进程打开的文件的相关信息。
1 | # lsof -i -P | grep ssh |
也可以使用端口号来检查。
1 | # lsof -i tcp:22 |
方法 4:使用 fuser 命令
fuser
工具会将本地系统上打开了文件的进程的进程 ID 显示在标准输出中。
1 | # fuser -v 22/tcp |
方法 5:使用 nmap 命令
nmap
(“Network Mapper”)是一款用于网络检测和安全审计的开源工具。它最初用于对大型网络进行快速扫描,但它对于单个主机的扫描也有很好的表现。
nmap
使用原始 IP 数据包来确定网络上可用的主机,这些主机的服务(包括应用程序名称和版本)、主机运行的操作系统(包括操作系统版本等信息)、正在使用的数据包过滤器或防火墙的类型,以及很多其它信息。
1 | # nmap -sV -p 22 localhost |
方法 6:使用 systemctl 命令
systemctl
是 systemd 系统的控制管理器和服务管理器。它取代了旧的 SysV 初始化系统管理,目前大多数现代 Linux 操作系统都采用了 systemd。
推荐阅读:
1 | # systemctl status sshd |
以上输出的内容显示了最近一次启动 sshd
服务时 ssh
服务的监听端口。但它不会将最新日志更新到输出中。
1 | # systemctl status sshd |
大部分情况下,以上的输出不会显示进程的实际端口号。这时更建议使用以下这个 journalctl
命令检查日志文件中的详细信息。
1 | # journalctl | grep -i "openssh\|sshd" |
via: https://www.2daygeek.com/how-to-find-out-which-port-number-a-process-is-using-in-linux/