如何在 Linux 中定位开放端口

什么是端口?

首先,让我们定义什么是端口。 根据 国际电联,一个端口是:

“互联网通信的逻辑实体。 端口有两个主要目的:
1. 它们提供了一个多路分解标识符来分隔同一对端点之间的传输会话
2. 他们还可以识别进程连接的应用协议和相关服务。”

维基百科

简单来说,这只是意味着端口是一个端点,数据通过它在网络上的两台计算机之间来回流动。 一台计算机有 65535 个端口可用于共享信息。 这些端口号基于 16 位数字,这是我们推导出可用端口总数(0 到 65535)的地方。

这些端口号被分配给特定的服务 IANA,负责维护官方端口号指定。 它们根据三个范围指定端口号:

  • 系统(或众所周知的)端口(0-1023)
  • 用户端口 (1024-49151)
  • 动态和私有端口 (49152-65535)

通用端口和相关程序

正如我们所见,一旦服务与端口号相关联,其中许多端口就很容易识别。

  • 端口 20:FTP
  • 端口 21:FTP
  • 端口 22:SSH
  • 端口 23:远程登录
  • 端口 25:SMTP
  • 端口 26:通用备用 SMTP 端口
  • 端口 37:cPanel 的时间服务器(tcp out)
  • 端口 53:DNS/命名
  • 端口 80:HTTP
  • 端口 110:POP3
  • 端口 123:NTP
  • 端口 143:IMAP
  • 端口 443:HTTPS (SSL)
  • 端口 465:SMTP(安全 SMTP)
  • 端口 993:IMAP(安全 IMAP)
  • 端口 995:POP3(安全 POP3)
  • 端口 1167:Guardian (buagent)
  • 端口 1433:Microsoft SQL Server
  • 端口 2073:cPanel Razor
  • 端口 2077:cPanel WebDAV
  • 端口 2078:cPanel WebDAV 安全端口
  • 端口 2079:cPanel CalDAV 和 CardDAV
  • 端口 2080:cPanel CalDAV 和 CardDAV 安全端口
  • 端口 2082:cPanel 非安全端口
  • 端口 2083:cPanel 安全端口
  • 端口 2086:WHM 非安全端口
  • 端口 2087:WHM 安全端口
  • 端口 2089:cp 许可证
  • 端口 2095:cPanel 网络邮件非安全端口
  • 端口 2096:cPanel 网络邮件安全端口
  • 端口 2443:Nodeworx/SiteWorx
  • 端口 3306:MySQL
  • 端口 3389:远程桌面协议 (rdp)
  • 端口 4643:Virtuozzo 控制面板
  • 端口 6660-6669:IRC
  • 端口 8000:SHOUTcast
  • 8080端口:Tomcat
  • 端口 8306:Plesk MySQL
  • 端口 8443:Plesk
  • 端口 49152:65534:标准被动 FTP 端口

TCP/UDP 协议

连接链的下一步是用于连接服务的协议。 计算机的 IP 地址由 ISP(互联网服务提供商)存储在 DNS 记录中,有助于信息的传输。

当一台计算机请求连接到另一台计算机(或服务器)时,它使用 DNS 记录中列出的 IP 地址来定位网络上的另一台计算机。 与相关端口相关联的服务然后使用这些连接协议之一将相关信息传输回请求者。 服务器上的开放端口侦听特定端口上的唯一通信请求。 唯一端口与上述各种软件或服务相关联。

例如,当您打开浏览器并输入 https://CodePre.com 时, https 请求通过 ISP 或其他互联网提供商路由,然后该提供商对该域进行 DNS 查找。 一旦找到 IP 的位置,您的 https 请求就会被路由到 Liquid Web 拥有的服务器。 当请求到达服务器时,正在侦听端口 443 的服务,在这种情况下, 端口 443 HTTPS (SSL), 识别到服务器的安全连接请求并安全地返回存储在服务器上的网页。

另一个例子是,如果您尝试连接到 Liquid Web 上的 FTP 服务器。 软件(例如 FileZilla)在端口 21 上访问服务器的 IP 地址,FTP 服务侦听的端口。 请求到达,如果端口打开,则允许连接通过防火墙。 FTP服务器然后响应连接请求,如果用户认证成功,您的计算机现在通过FTP连接到服务器。

防火墙

在此之后,防火墙开始发挥作用。 防火墙监控进出服务器的流量。 存储在防火墙规则中的信息根据传入的 TCP/UDP 信息允许或拒绝访问,并识别端口是打开还是关闭。 以上面的 FTP 请求为例,如果设置了防火墙规则允许流量通过 21 端口,则将 FTP 请求转发到允许连接的 FTP 服务器。 如果端口 21 被防火墙规则关闭或阻止,请求将被拒绝,连接将失败。

服务

最后,如果请求被允许通过防火墙,则侦听特定指定端口的服务会收到请求并进行实物响应。 诚然,这是对事件链的过度简化,但它展示了请求如何与唯一端口相关联的整个过程。 一个 IP 地址可能有多个服务侦听上面列出的任何一个端口。 当我们连接到服务器时,我们正在连接到一个 IP 地址和一个端口。

查找本地开放端口

在 Linux 中,有多种方法可以查看服务是否正在侦听。 通常,我们可以使用服务器上安装的软件来查看某个端口是否打开。

注意:搜索此类信息时也建议使用 watch 命令。 当与 watch 结合使用时,这些命令默认显示每两秒返回一次实时数据,但是,可以修改此命令以使用特定的时间范围。

地图

Nmap(网络映射器)是一个开源网络扫描器,用于发现网络上的服务和主机。 它向连接到网络的设备发送信息包并分析响应。 Nmap 有许多用于探测网络的功能,包括主机发现、服务检测和操作系统感知。 要安装 Nmap,我们使用以下命令。

[email protected] [~]# yum update -y [email protected] [~]# yum install nmap -y [email protected] [~]# nmap --version 

要发现开放端口,我们可以运行以下命令之一。

[email protected] [~]# nmap localhost  Starting Nmap 6.40 ( https://nmap.org ) at 2021-01-14 14:24 EST Nmap scan report for localhost (127.0.0.1) Host is up (0.0000080s latency). Other addresses for localhost (not scanned): 127.0.0.1 Not shown: 987 closed ports PORT     STATE SERVICE 21/tcp   open  ftp 25/tcp   open  smtp 53/tcp   open  domain 80/tcp   open  http 110/tcp  open  pop3 143/tcp  open  imap 443/tcp  open  https 465/tcp  open  smtps 587/tcp  open  submission 993/tcp  open  imaps 995/tcp  open  pop3s 3306/tcp open  mysql 9100/tcp open  jetdirect  Nmap done: 1 IP address (1 host up) scanned in 1.63 seconds  [email protected] [~]# 

另一个要使用的 nmap 命令如下。

[email protected] [~]# nmap -sT -O localhost  Starting Nmap 6.40 ( https://nmap.org ) at 2021-01-14 14:26 EST Nmap scan report for localhost (127.0.0.1) Host is up (0.00039s latency). Other addresses for localhost (not scanned): 127.0.0.1 Not shown: 987 closed ports PORT     STATE SERVICE 21/tcp   open  ftp 25/tcp   open  smtp 53/tcp   open  domain 80/tcp   open  http 110/tcp  open  pop3 143/tcp  open  imap 443/tcp  open  https 465/tcp  open  smtps 587/tcp  open  submission 993/tcp  open  imaps 995/tcp  open  pop3s 3306/tcp open  mysql 9100/tcp open  jetdirect 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 https://nmap.org/submit/ . Nmap done: 1 IP address (1 host up) scanned in 2.36 seconds [email protected] [~]#

lsof

lsof 是一个linux命令的意思 列出打开的文件 并且在许多类 Unix 系统中用于报告所有打开文件和打开它们的进程的列表。 如果没有安装lsof,我们使用下面的命令来安装。

[email protected] [~]# yum update -y [email protected] [~]# yum install lsof [email protected] [~]# lsof -v 

要检查打开的端口,请使用此命令。

[email protected] [~]# lsof -i -P | grep -i "listen" 

我们还可以使用 lsof 作为更大、更复杂的命令的一部分来对从命令行返回的信息进行排序和过滤。 此命令列出 TCP/UDP 连接的总数。

[email protected] [~]# lsof -i | awk '{print $8}' | sort | uniq -c | grep 'TCP|UDP'

使用这个命令,我们可以看到所有使用 TCP 连接的 IPv4 端口。

[email protected] [~]# lsof -a -i4 -itcp

或者这个命令,它列出了绑定到一个开放端口的进程。

 [email protected] [~]# lsof -i :80 

网络统计

netstat 是一个命令行实用程序,可显示 TCP 网络连接、路由表、活动网络接口和其他网络协议统计信息。 要安装 netstat,请运行这些命令。

[email protected] [~]# yum update -y [email protected] [~]# yum net-tools -y [email protected] [~]# netstat --version

这些命令将在扫描开放端口连接时提供请求的详细信息。

[email protected] [~]# netstat --listen [email protected] [~]# netstat -tulpn | grep LISTEN [email protected] [~]# netstat -plnt | awk '{print $1, $3, $7}'

SS

ss 是 netstat 的更简单、更快的替代品。 它是一个命令行元素,用于返回和显示各种网络相关信息。

此命令列出网络统计信息的摘要。

[email protected] [~]# ss -s

在这里,我们看到正在侦听的 UDP 连接。

[email protected] [~]# ss -lu

此命令显示 TCP 连接。

[email protected] [~]# ss -lt

其他使用各种标志和打印特定列输出的 ss 命令如下。

[email protected] [~]# ss -4 state listening | awk '{print $1, $4}' [email protected] [~]# ss -tulwn | awk '{print $1, $5}' [email protected] [~]# ss -stplu | awk '{print $1, $2, $5}'

重击

这是一个使用多个命令的命令 bash 扫描开放端口。

[email protected] [~]# HOST=127.0.0.1;for((port=1;port<=65535;++port)); do echo -en "$port ";if echo -en "open $HOST $portnlogoutquit" | telnet 2>/dev/null | grep 'Connected to' > /dev/null; then echo -en "nnport $port/tcp is opennn";fi;done | grep open  port 21/tcp is open port 25/tcp is open port 53/tcp is open port 80/tcp is open port 110/tcp is open port 111/tcp is open port 143/tcp is open port 443/tcp is open port 465/tcp is open port 587/tcp is open port 878/tcp is open port 953/tcp is open port 993/tcp is open port 995/tcp is open port 2077/tcp is open port 2078/tcp is open port 2079/tcp is open port 2080/tcp is open port 2082/tcp is open port 2083/tcp is open port 2086/tcp is open port 2087/tcp is open port 2095/tcp is open port 2096/tcp is open port 3306/tcp is open port 6379/tcp is open port 9100/tcp is open port 9104/tcp is open port 9115/tcp is open port 9117/tcp is open port 9253/tcp is open port 11211/tcp is open port 25566/tcp is open port 46648/tcp is open 

使用 CTRL + c 结束此命令。

查找远程开放端口

nc 或 netcat

Netcat(或 nc)是一个命令行网络实用程序,它使用 TCP 跨网络连接读取和写入数据。 以下命令将提供有关外部服务器上开放端口的详细信息。

[email protected] [~]# nc -vz [host] [port ranges] 2>&1 | grep succeeded [email protected] [~]# netcat -zv [host] [port ranges] 2>&1 | grep succeeded

远程登录

Telnet 是一种应用协议和命令,可使用虚拟终端 (VT) 连接提供基于文本的通信。

[email protected] [~]# yum install telnet telnet-server -y [email protected] [~]# telnet 192.168.0.1 22

由于 Linux 将所有内容都视为文件,因此我们可以使用它来定位端口的状态和可用性。

[email protected] [~]# echo > /dev/tcp/[host]/[port] && echo "The port is open!" [email protected] [~]# echo > /dev/udp/[host]/[port] && echo "The port is open!"  [email protected] [~]# cat /etc/services | grep port#

重击

[email protected] [~]# </dev/tcp/127.0.0.1/80) &>/dev/null && echo "OPEN" || echo "CLOSED"  [email protected] [~]# for i in {1..65535}; do (echo < /dev/tcp/127.0.0.1/$i) &>/dev/null && printf "n[+] Open Port atn: t%dn" "$i" || printf "."; done  [email protected] [~]# ip=192.168.1.254;for i in {1..65535}; do (echo < /dev/tcp/$ip/$i) &>/dev/null && printf "n[+] Open TCP Port at: t%dn" "$i"; done  [email protected] [~]# declare -a array=($(tail -n +2 /proc/net/tcp | cut -d":" -f"3"|cut -d" " -f"1")) && for port in ${array[@]}; do echo $((0x$port)); done  [email protected] [~]# for p in {1..1023}; do(echo >/dev/tcp/localhost/$p) >/dev/null 2>&1 && echo "$p open"; done

我们还可以使用 Python 套接字模块或其中之一 curl、telnet 或 wget 命令。

等/服务

服务器软件使用 /etc/services 文件将服务名称呈现为关联的端口号。 通常,该文件包括服务名称、使用的端口和协议、别名和任何相关注释。

[email protected] [~]# cat /etc/services | grep tcp [email protected] [~]# cat /etc/services | grep udp

找到运行服务的端口

要定位运行服务的端口,请使用以下说明。 要识别 PID(或进程 ID 号),我们首先使用 ps 命令。

[email protected] [~]# ps aux | grep <PROCESS NAME>  [email protected] [~]# ps aux | grep ssh root      47875  0.0  0.0 112808   964 pts/0    S+   16:28   0:00 grep --color=auto ssh root     101650  0.0  0.0 111448  2404 ?        Ss    2020   1:42 /usr/sbin/sshd -D

获得 PID 后,运行以下 netstat 命令。

[email protected] [~]# netstat -plnt | grep <PID>  [email protected] [~]# netstat -plnt | grep 101650 tcp        0      0 0.0.0.0:22           0.0.0.0:*               LISTEN      101650/sshd tcp6       0      0 :::22                :::*                    LISTEN      101650/sshd [email protected] [~]# 

这将为我们提供进程正在侦听的端口。 在这种情况下,我们可以看到 ssh PID (101650) 正在侦听端口 22。

哪个进程正在监听端口?

反过来,我们可以识别哪个进程正在侦听端口。

[email protected] [~]# lsof -i -P -n | grep LISTEN | grep ftp pure-ftpd 101353         root    4u  IPv4 12372180      0t0  TCP *:21 (LISTEN) pure-ftpd 101353         root    5u  IPv6 12372181      0t0  TCP *:21 (LISTEN) [email protected] [~]#  ===============  [email protected] [~]# netstat -tulpn |grep ftp tcp        0      0 0.0.0.0:21              0.0.0.0:*               LISTEN      101353/pure-ftpd (S tcp6       0      0 :::21                   :::*                    LISTEN      101353/pure-ftpd (S [email protected] [~]#  ===============  [email protected] [~]# ss -tulpn | grep ftp tcp    LISTEN     0      9         *:21                    *:*                   users:(("pure-ftpd",pid=101353,fd=4)) tcp    LISTEN     0      9      [::]:21                 [::]:*                   users:(("pure-ftpd",pid=101353,fd=5)) [email protected] [~]#

结论

本教程探讨了端口是什么、它们如何工作以及涉及的其他因素。 我们查看了常见端口及其相关服务的列表。 我们还介绍了此通信过程中涉及的其他因素,包括 TCP 和 UDP 协议、服务器软件和服务,以及允许或禁止流量通过这些端口的防火墙规则。 此外,我们分析了用于收集有关端口状态信息的多个命令以及在服务器上定位开放端口的各种方法,包括几种非标准方法。 总之,开放端口是计算机上的服务通过网络与另一台服务器通信的方式。 如果没有这个重要的功能,我们今天知道和使用的所有计算机程序,包括互联网本身,都不会存在。

我们以成为 Hosting™ 中最有帮助的人而自豪!

有问题吗? 我们经验丰富的系统管理员将向您解释如何利用这些信息! 如果您使用的是完全托管的 VPS 服务器, Cloud 专用、私有父服务器,或专用服务器所有者并需要帮助,请致电 800.580.4985,或打开 聊天 或与我们联系以了解更多信息!