Linux技术——netstat命令详解


简介:

Netstat 是一款命令行工具,可用于列出系统上所有的网络套接字连接情况,包括 tcp, udp 以及 unix 套接字,另外它还能列出处于监听状态(即等待接入请求)的套接字。
netstat - 打印网络连接、路由表、连接的数据统计、伪装连接以及广播域成员。


常见参数:

-a (all)显示所有选项,默认不显示LISTEN相关
-t (tcp)仅显示tcp相关选项
-u (udp)仅显示udp相关选项
-n 拒绝显示别名,能显示数字的全部转化成数字。
-l 仅列出有在 Listen (监听) 的服務状态


-p 显示建立相关链接的程序名
-r 显示路由信息,路由表
-e 显示扩展信息,例如uid等
-s 按各个协议进行统计
-c 每隔一个固定时间,执行该netstat命令。


1、列出所有的连接

netstat -a
-a选项会列出tcp,udp和unix协议下所有套接字的连接。但是我们一般只是想查找某个协议或某个端口的具体连接情况。

2、只列出TCP或UDP协议的连接

用-t选项列出TCP协议的连接
[plain]  view plain  copy
  1. root@linux_ever:~# netstat -at  
  2. 激活Internet连接 (服务器和已建立连接的)  
  3. Proto Recv-Q Send-Q Local Address           Foreign Address         State        
  4. tcp        0      0 yxk:domain              *:*                     LISTEN       
  5. tcp        0      0 *:ftp                   *:*                     LISTEN       
  6. tcp        0      0 *:ssh                   *:*                     LISTEN       
  7. tcp        0      0 localhost:ipp           *:*                     LISTEN       
  8. tcp        0      0 *:telnet                *:*                     LISTEN       
  9. tcp        0      0 *:echo                  *:*                     LISTEN       
  10. tcp        0      0 localhost:mysql         *:*                     LISTEN       
  11. tcp        0      0 *:daytime               *:*                     LISTEN       
  12. tcp        0      0 192.168.56.101:ssh      192.168.56.1:46119      ESTABLISHED  
  13. tcp6       0      0 [::]:ssh                [::]:*                  LISTEN       
  14. tcp6       0      0 ip6-localhost:ipp       [::]:*                  LISTEN       
  15. tcp6       0      0 [::]:3128               [::]:*                  LISTEN       
  16. tcp6       0      0 [::]:http               [::]:*                  LISTEN       
  17. tcp6       1      0 ip6-localhost:53757     ip6-localhost:ipp       CLOSE_WAIT   
  18. tcp6       1      0 ip6-localhost:53820     ip6-localhost:ipp       CLOSE_WAIT  

用-u选项列出UDP协议的连接
[plain]  view plain  copy
  1. root@linux_ever:~# netstat -au  
  2. 激活Internet连接 (服务器和已建立连接的)  
  3. Proto Recv-Q Send-Q Local Address           Foreign Address         State        
  4. udp        0      0 *:ipp                   *:*                                  
  5. udp        0      0 *:mdns                  *:*                                  
  6. udp        0      0 *:46678                 *:*                                  
  7. udp        0      0 *:51196                 *:*                                  
  8. udp        0      0 yxk:domain              *:*                                  
  9. udp        0      0 *:bootpc                *:*                                  
  10. udp        0      0 *:59784                 *:*                                  
  11. udp6       0      0 [::]:49703              [::]:*                               
  12. udp6       0      0 [::]:56256              [::]:*                               
  13. udp6       0      0 ip6-localhost:56355     ip6-localhost:42658     ESTABLISHED  
  14. udp6       0      0 [::]:mdns               [::]:*                               
  15. udp6       0      0 ip6-localhost:42658     ip6-localhost:56355     ESTABLISHED  
  16. udp6       0      0 [::]:36927              [::]:*   

3. 禁用反向域名解析,加快查询速度

默认情况下 netstat 会通过反向域名解析技术查找每个 IP 地址对应的主机名。这会降低查找速度。如果你觉得 IP 地址已经足够,而没有必要知道主机名,就使用 -n 选项禁用域名解析功能。

[plain]  view plain  copy
  1. root@linux_ever:~# netstat -ant  
  2. 激活Internet连接 (服务器和已建立连接的)  
  3. Proto Recv-Q Send-Q Local Address           Foreign Address         State        
  4. tcp        0      0 127.0.1.1:53            0.0.0.0:*               LISTEN       
  5. tcp        0      0 0.0.0.0:21              0.0.0.0:*               LISTEN       
  6. tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN       
  7. tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN       
  8. tcp        0      0 0.0.0.0:23              0.0.0.0:*               LISTEN       
  9. tcp        0      0 0.0.0.0:7               0.0.0.0:*               LISTEN       
  10. tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN       
  11. tcp        0      0 0.0.0.0:13              0.0.0.0:*               LISTEN       
  12. tcp        0      0 192.168.56.101:22       192.168.56.1:46119      ESTABLISHED  
  13. tcp6       0      0 :::22                   :::*                    LISTEN       
  14. tcp6       0      0 ::1:631                 :::*                    LISTEN       
  15. tcp6       0      0 :::3128                 :::*                    LISTEN       
  16. tcp6       0      0 :::80                   :::*                    LISTEN       
  17. tcp6       1      0 ::1:53757               ::1:631                 CLOSE_WAIT   
  18. tcp6       1      0 ::1:53820               ::1:631                 CLOSE_WAIT  

tcp        0      0 192.168.56.101:22       192.168.56.1:46119      ESTABLISHED 是用ssh协议登录到主机的,所以可以看到这是建立的一条tcp连接。

4. 只列出监听中的连接

任何网络服务的后台进程都会打开一个端口,用于监听接入的请求。这些正在监听的套接字也和连接的套接字一样,也能被 netstat 列出来。使用 -l 选项列出正在监听的套接字。
[plain]  view plain  copy
  1. root@linux_ever:~# netstat -tnl  
  2. 激活Internet连接 (仅服务器)  
  3. Proto Recv-Q Send-Q Local Address           Foreign Address         State        
  4. tcp        0      0 127.0.1.1:53            0.0.0.0:*               LISTEN       
  5. tcp        0      0 0.0.0.0:21              0.0.0.0:*               LISTEN       
  6. tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN       
  7. tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN       
  8. tcp        0      0 0.0.0.0:23              0.0.0.0:*               LISTEN       
  9. tcp        0      0 0.0.0.0:7               0.0.0.0:*               LISTEN       
  10. tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN       
  11. tcp        0      0 0.0.0.0:13              0.0.0.0:*               LISTEN       
  12. tcp6       0      0 :::22                   :::*                    LISTEN       
  13. tcp6       0      0 ::1:631                 :::*                    LISTEN       
  14. tcp6       0      0 :::3128                 :::*                    LISTEN       
  15. tcp6       0      0 :::80                   :::*                    LISTEN  

现在我们可以看到处于监听状态的 TCP 端口和连接。如果你查看所有监听端口,去掉 -t 选项。如果你只想查看 UDP 端口,使用 -u 选项,代替 -t 选项。
[plain]  view plain  copy
  1. root@linux_ever:~# netstat -unl  
  2. 激活Internet连接 (仅服务器)  
  3. Proto Recv-Q Send-Q Local Address           Foreign Address         State        
  4. udp        0      0 0.0.0.0:631             0.0.0.0:*                            
  5. udp        0      0 0.0.0.0:5353            0.0.0.0:*                            
  6. udp        0      0 0.0.0.0:46678           0.0.0.0:*                            
  7. udp        0      0 0.0.0.0:51196           0.0.0.0:*                            
  8. udp        0      0 127.0.1.1:53            0.0.0.0:*                            
  9. udp        0      0 0.0.0.0:68              0.0.0.0:*                            
  10. udp        0      0 0.0.0.0:59784           0.0.0.0:*                            
  11. udp6       0      0 :::49703                :::*                                 
  12. udp6       0      0 :::56256                :::*                                 
  13. udp6       0      0 :::5353                 :::*                                 
  14. udp6       0      0 :::36927                :::*   

5. 获取进程名、进程号以及用户ID

查看端口和连接的信息时,能查看到它们对应的进程名和进程号对系统管理员来说是非常有帮助的。举个例子,Apache 的 httpd 服务开启80端口,如果你要查看 http 服务是否已经启动,或者 http 服务是由 apache 还是 nginx 启动的,这时候你可以看看进程名。

使用 -p 选项查看进程信息。
[plain]  view plain  copy
  1. root@linux_ever:~# netstat -tnlp  
  2. 激活Internet连接 (仅服务器)  
  3. Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name  
  4. tcp        0      0 127.0.1.1:53            0.0.0.0:*               LISTEN      1112/dnsmasq      
  5. tcp        0      0 0.0.0.0:21              0.0.0.0:*               LISTEN      826/vsftpd        
  6. tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      813/sshd          
  7. tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      3517/cupsd        
  8. tcp        0      0 0.0.0.0:23              0.0.0.0:*               LISTEN      815/xinetd        
  9. tcp        0      0 0.0.0.0:7               0.0.0.0:*               LISTEN      815/xinetd        
  10. tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      933/mysqld        
  11. tcp        0      0 0.0.0.0:13              0.0.0.0:*               LISTEN      815/xinetd        
  12. tcp6       0      0 :::22                   :::*                    LISTEN      813/sshd          
  13. tcp6       0      0 ::1:631                 :::*                    LISTEN      3517/cupsd        
  14. tcp6       0      0 :::3128                 :::*                    LISTEN      945/squid3        
  15. tcp6       0      0 :::80                   :::*                    LISTEN      1158/apache2   
使用 -p 选项时,netstat 必须运行在 root 权限之下,不然它就不能得到运行在 root 权限下的进程名,而很多服务包括 http 和 ftp 都运行在 root 权限之下。
相比进程名和进程号而言,查看进程的拥有者会更有用。使用 -ep 选项可以同时查看进程名和用户名。

[plain]  view plain  copy
  1. root@linux_ever:~# netstat -ltep  
  2. 激活Internet连接 (仅服务器)  
  3. Proto Recv-Q Send-Q Local Address           Foreign Address         State       User       Inode       PID/Program name  
  4. tcp        0      0 yxk:domain              *:*                     LISTEN      root       10511       1112/dnsmasq      
  5. tcp        0      0 *:ftp                   *:*                     LISTEN      root       8890        826/vsftpd        
  6. tcp        0      0 *:ssh                   *:*                     LISTEN      root       9398        813/sshd          
  7. tcp        0      0 localhost:ipp           *:*                     LISTEN      root       19363       3517/cupsd        
  8. tcp        0      0 *:telnet                *:*                     LISTEN      root       9559        815/xinetd        
  9. tcp        0      0 *:echo                  *:*                     LISTEN      root       9558        815/xinetd        
  10. tcp        0      0 localhost:mysql         *:*                     LISTEN      mysql      10645       933/mysqld        
  11. tcp        0      0 *:daytime               *:*                     LISTEN      root       9557        815/xinetd        
  12. tcp6       0      0 [::]:ssh                [::]:*                  LISTEN      root       9400        813/sshd          
  13. tcp6       0      0 ip6-localhost:ipp       [::]:*                  LISTEN      root       19362       3517/cupsd        
  14. tcp6       0      0 [::]:3128               [::]:*                  LISTEN      root       200066      945/squid3        
  15. tcp6       0      0 [::]:http               [::]:*                  LISTEN      root       10582       1158/apache2  

上面列出 TCP 协议下的监听套接字,同时显示进程信息和一些额外信息。这些额外的信息包括用户名和进程的索引节点号。这个命令对网管来说很有用。

6. 打印统计数据

netstat 可以打印出网络统计数据,包括某个协议下的收发包数量。选项是-s
下面列出所有网络包的统计情况:

[plain]  view plain  copy
  1. root@linux_ever:~# netstat -s  
  2. Ip:  
  3.     共计收到421162个数据包  
  4.     0 已转发  
  5.     0 incoming packets discarded  
  6.     419945 incoming packets delivered  
  7.     245868请求已发出  
  8.     436 发出的报被抛弃  
  9.     127 被抛弃,因为没有路由  
  10. Icmp:  
  11.     6202 ICMP messages received  
  12.     18 input ICMP message failed.  
  13.     InCsumErrors: 18  
  14.     ICMP接收历史  
  15.         目的地址不可达:6117  
  16.         echo requests: 36  
  17.         echo replies: 31  
  18.     6296 ICMP messages sent  
  19.     0 ICMP messages failed  
  20.     ICMP发出历史  
  21.         目的地址不可达:6229  
  22.         echo request: 31  
  23.         echo replies: 36  

如果想只打印出 TCP 或 UDP 协议的统计数据,只要加上对应的选项(-t 和 -u)即可。
比如:
[plain]  view plain  copy
  1. root@linux_ever:~# netstat -su  
  2. IcmpMsg:  
  3.     InType0: 31  
  4.     InType3: 6117  
  5.     InType8: 36  
  6.     OutType0: 36  
  7.     OutType3: 6229  
  8.     OutType8: 31  
  9. Udp:  
  10.     22928 packets received  
  11.     6226 packets to unknown port received.  
  12.     0 packet receive errors  
  13.     24063 packets sent  
  14. UdpLite:  
  15. IpExt:  
  16.     InNoRoutes: 107  
  17.     InMcastPkts: 17763  
  18.     OutMcastPkts: 1007  
  19.     InBcastPkts: 181400  
  20.     InOctets: 87091549  
  21.     OutOctets: 93256156  
  22.     InMcastOctets: 1948386  
  23.     OutMcastOctets: 129620  
  24.     InBcastOctets: 15828501  
  25.     InNoECTPkts: 443329  

7. 显示内核路由信息

使用 -r 选项打印内核路由信息。打印出来的信息与 route 命令输出的信息一样。我们也可以使用 -n 选项禁止域名解析。
[plain]  view plain  copy
  1. root@linux_ever:~# netstat -rn  
  2. 内核 IP 路由表  
  3. Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface  
  4. 192.168.56.0    0.0.0.0         255.255.255.0   U         0 0          0 eth0  

8. 打印网络接口

netstat 也能打印网络接口信息,-i 选项就是为这个功能而生。
[plain]  view plain  copy
  1. root@linux_ever:~# netstat -i  
  2. Kernel Interface table  
  3. Iface   MTU Met   RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg  
  4. eth0       1500 0    434501      0      0 0        222915      0      0      0 BMRU  
  5. lo        65536 0     36530      0      0 0         36530      0      0      0 LRU  
上面输出的信息比较原始。我们将 -e 选项和 -i 选项搭配使用,可以输出用户友好的信息。并且和ifconfig命令输出的结果是一样的。
[plain]  view plain  copy
  1. root@linux_ever:~# netstat -ie  
  2. Kernel Interface table  
  3. eth0      Link encap:以太网  硬件地址 08:00:27:23:9c:b4    
  4.           inet 地址:192.168.56.101  广播:192.168.56.255  掩码:255.255.255.0  
  5.           inet6 地址: fe80::a00:27ff:fe23:9cb4/64 Scope:Link  
  6.           UP BROADCAST RUNNING MULTICAST  MTU:1500  跃点数:1  
  7.           接收数据包:434595 错误:0 丢弃:0 过载:0 帧数:0  
  8.           发送数据包:222934 错误:0 丢弃:0 过载:0 载波:0  
  9.           碰撞:0 发送队列长度:1000   
  10.           接收字节:93754320 (93.7 MB)  发送字节:95995756 (95.9 MB)  
  11.   
  12. lo        Link encap:本地环回    
  13.           inet 地址:127.0.0.1  掩码:255.0.0.0  
  14.           inet6 地址: ::1/128 Scope:Host  
  15.           UP LOOPBACK RUNNING  MTU:65536  跃点数:1  
  16.           接收数据包:36536 错误:0 丢弃:0 过载:0 帧数:0  
  17.           发送数据包:36536 错误:0 丢弃:0 过载:0 载波:0  
  18.           碰撞:0 发送队列长度:0   
  19.           接收字节:2911517 (2.9 MB)  发送字节:2911517 (2.9 MB)  

9. netstat 持续输出

我们可以使用 netstat 的 -c 选项持续输出信息。
比如 netstat -ct 这个命令可持续输出 TCP 协议信息。会持续输出下面的内容。
[plain]  view plain  copy
  1. root@linux_ever:~# netstat -ct  
  2. 激活Internet连接 (w/o 服务器)  
  3. Proto Recv-Q Send-Q Local Address           Foreign Address         State        
  4. tcp        0      0 192.168.56.101:ssh      192.168.56.1:46119      ESTABLISHED  
  5. tcp6       1      0 ip6-localhost:53757     ip6-localhost:ipp       CLOSE_WAIT   
  6. tcp6       1      0 ip6-localhost:53820     ip6-localhost:ipp       CLOSE_WAIT   
  7. 激活Internet连接 (w/o 服务器)  
  8. Proto Recv-Q Send-Q Local Address           Foreign Address         State        
  9. tcp        0      0 192.168.56.101:ssh      192.168.56.1:46119      ESTABLISHED  
  10. tcp6       1      0 ip6-localhost:53757     ip6-localhost:ipp       CLOSE_WAIT   
  11. tcp6       1      0 ip6-localhost:53820     ip6-localhost:ipp       CLOSE_WAIT  

10. 显示多播组信息

选项 -g 会输出 IPv4 和 IPv6 的多播组信息。
[plain]  view plain  copy
  1. root@linux_ever:~# netstat -g  
  2. IPv6/IPv4 Group Memberships  
  3. Interface       RefCnt Group  
  4. --------------- ------ ---------------------  
  5. lo              1      224.0.0.1  
  6. eth0            1      224.0.0.251  
  7. eth0            1      224.0.0.1  
  8. lo              1      ip6-allnodes  
  9. getnameinfo failed  
  10. lo              1      [未知]  
  11. getnameinfo failed  
  12. eth0            1      [未知]  
  13. getnameinfo failed  
  14. eth0            1      [未知]  
  15. eth0            1      ip6-allnodes  
  16. getnameinfo failed  
  17. eth0            1      [未知]  

11、打印 active 状态的连接

active 状态的套接字连接用 "ESTABLISHED" 字段表示,所以我们可以使用 grep 命令获得 active 状态的连接:

[plain]  view plain  copy
  1. root@linux_ever:~# netstat -atnp | grep ESTA  
  2. tcp        0     52 192.168.56.101:22       192.168.56.1:46119      ESTABLISHED 10964/1   

配合 watch 命令监视 active 状态的连接:
$ watch -d -n0 "netstat -atnp | grep ESTA"

12、查看服务是否在运行

如果你想看看 http,smtp 或 ntp 服务是否在运行,使用 grep。
[plain]  view plain  copy
  1. root@linux_ever:~# netstat -aple | grep http  
  2. tcp6       0      0 [::]:http               [::]:*                  LISTEN      root       10582       1158/apache2   
从这里可以看到 http 服务正在运行。
  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值