Linux/UNIX找出正在特定TCP端口上侦听的程序/服务

时间:2020-01-09 14:16:31  来源:igfitidea点击:

问题描述:如何确定哪个服务正在侦听特定端口?
如何找出在特定TCP端口上侦听的程序?

解决方法:在Linux和UNIX下,您可以使用以下任一命令在特定的TCP端口上列出:

  • lsof:列出包括端口在内的打开文件。
  • netstat:netstat命令以符号方式显示各种与网络相关的数据和信息的内容。

lsof命令示例

输入以下命令以查看IPv4端口,然后执行:

# lsof -Pnl +M -i4

执行以下命令以查看IPv6列出的端口,然后执行:

# lsof -Pnl +M -i6

输出示例:

COMMAND    PID     USER   FD   TYPE DEVICE SIZE NODE NAME
gweather- 6591     1000   17u  IPv4 106812       TCP 192.168.1.100:57179->140.90.128.70:80 (ESTABLISHED)
firefox-b 6613     1000   29u  IPv4 106268       TCP 127.0.0.1:60439->127.0.0.1:3128 (ESTABLISHED)
firefox-b 6613     1000   31u  IPv4 106321       TCP 127.0.0.1:60440->127.0.0.1:3128 (ESTABLISHED)
firefox-b 6613     1000   44u  IPv4 106325       TCP 127.0.0.1:60441->127.0.0.1:3128 (ESTABLISHED)
firefox-b 6613     1000   50u  IPv4 106201       TCP 127.0.0.1:60437->127.0.0.1:3128 (ESTABLISHED)
deluge    6908     1000    8u  IPv4  23179       TCP *:6881 (LISTEN)
deluge    6908     1000   30u  IPv4  23185       UDP *:6881 
deluge    6908     1000   45u  IPv4 106740       TCP 192.168.1.100:50584->217.169.223.161:38406 (SYN_SENT)
deluge    6908     1000   57u  IPv4  70529       TCP 192.168.1.100:57325->24.67.82.222:21250 (ESTABLISHED)
deluge    6908     1000   58u  IPv4 106105       TCP 192.168.1.100:38073->24.16.233.1:48479 (ESTABLISHED)
..........
......
ssh       6917     1000    3u  IPv4  23430       TCP 10.1.11.3:42658->10.10.29.66:22 (ESTABLISHED)

第一列" COMMAND"给出了有关程序名称的信息。
有关详细信息,请参见输出标题。
例如,gweather *命令从美国国家天气服务(NWS)服务器(140.90.128.70)中获取天气报告天气信息,包括交互式天气信息网络(IWIN)和其他天气服务。
其中:

  • -P:此选项禁止将端口号转换为网络文件的端口名。禁止转换可能会使lsof运行更快。当端口名称查找无法正常工作时,它也很有用。
  • -n:此选项禁止将网络号转换为网络文件的主机名。禁止转换可能会使lsof运行更快。当主机名查找无法正常工作时,它也很有用。
  • -l:此选项禁止将用户ID号转换为登录名。当登录名查找不正确或运行缓慢时,此功能也很有用。
    • M:启用报告本地TCP和UDP端口的端口映射程序注册。
  • -i4:仅IPv4列表
  • -i6:仅IPv6列表

netstat命令示例

执行命令,如下所示:

# netstat -tulpn

或者

# netstat -npl

输出:

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name   
tcp        0      0 0.0.0.0:6881            0.0.0.0:*               LISTEN     6908/python         
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN     5562/cupsd          
tcp        0      0 127.0.0.1:3128          0.0.0.0:*               LISTEN     6278/(squid)        
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN     5854/exim4          
udp        0      0 0.0.0.0:32769           0.0.0.0:*                          6278/(squid)        
udp        0      0 0.0.0.0:3130            0.0.0.0:*                          6278/(squid)        
udp        0      0 0.0.0.0:68              0.0.0.0:*                          4583/dhclient3      
udp        0      0 0.0.0.0:6881            0.0.0.0:*                          6908/python

最后一列" PID /程序名称"给出了有关程序名称和端口的信息。
其中:

  • -t:TCP端口
  • -u:UDP端口
  • -l:仅显示监听套接字。
  • -p:显示每个套接字/端口所属的程序的PID和名称
  • -n:没有DNS查找(加快操作)

/etc/services文件

/etc/services是一个普通的ASCII文件,提供Internet服务的友好文本名称及其基础分配的端口号和协议类型之间的映射。
每个网络程序都应调查此文件以获取其服务的端口号(和协议)。
您可以在cat或less命令的帮助下查看此文件:

$ cat /etc/services
$ grep 110 /etc/services
$ less /etc/services