由于某些原因，你可能经常需要查找端口名称和端口号。如果是这样，你很幸运。今天，在这个简短的教程中，我们将看到在 Linux 系统中最简单、最快捷的查找服务端口号的方法。可能有很多方法可以做到，但我目前只知道以下三种方法。请继续阅读。在 Linux 中查找服务的端口号方法1：使用 grep 命令要使用 grep 命令在 Linux 中查找指定服务的默认端口号，只需运行：$ grep <port> /etc/services例如，要查找 SSH 服务的默认端口，只需运行：$ grep ssh /etc/services就这么简单。此命令应该适用于大多数 Linux 发行版。以下是我的 Arch Linux 测试机中的示例输出：ssh 22/tcp ssh 22/udp ssh 22/sctp sshell 614/tcp sshell 614/udp netconf-ssh 830/tcp netconf-ssh 830/udp sdo-ssh 3897/tcp sdo-ssh 3897/udp netconf-ch-ssh 4334/tcp snmpssh 5161/tcp snmpssh-trap 5162/tcp tl1-ssh 6252/tcp tl1-ssh 6252/udp ssh-mgmt 17235/tcp ssh-mgmt 17235/udp正如你在上面的输出中所看到的，SSH 服务的默认端口号是 22。让我们找到 Apache Web 服务器的端口号。为此，命令是：$ grep http /etc/services # http://www.iana.org/assignments/port-numbers http 80/tcp www www-http # WorldWideWeb HTTP http 80/udp www www-http # HyperText Transfer Protocol http 80/sctp # HyperText Transfer Protocol https 443/tcp # http protocol over TLS/SSL https 443/udp # http protocol over TLS/SSL https 443/sctp # http protocol over TLS/SSL gss-http 488/tcp gss-http 488/udp webcache 8080/tcp http-alt # WWW caching service webcache 8080/udp http-alt # WWW caching service [...]FTP 端口号是什么？这很简单！$ grep ftp /etc/services ftp-data 20/tcp ftp-data 20/udp # 21 is registered to ftp, but also used by fsp ftp 21/tcp ftp 21/udp fsp fspd tftp 69/tcp [...]方法 2：使用 getent 命令如你所见，上面的命令显示指定搜索词 “ssh”、“http” 和 “ftp” 的所有端口名称和数字。这意味着，你将获得与给定搜索词匹配的所有端口名称的相当长的输出。但是，你可以使用 getent 命令精确输出结果，如下所示：$ getent services ssh ssh 22/tcp $ getent services http http 80/tcp www www-http $ getent services ftp ftp 21/tcp如果你不知道端口名称，但是知道端口号，那么你只需将端口名称替换为数字：$ getent services 80 http 80/tcp要显示所有端口名称和端口号，只需运行：$ getent services方法 3：使用 Whatportis 程序Whatportis 是一个简单的 Python 脚本，来用于查找端口名称和端口号。与上述命令不同，此程序以漂亮的表格形式输出。确保已安装 pip 包管理器。如果没有，请参考以下链接。如何使用 pip 管理 Python 包安装 pip 后，运行以下命令安装 Whatportis 程序。$ pip install whatportis现在，你可以找到与服务关联的端口，如下所示。$ whatportis ssh $ whatportis ftp $ whatportis http我的 CentOS 7 服务器的示例输出：在 Linux 中查找服务的端口号如果你不知道服务的确切名称，请使用 –like 标志来显示相关结果。$ whatportis mysql --like上述命令帮助你查找与服务关联的端口。你还可以找到与端口号相关联的服务，如下所示。$ whatportis 993你甚至可以以 JSON 格式显示结果。$ whatportis 993 --json有关更多详细信息，请参阅 GitHub 仓库。Whatportis GitHub 仓库就是这些了。你现在知道了如何使用三种简单方法在 Linux 中查找端口名称和端口号。如果你知道任何其他方法/命令，请在下面的评论栏告诉我。我会查看并更相应地更新本指南。via: https://www.ostechnix.com/how-to-find-the-port-number-of-a-service-in-linux/作者：sk 选题：lujun9972 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
如何检查多个远程 Linux 系统是否打开了指定端口？
我们最近写了一篇文章关于如何检查远程 Linux 服务器是否打开指定端口。它能帮助你检查单个服务器。如果要检查五个服务器有没有问题，可以使用以下任何一个命令，如 nc（netcat）、nmap 和 telnet。但是如果想检查 50 多台服务器，那么你的解决方案是什么？要检查所有服务器并不容易，如果你一个一个这样做，完全没有必要，因为这样你将会浪费大量的时间。为了解决这种情况，我使用 nc 命令编写了一个 shell 小脚本，它将允许我们扫描任意数量服务器给定的端口。如果你要查找单个服务器扫描，你有多个选择，你只需阅读 检查远程 Linux 系统上的端口是否打开？ 了解更多信息。本教程中提供了两个脚本，这两个脚本都很有用。这两个脚本都用于不同的目的，你可以通过阅读标题轻松理解其用途。在你阅读这篇文章之前，我会问你几个问题，如果你不知道答案你可以通过阅读这篇文章来获得答案。如何检查一个远程 Linux 服务器上指定的端口是否打开？如何检查多个远程 Linux 服务器上指定的端口是否打开？如何检查多个远程 Linux 服务器上是否打开了多个指定的端口？什么是 nc（netcat）命令？nc 即 netcat。它是一个简单实用的 Unix 程序，它使用 TCP 或 UDP 协议进行跨网络连接进行数据读取和写入。它被设计成一个可靠的 “后端” 工具，我们可以直接使用或由其他程序和脚本轻松驱动它。同时，它也是一个功能丰富的网络调试和探索工具，因为它可以创建你需要的几乎任何类型的连接，并具有几个有趣的内置功能。netcat 有三个主要的模式。分别是连接模式，监听模式和隧道模式。nc（netcat）的通用语法：$ nc [-options] [HostName or IP] [PortNumber]如何检查多个远程 Linux 服务器上的端口是否打开？如果要检查多个远程 Linux 服务器上给定端口是否打开，请使用以下 shell 脚本。在我的例子中，我们将检查端口 22 是否在以下远程服务器中打开，确保你已经更新文件中的服务器列表而不是使用我的服务器列表。你必须确保已经更新服务器列表 ：server-list.txt 。每个服务器（IP）应该在单独的行中。# cat server-list.txt 192.168.1.2 192.168.1.3 192.168.1.4 192.168.1.5 192.168.1.6 192.168.1.7使用以下脚本可以达到此目的。# vi port_scan.sh #!/bin/sh for server in `more server-list.txt` do #echo $i nc -zvw3 $server 22 done设置 port_scan.sh 文件的可执行权限。$ chmod +x port_scan.sh最后运行脚本来达到此目的。# sh port_scan.sh Connection to 192.168.1.2 22 port [tcp/ssh] succeeded! Connection to 192.168.1.3 22 port [tcp/ssh] succeeded! Connection to 192.168.1.4 22 port [tcp/ssh] succeeded! Connection to 192.168.1.5 22 port [tcp/ssh] succeeded! Connection to 192.168.1.6 22 port [tcp/ssh] succeeded! Connection to 192.168.1.7 22 port [tcp/ssh] succeeded!如何检查多个远程 Linux 服务器上是否打开多个端口？如果要检查多个服务器中的多个端口，请使用下面的脚本。在我的例子中，我们将检查给定服务器的 22 和 80 端口是否打开。确保你必须替换所需的端口和服务器名称而不使用是我的。你必须确保已经将要检查的端口写入 port-list.txt 文件中。每个端口应该在一个单独的行中。# cat port-list.txt 22 80你必须确保已经将要检查的服务器（IP 地址）写入 server-list.txt 到文件中。每个服务器（IP） 应该在单独的行中。# cat server-list.txt 192.168.1.2 192.168.1.3 192.168.1.4 192.168.1.5 192.168.1.6 192.168.1.7使用以下脚本来达成此目的。# vi multiple_port_scan.sh #!/bin/sh for server in `more server-list.txt` do for port in `more port-list.txt` do #echo $server nc -zvw3 $server $port echo "" done done设置 multiple_port_scan.sh 文件的可执行权限。$ chmod +x multiple_port_scan.sh最后运行脚本来实现这一目的。# sh multiple_port_scan.sh Connection to 192.168.1.2 22 port [tcp/ssh] succeeded! Connection to 192.168.1.2 80 port [tcp/http] succeeded! Connection to 192.168.1.3 22 port [tcp/ssh] succeeded! Connection to 192.168.1.3 80 port [tcp/http] succeeded! Connection to 192.168.1.4 22 port [tcp/ssh] succeeded! Connection to 192.168.1.4 80 port [tcp/http] succeeded! Connection to 192.168.1.5 22 port [tcp/ssh] succeeded! Connection to 192.168.1.5 80 port [tcp/http] succeeded! Connection to 192.168.1.6 22 port [tcp/ssh] succeeded! Connection to 192.168.1.6 80 port [tcp/http] succeeded! Connection to 192.168.1.7 22 port [tcp/ssh] succeeded! Connection to 192.168.1.7 80 port [tcp/http] succeeded!via: https://www.2daygeek.com/check-a-open-port-on-multiple-remote-linux-server-using-nc-command/作者：Magesh Maruthamuthu 选题：lujun9972 译者：zero-MK 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
最近，我们就同一主题写了两篇文章。这些文章内容帮助你如何检查远程服务器中给定的端口是否打开。如果你想 检查远程 Linux 系统上的端口是否打开 请点击链接浏览。如果你想 检查多个远程 Linux 系统上的端口是否打开 请点击链接浏览。如果你想 检查多个远程 Linux 系统上的多个端口状态 请点击链接浏览。但是本文帮助你检查本地系统上的开放端口列表。在 Linux 中很少有用于此目的的实用程序。然而，我提供了四个最重要的 Linux 命令来检查这一点。你可以使用以下四个命令来完成这个工作。这些命令是非常出名的并被 Linux 管理员广泛使用。netstat：netstat (“network statistics”) 是一个显示网络连接（进和出）相关信息命令行工具，例如：路由表, 伪装连接,多点传送成员和网络端口。nmap：Nmap (“Network Mapper”) 是一个网络探索与安全审计的开源工具。它旨在快速扫描大型网络。ss： ss 被用于转储套接字统计信息。它也可以类似 netstat 使用。相比其他工具它可以展示更多的TCP状态信息。lsof： lsof 是 List Open File 的缩写. 它用于输出被某个进程打开的所有文件。如何使用 Linux 命令 netstat 检查系统中的开放端口列表netstat 是 Network Statistics 的缩写，是一个显示网络连接（进和出）相关信息命令行工具，例如：路由表、伪装连接、多播成员和网络端口。它可以列出所有的 tcp、udp 连接和所有的 unix 套接字连接。它用于发现发现网络问题，确定网络连接数量。# netstat -tplugn Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN 2038/master tcp 0 0 127.0.0.1:199 0.0.0.0:* LISTEN 1396/snmpd tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1398/httpd tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1388/sshd tcp6 0 0 :::25 :::* LISTEN 2038/master tcp6 0 0 :::22 :::* LISTEN 1388/sshd udp 0 0 0.0.0.0:39136 0.0.0.0:* 1396/snmpd udp 0 0 0.0.0.0:56130 0.0.0.0:* 1396/snmpd udp 0 0 0.0.0.0:40105 0.0.0.0:* 1396/snmpd udp 0 0 0.0.0.0:11584 0.0.0.0:* 1396/snmpd udp 0 0 0.0.0.0:30105 0.0.0.0:* 1396/snmpd udp 0 0 0.0.0.0:50656 0.0.0.0:* 1396/snmpd udp 0 0 0.0.0.0:1632 0.0.0.0:* 1396/snmpd udp 0 0 0.0.0.0:28265 0.0.0.0:* 1396/snmpd udp 0 0 0.0.0.0:40764 0.0.0.0:* 1396/snmpd udp 0 0 10.90.56.21:123 0.0.0.0:* 895/ntpd udp 0 0 127.0.0.1:123 0.0.0.0:* 895/ntpd udp 0 0 0.0.0.0:123 0.0.0.0:* 895/ntpd udp 0 0 0.0.0.0:53390 0.0.0.0:* 1396/snmpd udp 0 0 0.0.0.0:161 0.0.0.0:* 1396/snmpd udp6 0 0 :::123 :::* 895/ntpd IPv6/IPv4 Group Memberships Interface RefCnt Group --------------- ------ --------------------- lo 1 224.0.0.1 eth0 1 224.0.0.1 lo 1 ff02::1 lo 1 ff01::1 eth0 1 ff02::1 eth0 1 ff01::1你也可以使用下面的命令检查特定的端口。# # netstat -tplugn | grep :22 tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1388/sshd tcp6 0 0 :::22 :::* LISTEN 1388/sshd如何使用 Linux 命令 ss 检查系统中的开放端口列表？ss 被用于转储套接字统计信息。它也可以显示类似 netstat 的信息。相比其他工具它可以展示更多的 TCP 状态信息。# ss -lntu Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port udp UNCONN 0 0 *:39136 *:* udp UNCONN 0 0 *:56130 *:* udp UNCONN 0 0 *:40105 *:* udp UNCONN 0 0 *:11584 *:* udp UNCONN 0 0 *:30105 *:* udp UNCONN 0 0 *:50656 *:* udp UNCONN 0 0 *:1632 *:* udp UNCONN 0 0 *:28265 *:* udp UNCONN 0 0 *:40764 *:* udp UNCONN 0 0 10.90.56.21:123 *:* udp UNCONN 0 0 127.0.0.1:123 *:* udp UNCONN 0 0 *:123 *:* udp UNCONN 0 0 *:53390 *:* udp UNCONN 0 0 *:161 *:* udp UNCONN 0 0 :::123 :::* tcp LISTEN 0 100 *:25 *:* tcp LISTEN 0 128 127.0.0.1:199 *:* tcp LISTEN 0 128 *:80 *:* tcp LISTEN 0 128 *:22 *:* tcp LISTEN 0 100 :::25 :::* tcp LISTEN 0 128 :::22 :::*你也可以使用下面的命令检查特定的端口。# # ss -lntu | grep ':25' tcp LISTEN 0 100 *:25 *:* tcp LISTEN 0 100 :::25 :::*如何使用 Linux 命令 nmap 检查系统中的开放端口列表？Nmap (“Network Mapper”) 是一个网络探索与安全审计的开源工具。它旨在快速扫描大型网络，当然它也可以工作在独立主机上。Nmap 使用裸 IP 数据包以一种新颖的方式来确定网络上有哪些主机可用，这些主机提供什么服务（应用程序名称和版本），它们运行什么操作系统（版本），使用什么类型的数据包过滤器/防火墙，以及许多其他特征。虽然 Nmap 通常用于安全审计，但许多系统和网络管理员发现它对于日常工作也非常有用，例如网络资产清点、管理服务升级计划以及监控主机或服务正常运行时间。# nmap -sTU -O localhost Starting Nmap 6.40 ( http://nmap.org ) at 2019-03-20 09:57 CDT Nmap scan report for localhost (127.0.0.1) Host is up (0.00028s latency). Other addresses for localhost (not scanned): 127.0.0.1 Not shown: 1994 closed ports PORT STATE SERVICE 22/tcp open ssh 25/tcp open smtp 80/tcp open http 199/tcp open smux 123/udp open ntp 161/udp open snmp Device type: general purpose Running: Linux 3.X OS CPE: cpe:/o:linux:linux_kernel:3 OS details: Linux 3.7 - 3.9 Network Distance: 0 hops OS detection performed. Please report any incorrect results at http://nmap.org/submit/ . Nmap done: 1 IP address (1 host up) scanned in 1.93 seconds你也可以使用下面的命令检查特定的端口。# nmap -sTU -O localhost | grep 123 123/udp open ntp如何使用 Linux 命令 lsof 检查系统中的开放端口列表？它向你显示系统上打开的文件列表以及打开它们的进程。还会向你显示与文件相关的其他信息。# lsof -i COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME ntpd 895 ntp 16u IPv4 18481 0t0 UDP *:ntp ntpd 895 ntp 17u IPv6 18482 0t0 UDP *:ntp ntpd 895 ntp 18u IPv4 18487 0t0 UDP localhost:ntp ntpd 895 ntp 20u IPv4 23020 0t0 UDP CentOS7.2daygeek.com:ntp sshd 1388 root 3u IPv4 20065 0t0 TCP *:ssh (LISTEN) sshd 1388 root 4u IPv6 20067 0t0 TCP *:ssh (LISTEN) snmpd 1396 root 6u IPv4 22739 0t0 UDP *:snmp snmpd 1396 root 7u IPv4 22729 0t0 UDP *:40105 snmpd 1396 root 8u IPv4 22730 0t0 UDP *:50656 snmpd 1396 root 9u IPv4 22731 0t0 UDP *:pammratc snmpd 1396 root 10u IPv4 22732 0t0 UDP *:30105 snmpd 1396 root 11u IPv4 22733 0t0 UDP *:40764 snmpd 1396 root 12u IPv4 22734 0t0 UDP *:53390 snmpd 1396 root 13u IPv4 22735 0t0 UDP *:28265 snmpd 1396 root 14u IPv4 22736 0t0 UDP *:11584 snmpd 1396 root 15u IPv4 22737 0t0 UDP *:39136 snmpd 1396 root 16u IPv4 22738 0t0 UDP *:56130 snmpd 1396 root 17u IPv4 22740 0t0 TCP localhost:smux (LISTEN) httpd 1398 root 3u IPv4 20337 0t0 TCP *:http (LISTEN) master 2038 root 13u IPv4 21638 0t0 TCP *:smtp (LISTEN) master 2038 root 14u IPv6 21639 0t0 TCP *:smtp (LISTEN) sshd 9052 root 3u IPv4 1419955 0t0 TCP CentOS7.2daygeek.com:ssh->Ubuntu18-04.2daygeek.com:11408 (ESTABLISHED) httpd 13371 apache 3u IPv4 20337 0t0 TCP *:http (LISTEN) httpd 13372 apache 3u IPv4 20337 0t0 TCP *:http (LISTEN) httpd 13373 apache 3u IPv4 20337 0t0 TCP *:http (LISTEN) httpd 13374 apache 3u IPv4 20337 0t0 TCP *:http (LISTEN) httpd 13375 apache 3u IPv4 20337 0t0 TCP *:http (LISTEN)你也可以使用下面的命令检查特定的端口。# lsof -i:80 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME httpd 1398 root 3u IPv4 20337 0t0 TCP *:http (LISTEN) httpd 13371 apache 3u IPv4 20337 0t0 TCP *:http (LISTEN) httpd 13372 apache 3u IPv4 20337 0t0 TCP *:http (LISTEN) httpd 13373 apache 3u IPv4 20337 0t0 TCP *:http (LISTEN) httpd 13374 apache 3u IPv4 20337 0t0 TCP *:http (LISTEN) httpd 13375 apache 3u IPv4 20337 0t0 TCP *:http (LISTEN)via: https://www.2daygeek.com/linux-scan-check-open-ports-using-netstat-ss-nmap/作者：Magesh Maruthamuthu 选题：lujun9972 译者：heguangzhi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
查看远程 Linux 系统中某个端口是否开启的 3 种方法
这是一个很重要的话题，不仅对 Linux 管理员而言，对于我们大家而言也非常有帮助。我的意思是说对于工作在 IT 基础设施行业的用户来说，了解这个话题也是非常有用的。他们需要在执行下一步操作前，检查 Linux 服务器上某个端口是否开启。假如这个端口没有被开启，则他们会直接找 Linux 管理员去开启它。如果这个端口已经开启了，则我们需要和应用团队来商量下一步要做的事。在本篇文章中，我们将向你展示如何检查某个端口是否开启的 3 种方法。这个目标可以使用下面的 Linux 命令来达成：nc：netcat 是一个简单的 Unix 工具，它使用 TCP 或 UDP 协议去读写网络连接间的数据。nmap：（“Network Mapper”）是一个用于网络探索和安全审计的开源工具，被设计用来快速地扫描大规模网络。telnet：被用来交互地通过 TELNET 协议与另一台主机通信。如何使用 nc（netcat）命令来查看远程 Linux 系统中某个端口是否开启？nc 即 netcat。netcat 是一个简单的 Unix 工具，它使用 TCP 或 UDP 协议去读写网络连接间的数据。它被设计成为一个可信赖的后端工具，可被直接使用或者简单地被其他程序或脚本调用。与此同时，它也是一个富含功能的网络调试和探索工具，因为它可以创建你所需的几乎所有类型的连接，并且还拥有几个内置的有趣功能。netcat 有三类功能模式，它们分别为连接模式、监听模式和隧道模式。nc（netcat）命令的一般语法：$ nc [-options] [HostName or IP] [PortNumber]在下面的例子中，我们将检查远程 Linux 系统中的 22 端口是否开启。假如端口是开启的，你将获得类似下面的输出。# nc -zvw3 192.168.1.8 22 Connection to 192.168.1.8 22 port [tcp/ssh] succeeded!命令详解：nc：即执行的命令主体；z：零 I/O 模式（被用来扫描）；v：显式地输出；w3：设置超时时间为 3 秒；192.168.1.8：目标系统的 IP 地址；22：需要验证的端口。当检测到端口没有开启，你将获得如下输出：# nc -zvw3 192.168.1.95 22 nc: connect to 192.168.1.95 port 22 (tcp) failed: Connection refused如何使用 nmap 命令来查看远程 Linux 系统中某个端口是否开启？nmap（“Network Mapper”）是一个用于网络探索和安全审计的开源工具，被设计用来快速地扫描大规模网络，尽管对于单个主机它也同样能够正常工作。nmap 以一种新颖的方式，使用裸 IP 包来决定网络中的主机是否可达，这些主机正提供什么服务（应用名和版本号），它们运行的操作系统（系统的版本），它们正在使用的是什么包过滤软件或者防火墙，以及其他额外的特性。尽管 nmap 通常被用于安全审计，许多系统和网络管理员发现在一些日常任务（例如罗列网络资产、管理服务升级的计划、监视主机或者服务是否正常运行）中，它也同样十分有用。nmap 的一般语法：$ nmap [-options] [HostName or IP] [-p] [PortNumber]假如端口是开启的，你将获得如下的输出：# nmap 192.168.1.8 -p 22 Starting Nmap 7.70 ( https://nmap.org ) at 2019-03-16 03:37 IST Nmap scan report for 192.168.1.8 Host is up (0.00031s latency). PORT STATE SERVICE 22/tcp open ssh Nmap done: 1 IP address (1 host up) scanned in 13.06 seconds假如端口没有开启，你将得到类似下面的结果：# nmap 192.168.1.8 -p 80 Starting Nmap 7.70 ( https://nmap.org ) at 2019-03-16 04:30 IST Nmap scan report for 192.168.1.8 Host is up (0.00036s latency). PORT STATE SERVICE 80/tcp closed http Nmap done: 1 IP address (1 host up) scanned in 13.07 seconds如何使用 telnet 命令来查看远程 Linux 系统中某个端口是否开启？telnet 命令被用来交互地通过 TELNET 协议与另一台主机通信。telnet 命令的一般语法：$ telnet [HostName or IP] [PortNumber]假如探测成功，你将看到类似下面的输出：$ telnet 192.168.1.9 22 Trying 192.168.1.9... Connected to 192.168.1.9. Escape character is '^]'. SSH-2.0-OpenSSH_5.3 ^] Connection closed by foreign host.假如探测失败，你将看到类似下面的输出：$ telnet 192.168.1.9 80 Trying 192.168.1.9... telnet: Unable to connect to remote host: Connection refused当前，我们只找到上面 3 种方法来查看远程 Linux 系统中某个端口是否开启，假如你发现了其他方法可以达到相同的目的，请在下面的评论框中告知我们。via: https://www.2daygeek.com/how-to-check-whether-a-port-is-open-on-the-remote-linux-system-server/作者：Magesh Maruthamuthu 选题：lujun9972 译者：FSSlc 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
对于 Linux 系统管理员来说，清楚某个服务是否正确地绑定或监听某个端口，是至关重要的。如果你需要处理端口相关的问题，这篇文章可能会对你有用。端口是 Linux 系统上特定进程之间逻辑连接的标识，包括物理端口和软件端口。由于 Linux 操作系统是一个软件，因此本文只讨论软件端口。软件端口始终与主机的 IP 地址和相关的通信协议相关联，因此端口常用于区分应用程序。大部分涉及到网络的服务都必须打开一个套接字来监听传入的网络请求，而每个服务都使用一个独立的套接字。推荐阅读：在 Linux 上查看进程 ID 的 4 种方法在 Linux 上终止进程的 3 种方法套接字是和 IP 地址、软件端口和协议结合起来使用的，而端口号对传输控制协议（TCP）和用户数据报协议（UDP）协议都适用，TCP 和 UDP 都可以使用 0 到 65535 之间的端口号进行通信。以下是端口分配类别：0 - 1023： 常用端口和系统端口1024 - 49151： 软件的注册端口49152 - 65535： 动态端口或私有端口在 Linux 上的 /etc/services 文件可以查看到更多关于保留端口的信息。# less /etc/services # /etc/services: # $Id: services,v 1.55 2013/04/14 ovasik Exp $ # # Network services, Internet style # IANA services version: last updated 2013-04-10 # # Note that it is presently the policy of IANA to assign a single well-known # port number for both TCP and UDP; hence, most entries here have two entries # even if the protocol doesn't support UDP operations. # Updated from RFC 1700, ``Assigned Numbers'' (October 1994). Not all ports # are included, only the more common ones. # # The latest IANA port assignments can be gotten from # http://www.iana.org/assignments/port-numbers # The Well Known Ports are those from 0 through 1023. # The Registered Ports are those from 1024 through 49151 # The Dynamic and/or Private Ports are those from 49152 through 65535 # # Each line describes one service, and is of the form: # # service-name port/protocol [aliases ...] [# comment] tcpmux 1/tcp # TCP port service multiplexer tcpmux 1/udp # TCP port service multiplexer rje 5/tcp # Remote Job Entry rje 5/udp # Remote Job Entry echo 7/tcp echo 7/udp discard 9/tcp sink null discard 9/udp sink null systat 11/tcp users systat 11/udp users daytime 13/tcp daytime 13/udp qotd 17/tcp quote qotd 17/udp quote msp 18/tcp # message send protocol (historic) msp 18/udp # message send protocol (historic) chargen 19/tcp ttytst source chargen 19/udp ttytst source ftp-data 20/tcp ftp-data 20/udp # 21 is registered to ftp, but also used by fsp ftp 21/tcp ftp 21/udp fsp fspd ssh 22/tcp # The Secure Shell (SSH) Protocol ssh 22/udp # The Secure Shell (SSH) Protocol telnet 23/tcp telnet 23/udp # 24 - private mail system lmtp 24/tcp # LMTP Mail Delivery lmtp 24/udp # LMTP Mail Delivery可以使用以下六种方法查看端口信息。ss：可以用于转储套接字统计信息。netstat：可以显示打开的套接字列表。lsof：可以列出打开的文件。fuser：可以列出那些打开了文件的进程的进程 ID。nmap：是网络检测工具和端口扫描程序。systemctl：是 systemd 系统的控制管理器和服务管理器。以下我们将找出 sshd 守护进程所使用的端口号。方法 1：使用 ss 命令ss 一般用于转储套接字统计信息。它能够输出类似于 netstat 输出的信息，但它可以比其它工具显示更多的 TCP 信息和状态信息。它还可以显示所有类型的套接字统计信息，包括 PACKET、TCP、UDP、DCCP、RAW、Unix 域等。# ss -tnlp | grep ssh LISTEN 0 128 *:22 *:* users:(("sshd",pid=997,fd=3)) LISTEN 0 128 :::22 :::* users:(("sshd",pid=997,fd=4))也可以使用端口号来检查。# ss -tnlp | grep ":22" LISTEN 0 128 *:22 *:* users:(("sshd",pid=997,fd=3)) LISTEN 0 128 :::22 :::* users:(("sshd",pid=997,fd=4))方法 2：使用 netstat 命令netstat 能够显示网络连接、路由表、接口统计信息、伪装连接以及多播成员。默认情况下，netstat 会列出打开的套接字。如果不指定任何地址族，则会显示所有已配置地址族的活动套接字。但 netstat 已经过时了，一般会使用 ss 来替代。# netstat -tnlp | grep ssh tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 997/sshd tcp6 0 0 :::22 :::* LISTEN 997/sshd也可以使用端口号来检查。# netstat -tnlp | grep ":22" tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1208/sshd tcp6 0 0 :::22 :::* LISTEN 1208/sshd方法 3：使用 lsof 命令lsof 能够列出打开的文件，并列出系统上被进程打开的文件的相关信息。# lsof -i -P | grep ssh COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 11584 root 3u IPv4 27625 0t0 TCP *:22 (LISTEN) sshd 11584 root 4u IPv6 27627 0t0 TCP *:22 (LISTEN) sshd 11592 root 3u IPv4 27744 0t0 TCP vps.2daygeek.com:ssh->103.5.134.167:49902 (ESTABLISHED)也可以使用端口号来检查。# lsof -i tcp:22 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 1208 root 3u IPv4 20919 0t0 TCP *:ssh (LISTEN) sshd 1208 root 4u IPv6 20921 0t0 TCP *:ssh (LISTEN) sshd 11592 root 3u IPv4 27744 0t0 TCP vps.2daygeek.com:ssh->103.5.134.167:49902 (ESTABLISHED)方法 4：使用 fuser 命令fuser 工具会将本地系统上打开了文件的进程的进程 ID 显示在标准输出中。# fuser -v 22/tcp USER PID ACCESS COMMAND 22/tcp: root 1208 F.... sshd root 12388 F.... sshd root 49339 F.... sshd方法 5：使用 nmap 命令nmap（“Network Mapper”）是一款用于网络检测和安全审计的开源工具。它最初用于对大型网络进行快速扫描，但它对于单个主机的扫描也有很好的表现。nmap 使用原始 IP 数据包来确定网络上可用的主机，这些主机的服务（包括应用程序名称和版本）、主机运行的操作系统（包括操作系统版本等信息）、正在使用的数据包过滤器或防火墙的类型，以及很多其它信息。# nmap -sV -p 22 localhost Starting Nmap 6.40 ( http://nmap.org ) at 2018-09-23 12:36 IST Nmap scan report for localhost (127.0.0.1) Host is up (0.000089s latency). Other addresses for localhost (not scanned): 127.0.0.1 PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.4 (protocol 2.0) Service detection performed. Please report any incorrect results at http://nmap.org/submit/ . Nmap done: 1 IP address (1 host up) scanned in 0.44 seconds方法 6：使用 systemctl 命令systemctl 是 systemd 系统的控制管理器和服务管理器。它取代了旧的 SysV 初始化系统管理，目前大多数现代 Linux 操作系统都采用了 systemd。推荐阅读：chkservice – Linux 终端上的 systemd 单元管理工具如何查看 Linux 系统上正在运行的服务# systemctl status sshd ● sshd.service - OpenSSH server daemon Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled) Active: active (running) since Sun 2018-09-23 02:08:56 EDT; 6h 11min ago Docs: man:sshd(8) man:sshd_config(5) Main PID: 11584 (sshd) CGroup: /system.slice/sshd.service └─11584 /usr/sbin/sshd -D Sep 23 02:08:56 vps.2daygeek.com systemd[1]: Starting OpenSSH server daemon... Sep 23 02:08:56 vps.2daygeek.com sshd[11584]: Server listening on 0.0.0.0 port 22. Sep 23 02:08:56 vps.2daygeek.com sshd[11584]: Server listening on :: port 22. Sep 23 02:08:56 vps.2daygeek.com systemd[1]: Started OpenSSH server daemon. Sep 23 02:09:15 vps.2daygeek.com sshd[11589]: Connection closed by 103.5.134.167 port 49899 [preauth] Sep 23 02:09:41 vps.2daygeek.com sshd[11592]: Accepted password for root from 103.5.134.167 port 49902 ssh2以上输出的内容显示了最近一次启动 sshd 服务时 ssh 服务的监听端口。但它不会将最新日志更新到输出中。# systemctl status sshd ● sshd.service - OpenSSH server daemon Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled) Active: active (running) since Thu 2018-09-06 07:40:59 IST; 2 weeks 3 days ago Docs: man:sshd(8) man:sshd_config(5) Main PID: 1208 (sshd) CGroup: /system.slice/sshd.service ├─ 1208 /usr/sbin/sshd -D ├─23951 sshd: [accepted] └─23952 sshd: [net] Sep 23 12:50:36 vps.2daygeek.com sshd[23909]: Invalid user pi from 95.210.113.142 port 51666 Sep 23 12:50:36 vps.2daygeek.com sshd[23909]: input_userauth_request: invalid user pi [preauth] Sep 23 12:50:37 vps.2daygeek.com sshd[23911]: pam_unix(sshd:auth): check pass; user unknown Sep 23 12:50:37 vps.2daygeek.com sshd[23911]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=95.210.113.142 Sep 23 12:50:37 vps.2daygeek.com sshd[23909]: pam_unix(sshd:auth): check pass; user unknown Sep 23 12:50:37 vps.2daygeek.com sshd[23909]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=95.210.113.142 Sep 23 12:50:39 vps.2daygeek.com sshd[23911]: Failed password for invalid user pi from 95.210.113.142 port 51670 ssh2 Sep 23 12:50:39 vps.2daygeek.com sshd[23909]: Failed password for invalid user pi from 95.210.113.142 port 51666 ssh2 Sep 23 12:50:40 vps.2daygeek.com sshd[23911]: Connection closed by 95.210.113.142 port 51670 [preauth] Sep 23 12:50:40 vps.2daygeek.com sshd[23909]: Connection closed by 95.210.113.142 port 51666 [preauth]大部分情况下，以上的输出不会显示进程的实际端口号。这时更建议使用以下这个 journalctl 命令检查日志文件中的详细信息。# journalctl | grep -i "openssh\|sshd" Sep 23 02:08:56 vps138235.vps.ovh.ca sshd[997]: Received signal 15; terminating. Sep 23 02:08:56 vps138235.vps.ovh.ca systemd[1]: Stopping OpenSSH server daemon... Sep 23 02:08:56 vps138235.vps.ovh.ca systemd[1]: Starting OpenSSH server daemon... Sep 23 02:08:56 vps138235.vps.ovh.ca sshd[11584]: Server listening on 0.0.0.0 port 22. Sep 23 02:08:56 vps138235.vps.ovh.ca sshd[11584]: Server listening on :: port 22. Sep 23 02:08:56 vps138235.vps.ovh.ca systemd[1]: Started OpenSSH server daemon.via: https://www.2daygeek.com/how-to-find-out-which-port-number-a-process-is-using-in-linux/作者：Prakash Subramanian 选题：lujun9972 译者：HankChow 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
为什么 SSH（安全终端）的端口号是 22 呢，这不是一个巧合，这其中有个我（Tatu Ylonen，SSH 协议的设计者）未曾诉说的故事。将 SSH 协议端口号设为 22 的故事1995 年春我编写了 SSH 协议的最初版本，那时候 telnet 和 FTP 正被广泛使用。当时我设计 SSH 协议想着是为了替代 telnet（端口 23）和 ftp（端口21）两个协议的，而端口 22 是空闲的。我想当然地就选择了夹在 telnet 和 ftp 的端口中间的数字。我觉得端口号虽然是个小事但似乎又存在着某种信念。但我到底要怎么拿到那个端口号呢？我未曾拥有过任何一个端口号，但我却认识几个拥有端口号的人！在那时取得端口号的事情其实说来挺简单的。毕竟当时的因特网（Internet）并不是很大，是因特网爆炸的早期。端口号分配的活儿是 IANA（Internet Assigned Numbers Authority，互联网数字分配机构）干的。在那时这机构可相当于是因特网先驱 Jon Postel 和 Joyce K. Reynolds 一般的存在。Jon 参与编写了多项主要的协议标准，例如 IP（RFC 791）、ICMP（RFC 792）和 TCP（RFC 793）等一些你应该早有耳闻的协议。我可以说是敬畏 Jon 先生的，他参与编写了几乎所有主要的因特网标准文档（Internet RFC）！1995 年 7 月，就在我发布 ssh-1.0 前，我发送了一封邮件给 IANA：From ylo Mon Jul 10 11:45:48 +0300 1995 From: Tatu Ylonen mailto:ylo@cs.hut.fi To: Internet Assigned Numbers Authority mailto:iana@isi.edu Subject: 请求取得一个端口号 Organization: 芬兰赫尔辛基理工大学亲爱的机构成员：我写了个可以在不安全的网络环境中安全地从一台机器登录到另一台机器的程序。它主要是对现有的 telnet 协议以及 rlogin 协议的功能性提升和安全性改进。说的具体些，就是可以防御 IP、DNS 或路由等欺骗行为。我打算将我的软件免费地发布在因特网上，以得到广泛地使用。我希望为该软件注册一个特权端口号，要是这个端口号在 1 到 255 之间就更好了，这样它就可以用在名字服务器的 WKS 字段中了。我在附件中附上了协议标准的草案。这个软件已经在本地运行了几个月了，我已准备在获得端口号后就发布。如果端口号分配一事安排的及时，我希望这周就将要发布的软件准备好。我目前在 beta 版测试时使用的端口号是 22，如果要是能够分配到这个端口，我就不用做什么更改了（目前这个端口在列表中还是空闲的）。软件中服务的名称叫 ssh（系 Secure Shell 的缩写）。您最真诚的，Tatu Ylonen mailto:ylo@cs.hut.fi（LCTT 译注：DNS 协议中的 WKS 记录类型意即“众所周知的业务描述”，是类似于 A、MX 这样的 DNS 记录类型，用于描述某个 IP 所提供的服务，目前鲜见使用。参见： https://docs.oracle.com/cd/E19683-01/806-4077/dnsintro-154/index.html 。）第二天，我就收到了 Joyce 发来的邮件：Date: Mon, 10 Jul 1995 15:35:33 -0700 From: jkrey@ISI.EDU To: ylo@cs.hut.fi Subject: 回复：请求取得一个端口号 Cc: iana@ISI.EDU Tatu,我们将端口号 22 分配给 ssh 服务了，你目前是该服务的主要联系人。Joyce这就搞定了！SSH 的端口正式使用 22！！！1995 年 7 月 12 日上午 2 点 21 分，我给我在赫尔辛基理工大学的测试者们宣布了 SSH 的最后 beta 版本。当日下午 5 点 23 分，我给测试者们宣布了 ssh-1.0.0 版本。1995 年 7 月 12 日，下午 5 点 51 分，我将一份 SSH（安全终端）的宣告发给了 cypherpunks@toad.com 的邮件列表，此外我还将其发给了一些新闻组、邮件列表和一些在因特网上讨论相关话题的人们。如何更改 SSH 服务的端口号SSH 服务器是默认运行在 22 号端口上的。然而，由于某些原因需要，它也可以运行在别的端口上。比如为了方便测试使用，又比如在同一个宿主机上运行多个不同的配置。当然，极少情况下，不使用 root 权限运行它也可以，比如某些必须运行在非特权的端口的情况（端口号大于等于 1024）。端口号可以在配置文件 /etc/ssh/sshd\_config 中将 Port 22 更改。也可以使用 -p <port> 选项运行 sshd。SSH 客户端和 sftp 程序也可以使用 -p <port> 选项。配置 SSH 协议穿越防火墙SSH 是少数通常被许可穿越防火墙的协议之一。通常的做法是不限制出站的 SSH 连接，尤其常见于一些较小的或者比较技术型的组织中，而入站的 SSH 连接通常会限制到一台或者是少数几台服务器上。出站的 SSH 连接在防火墙中配置出站的 SSH 连接十分简单。如果完全限制了外发连接，那么只需要创建一个允许 TCP 端口 22 可以外发的规则即可。如果你想限制目标地址，你可以限制该规则仅允许访问你的组织放在云端的外部服务器或保护该云端的跳板服务器即可。反向通道是有风险的其实不限制出站的 SSH 连接虽然是可以的，但是是存在风险的，SSH 协议是支持 通道访问 的。最初的想法是在外部服务器搭建一个 SSH 服务监听来自各处的连接，将进入的连接转发到组织，并让这个连接可以访问某个内部服务器。在某些场景下这当然非常的方便。开发者和系统管理员经常使用它打开一个通道以便于他们可以远程访问，比如在家里或者在旅行中使用笔记本电脑等场景。然而通常来讲这些做法是违背安全策略的，跳过了防火墙管理员和安全团队保护的控制无疑是违背安全策略的，比如这些： PCI、HIPAA、NIST SP 800-53 等。它可以被黑客和外国情报机构用来在组织内留下后门。CryptoAuditor 是一款可以控制通道穿过防火墙或者一组云端服务器入口的产品。该款产品可以配合 通用 SSH 密钥管理器（Universal SSH Key Manager） 来获得对 主机密钥（host keys）的访问，以在启用防火墙并阻挡未授权转发的场景中解密 SSH 会话。入站的 SSH 访问对于入站访问而言，这里有几点需要说一下：配置防火墙，并转发所有去往 22 端口的连接只能流向到一个特定的内部网络 IP 地址或者一个 DMZ) 主机。在该 IP 上运行 CryptoAuditor 或者跳板机来控制和审查所有访问该组织的连接。在防火墙上使用不同的端口访问不同的服务器。只允许使用 IPsec 协议这样的 VPN（虚拟专用网）登录后连接 SSH 服务。通过 iptables 服务限制 SSH 访问iptables 是一款内建在 Linux 内核的宿主防火墙。通常配置用于保护服务器以防止被访问那些未明确开启的端口。如果服务器上启用了 iptables，使用下面的命令将可以允许进入的 SSH 访问，当然命令需要以 root 身份运行。iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT 如果你想将上述命令创建的规则持久地保存，在某些系统版本中，可使用如下命令：service iptables save via: https://www.ssh.com/ssh/port作者：Tatu Ylonen 译者：kenxx 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
端口是与 Linux 操作系统上的应用或进程的通讯端点的逻辑实体。在使用之前，了解目标机器上哪些端口是打开并正在运行服务是非常有用的。我们可以使用 netstat 或其他几个 Linux 命令如 NMAP 在本地机器上轻松地列出 Linux 中的打开端口。在本指南中，我们将向你展示如何使用简单的 netcat（简称 nc）命令来确定远程主机上的端口是否可访问/打开。netcat（或简称 nc）是一个功能强大且易于使用的程序，可用于 Linux 中与 TCP、UDP 或 UNIX 域套接字相关的任何事情。# yum install nc [在 CentOS/RHEL 中] # dnf install nc [在 Fedora 22+ 中] $ sudo apt-get install netcat [在 Debian/Ubuntu 中] 我们可以使用它：打开 TCP 连接、侦听任意 TCP 和 UDP 端口、发送 UDP 数据包、在 IPv4 和 IPv6 进行端口扫描。使用 netcat，你可以检查单个或多个或一段打开的端口范围，如下所示。下面的命令将帮助我们查看端口 22 是否在主机 192.168.56.10 上打开：$ nc -zv 192.168.1.15 22 上面的命令中，这些标志是：-z – 设置 nc 只是扫描侦听守护进程，实际上不向它们发送任何数据。-v – 启用详细模式下面的命令会检查远程主机 192.168.5.10 上是否打开了端口 80、22 和 21（我们也可以使用主机名）：nc -zv 192.168.56.10 80 22 21 也可以指定端口扫描的范围：$ nc -zv 192.168.56.10 20-80 更多关于 netcat 命令的例子和使用，阅读我们下面的文章。使用 netcat 命令在 Linux 服务器间传输文件Linux 网络配置及排障调试命令就是这样。在本文中，我们解释了如何使用 netcat 命令检测远程主机端口是否可达/打开。请在评论栏中留下你的想法。作者简介：Aaron Kili 是 Linux 和 F.O.S.S 爱好者，将来的 Linux SysAdmin 和 web 开发人员，目前是 TecMint 的内容创建者，他喜欢用电脑工作，并坚信分享知识。via: http://www.tecmint.com/check-remote-port-in-linux/作者：Aaron Kili 译者：geekpi 校对：jasminepeng本文由 LCTT 原创编译，Linux中国 荣誉推出
在 Linux 或者类 Unix 中，我该如何检查某个端口是否被占用？我又该如何验证 Linux 服务器中有哪些端口处于监听状态？验证哪些端口在服务器的网络接口上处于监听状态是非常重要的。你需要注意那些开放端口来检测网络入侵。除了网络入侵，为了排除故障，确认服务器上的某个端口是否被其他应用程序占用也是必要的。比方说，你可能会在同一个系统中安装了 Apache 和 Nginx 服务器，所以了解是 Apache 还是 Nginx 占用了 # 80/443 TCP 端口真的很重要。这篇快速教程会介绍使用 netstat 、 nmap 和 lsof 命令来检查端口使用信息并找出哪些程序正在使用这些端口。如何检查 Linux 中的程序和监听的端口1、 打开一个终端，如 shell 命令窗口。 2、 运行以下任意一行命令：sudo lsof -i -P -n | grep LISTEN sudo netstat -tulpn | grep LISTEN sudo nmap -sTU -O IP地址 下面我们看看这些命令和它们的详细输出内容：方式 1：lsof 命令语法如下：$ sudo lsof -i -P -n $ sudo lsof -i -P -n | grep LISTEN $ doas lsof -i -P -n | grep LISTEN ### OpenBSD 输出如下：图 1：使用 lsof 命令检查监听端口和程序仔细看上面输出的最后一行：sshd 85379 root 3u IPv4 0xffff80000039e000 0t0 TCP 10.86.128.138:22 (LISTEN) sshd 是程序的名称10.86.128.138 是 sshd 程序绑定 (LISTEN) 的 IP 地址22 是被使用 (LISTEN) 的 TCP 端口85379 是 sshd 任务的进程 ID (PID)方式 2：netstat 命令你可以如下面所示使用 netstat 来检查监听的端口和程序。Linux 中 netstat 语法$ netstat -tulpn | grep LISTEN FreeBSD/MacOS X 中 netstat 语法$ netstat -anp tcp | grep LISTEN $ netstat -anp udp | grep LISTEN OpenBSD 中 netstat 语法$ netstat -na -f inet | grep LISTEN $ netstat -nat | grep LISTEN 方式 3：nmap 命令语法如下：$ sudo nmap -sT -O localhost $ sudo nmap -sU -O 192.168.2.13 ### 列出打开的 UDP 端口 $ sudo nmap -sT -O 192.168.2.13 ### 列出打开的 TCP 端口 示例输出如下：图 2：使用 nmap 探测哪些端口监听 TCP 连接你可以用一句命令合并 TCP/UDP 扫描：$ sudo nmap -sTU -O 192.168.2.13 赠品：对于 Windows 用户在 windows 系统下可以使用下面的命令检查端口使用情况：netstat -bano | more netstat -bano | grep LISTENING netstat -bano | findstr /R /C:"[LISTING]" via: https://www.cyberciti.biz/faq/unix-linux-check-if-port-is-in-use-command/作者：VIVEK GITE 译者：GHLandy 校对：oska874本文由 LCTT 原创编译，Linux中国 荣誉推出