网络世界服务器的IP地址和端口号就像家庭地址一样重要,如果发现服务器出现异常建议排查一下是否开放了一些不是你想开放的端口。本文介绍 Linux 系统中查看端口占用情况最常见的两个命令: lsof 和 netstat 。
netstat
Netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicast Memberships) 等等。
netstat 查看端口占用语法格式:
-t (tcp) 仅显示tcp相关选项-u (udp)仅显示udp相关选项-n 拒绝显示别名,能显示数字的全部转化为数字-l 仅列出在Listen(监听)的服务状态-p 显示建立相关链接的程序名-a或--all:显示所有连线中的Socket;-A<网络类型>或--<网络类型>:列出该网络类型连线中的相关地址;-c或--continuous:持续列出网络状态;-C或--cache:显示路由器配置的快取信息;-e或--extend:显示网络其他相关信息;-F或--fib:显示FIB;-g或--groups:显示多重广播功能群组组员名单;-h或--help:在线帮助;-i或--interfaces:显示网络界面信息表单;-l或--listening:显示监控中的服务器的Socket;-M或--masquerade:显示伪装的网络连线;-n或--numeric:直接使用ip地址,而不通过域名服务器;-N或--netlink或--symbolic:显示网络硬件外围设备的符号连接名称;-o或--timers:显示计时器;-p或--programs:显示正在使用Socket的程序识别码和程序名称;-r或--route:显示Routing Table;-s或--statistice:显示网络工作信息统计表;-t或--tcp:显示TCP传输协议的连线状况;-u或--udp:显示UDP传输协议的连线状况;-v或--verbose:显示指令执行过程;-V或--version:显示版本信息;-w或--raw:显示RAW传输协议的连线状况;-x或--unix:此参数的效果和指定"-A unix"参数相同;--ip或--inet:此参数的效果和指定"-A inet"参数相同。
实践中,最经常使用netstat -tunlp来显示 tcp,udp 的端口和进程等相关情况。
netstat -tunlpActiveInternetconnections(onlyservers)ProtoRecv-QSend-QLocalAddressForeignAddressStatePID/Programnametcp000.0.0.0:33060.0.0.0:*LISTEN1047/mysqldtcp000.0.0.0:220.0.0.0:*LISTEN92773/sshdtcp00127.0.0.1:60100.0.0.0:*LISTEN 262608/sshd:root@ptcp600:::33060:::*LISTEN1047/mysqldtcp600:::80:::*LISTEN96655/httpdtcp600:::22:::*LISTEN92773/sshdtcp600::1:6010:::*LISTEN 262608/sshd:root@ptcp600:::443:::*LISTEN96655/httpdtcp600:::24380:::*LISTEN730/v2rayudp00127.0.0.1:3230.0.0.0:*716/chronydudp000.0.0.0:45000.0.0.0:*2082/docker-proxyudp000.0.0.0:5000.0.0.0:*2101/docker-proxyudp600::1:323:::*716/chronydudp600:::4500:::*2088/docker-proxyudp600:::500:::*2109/docker-proxy
这里简单的科普一下网络连接状态的含义,其中重点关注LISTEN,表示这个程序正在监听某个端口。
LISTEN:(Listening for a connection.)侦听来自远方的TCP端口的连接请求SYN-SENT:(Active; sent SYN. Waiting for a matching connection request after having sent a connection request.)再发送连接请求后等待匹配的连接请求SYN-RECEIVED:(Sent and received SYN. Waiting for a confirming connection request acknowledgment after having both received and sent connection requests.)再收到和发送一个连接请求后等待对方对连接请求的确认ESTABLISHED:(Connection established.)代表一个打开的连接FIN-WAIT-1:(Closed; sent FIN.)等待远程TCP连接中断请求,或先前的连接中断请求的确认FIN-WAIT-2:(Closed; FIN is acknowledged; awaiting FIN.)从远程TCP等待连接中断请求CLOSE-WAIT:(Received FIN; waiting to receive CLOSE.)等待从本地用户发来的连接中断请求CLOSING:(Closed; exchanged FIN; waiting for FIN.)等待远程TCP对连接中断的确认LAST-ACK:(Received FIN and CLOSE; waiting for FIN ACK.)等待原来的发向远程TCP的连接中断请求的确认TIME-WAIT:(In2MSL (twice the maximum segment length) quiet wait after close. )等待足够的时间以确保远程TCP接收到连接中断请求的确认CLOSED:(Connection is closed.)没有任何连接状态
lsof
lsof(list open files)是一个列出当前系统打开文件的工具。在终端下输入lsof即可显示系统打开的文件,因为 lsof 需要访问核心内存和各种文件,所以必须以 root 用户的身份运行它才能够充分地发挥其功能。
实践中,最经常使用lsof -i来显示 tcp,udp 的端口和进程等相关情况。
lsof -iCOMMANDPIDUSERFDTYPEDEVICESIZE/OFFNODENAMEtodeskd707root7uIPv416496340t0TCPracknerd-855048:37616->43.135.63.118:https(ESTABLISHED)NetworkMa710root23uIPv4193050t0UDPracknerd-855048:bootpc->194-22-82-173-dedicated.multacom.com:bootpschronyd716chrony6uIPv4172860t0UDPlocalhost:323chronyd716chrony7uIPv6172870t0UDPlocalhost:323mysqld1047mysql22uIPv6234140t0TCP*:mysqlx(LISTEN)mysqld1047mysql24uIPv4257270t0TCP*:mysql(LISTEN)gnome-she1954gdm17uIPv415349710t0TCPracknerd-855048:48778->master1.openshift4.gnome.org:https(CLOSE_WAIT)docker-pr2082root4uIPv4264830t0UDP*:ipsec-nat-tdocker-pr2088root4uIPv6264890t0UDP*:ipsec-nat-tdocker-pr2101root4uIPv4273360t0UDP*:isakmpdocker-pr2109root4uIPv6273390t0UDP*:isakmp
也可以查看指定端口的占用情况,语法格式:lsof -i:端口号
例如查看服务器 80 端口的占用情况:
lsof-i:80COMMANDPIDUSERFDTYPEDEVICESIZE/OFFNODENAMEhttpd96655root4uIPv66454390t0TCP*:http(LISTEN)httpd139523apache4uIPv66454390t0TCP*:http(LISTEN)httpd139524apache4uIPv66454390t0TCP*:http(LISTEN)httpd139525apache4uIPv66454390t0TCP*:http(LISTEN)httpd140404apache4uIPv66454390t0TCP*:http(LISTEN)lsof输出各列信息的意义如下:
COMMAND:进程的名称
PID进程标识符
USER:进程所有者
FD:文件描述符,应用程序通过文件描述符识别该文件,如cwd、txt等
TYPE:文件类型,如DIR、REG等
DEVICE:指定磁盘的名称
SIZE:文件的大小
NODE:索引节点(文件在磁盘上的标识)
NAME:打开文件的确切名称
使用 -p 查看指定进程打开的文件
lsof -p 96655COMMANDPIDUSERFDTYPEDEVICESIZE/OFFNODENAMEhttpd96655rootcwdDIR253,140962/httpd96655rootrtdDIR253,140962/httpd96655roottxtREG253,1579992264741/usr/sbin/httpdhttpd96655rootmemREG253,16940392157792/var/lib/sss/mc/grouphttpd96655rootmemREG253,19253600133245/var/lib/sss/mc/passwdhttpd96655rootmemREG253,146272276387/usr/lib64/libnss_sss.so.2httpd96655rootmemREG253,166760524462/usr/lib64/httpd/modules/mod_proxy_http2.sohttpd96655rootmemREG253,1166880266966/usr/lib64/libnghttp2.so.14.17.0httpd96655rootmemREG253,1260320524461/usr/lib64/httpd/modules/mod_http2.sohttpd96655rootmemREG253,149288524508/usr/lib64/httpd/modules/mod_cgid.sohttpd96655rootmemREG253,112040545882/usr/lib64/httpd/modules/mod_systemd.sohttpd96655rootmemREG253,13079744271928/usr/lib64/libcrypto.so.1.1.1k
更多 lsof 的命令如下:
lsof-i: 查看IPv[46]文件lsof-i:8080:查看8080端口占用lsof-i4: 查看IPv4文件lsof-i6: 查看IPv6文件lsof-i TCP:80 查看TCP协议80端口占用情况lsof-c lsof 查看lsof命令使用的所有文件lsof-p 1234:列出进程号为1234的进程所打开的文件lsof-g gid:显示归属gid的进程情况lsof+d /usr/local/:显示目录下被进程开启的文件lsof+D /usr/local/:同上,但是会搜索目录下的目录,时间较长lsof-d 4:显示使用fd为4的进程lsof-i -U:显示所有打开的端口和UNIX domain文件