Netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicast Memberships) 等等。
使用方式
netstat [选项] [参数]
命令参数
-a (all)显示所有选项,默认不显示LISTEN相关
-t (tcp)仅显示tcp相关选项
-u (udp)仅显示udp相关选项
-n 拒绝显示别名,能显示数字的全部转化成数字。
-l 仅列出有在 Listen (监听) 的服務状态
-p 显示建立相关链接的程序名
-r 显示路由信息,路由表
-e 显示扩展信息,例如uid等
-s 按各个协议进行统计
-c 每隔一个固定时间,执行该netstat命令。
提示:LISTEN和LISTENING的状态只有用-a或者-l才能看到
命令实例
1. 列出所有端口 (包括监听和未监听的),面试重点
列出所有端口: netstat -a
列出所有tcp端口: netstat -at
列出所有udp端口: netstat -au
//列出所有端口 netstat -a
# netstat -a | more
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 localhost:30037 *:* LISTEN
udp 0 0 *:bootpc *:*
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags Type State I-Node Path
unix 2 [ ACC ] STREAM LISTENING 6135 /tmp/.X11-unix/X0
unix 2 [ ACC ] STREAM LISTENING 5140 /var/run/acpid.socket
Proto显示连接使用的协议,
RefCnt表示连接到本套接口上的进程数量,
Types显示套接口的类型,
State显示套接口当前的状态,
Path表示连接到套接口的其它进程使用的路径名。
Active Internet connections
,称为有源TCP连接
,其中"Recv-Q"和"Send-Q"
指的是接收队列和发送队列,这些数字一般都应该是0。如果不是则表示软件包正在队列中堆积,这种情况非常少见。Active UNIX domain sockets
,称为有源Unix域套接口
(和网络套接字一样,但是只能用于本机通信
,性能可以提高一倍)。//列出所有 tcp 端口 netstat -at
# netstat -at
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 localhost:30037 *:* LISTEN
tcp 0 0 localhost:ipp *:* LISTEN
tcp 0 0 *:smtp *:* LISTEN
tcp6 0 0 localhost:ipp [::]:* LISTEN
//列出所有 udp 端口 netstat -au
# netstat -au
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
udp 0 0 *:bootpc *:*
udp 0 0 *:49119 *:*
udp 0 0 *:mdns *:*
2. 列出所有处于监听状态的 Sockets
只显示监听端口: netstat -l
只列出所有监听tcp端口: netstat -lt
只列出所有监听udp端口: netstat -lu
只列出所有监听UNIX端口: netstat -lx
// 只显示监听端口 netstat -l
# netstat -l
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 localhost:ipp *:* LISTEN
tcp6 0 0 localhost:ipp [::]:* LISTEN
udp 0 0 *:49119 *:*
//只列出所有监听 tcp 端口 netstat -lt
# netstat -lt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 localhost:30037 *:* LISTEN
tcp 0 0 *:smtp *:* LISTEN
tcp6 0 0 localhost:ipp [::]:* LISTEN
// 只列出所有监听 udp 端口 netstat -lu
# netstat -lu
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
udp 0 0 *:49119 *:*
udp 0 0 *:mdns *:*
//只列出所有监听 UNIX 端口 netstat -lx
# netstat -lx
Active UNIX domain sockets (only servers)
Proto RefCnt Flags Type State I-Node Path
unix 2 [ ACC ] STREAM LISTENING 6294 private/maildrop
unix 2 [ ACC ] STREAM LISTENING 6203 public/cleanup
unix 2 [ ACC ] STREAM LISTENING 6302 private/ifmail
unix 2 [ ACC ] STREAM LISTENING 6306 private/bsmtp
3. 不显示主机,端口和用户名 (host, port or user)
当你不想让主机,端口和用户名显示,使用 netstat -n
。将会使用数字代替
那些名称。该参数可以加速output的输出,因为不用进行比对查询。
4. 显示 PID 和进程名称(非常非常重要)
netstat -p
可以与其它开关一起使用,就可以添加 “PID/进程名称” 到 netstat 输出中,这样 debugging 的时候可以很方便的发现特定端口运行的程序
。
# netstat -pt
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 10.0.2.15:ssh 10.0.2.2:52964 ESTABLISHED 3008/sshd
tcp 0 0 10.0.2.15:ssh 10.0.2.2:52091 ESTABLISHED 2813/sshd
显示指定端口的状态信息和进程信息,也就是找出程序运行的端口:netstat -apn | grep port
//并不是所有的进程都能找到,没有权限的会不显示,使用 root 权限查看所有的信息
# netstat -apn | grep ssh
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1438/sshd
tcp 0 0 10.0.2.15:22 10.0.2.2:52964 ESTABLISHED 3008/sshd
tcp 0 0 10.0.2.15:22 10.0.2.2:52091 ESTABLISHED 2813/sshd
tcp 0 0 :::22 :::* LISTEN 1438/sshd
unix 3 [ ] STREAM CONNECTED 18443 3008/sshd
unix 3 [ ] STREAM CONNECTED 18442 3011/sshd
unix 2 [ ] DGRAM 18439 3008/sshd
unix 3 [ ] STREAM CONNECTED 17777 2813/sshd
unix 3 [ ] STREAM CONNECTED 17776 2816/sshd
unix 2 [ ] DGRAM 17773 2813/sshd
//找出运行在指定端口的进程
# netstat -an | grep ':22'
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 10.0.2.15:22 10.0.2.2:52964 ESTABLISHED
tcp 0 0 10.0.2.15:22 10.0.2.2:52091 ESTABLISHED
tcp 0 0 :::22 :::* LISTEN
用于测试另一台主机是否可达,测试网络是否连通以及时延
使用格式
ping ip
命令参数
-d 使用Socket的SO_DEBUG功能。
-f 极限检测。大量且快速地送网络封包给一台机器,看它的回应。
-n 只输出数值。
-q 不显示任何传送封包的信息,只显示最后的结果。
-r 忽略普通的Routing Table,直接将数据包送到远端主机上。通常是查看本机的网络接口是否有问题。
-R 记录路由过程。
-v 详细显示指令的执行过程。
<p>-c 数目:在发送指定数目的包后停止。
-i 秒数:设定间隔几秒送一个网络封包给一台机器,预设值是一秒送一次。
-I 网络界面:使用指定的网络界面送出数据包。
-l 前置载入:设置在送出要求信息之前,先行发出的数据包。
-p 范本样式:设置填满数据包的范本样式。
-s 字节数:指定发送的数据字节数,预设值是56,加上8字节的ICMP头,一共是64ICMP数据字节。
-t 存活数值:设置存活数值TTL的大小。
更加详细参数说明
ping通的情况
[root@localhost ~]# ping 192.168.120.205
PING 192.168.120.205 (192.168.120.205) 56(84) bytes of data.
64 bytes from 192.168.120.205: icmp_seq=1 ttl=64 time=0.720 ms
64 bytes from 192.168.120.205: icmp_seq=2 ttl=64 time=0.181 ms
64 bytes from 192.168.120.205: icmp_seq=3 ttl=64 time=0.191 ms
64 bytes from 192.168.120.205: icmp_seq=4 ttl=64 time=0.188 ms
64 bytes from 192.168.120.205: icmp_seq=5 ttl=64 time=0.189 ms
--- 192.168.120.205 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4000ms
rtt min/avg/max/mdev = 0.181/0.293/0.720/0.214 ms
图中返回内容具体的含义如下:
ping
目标主机的域名和IP(ping会自动将域名转换为IP)icmp_seq
:ping序列,从1开始;如果数字不是按顺序递增也就意味着丢包了
ping不通的情况
[root@localhost ~]# ping 192.168.120.202
PING 192.168.120.202 (192.168.120.202) 56(84) bytes of data.
From 192.168.120.204 icmp_seq=1 Destination Host Unreachable
From 192.168.120.204 icmp_seq=2 Destination Host Unreachable
From 192.168.120.204 icmp_seq=3 Destination Host Unreachable
From 192.168.120.204 icmp_seq=4 Destination Host Unreachable
From 192.168.120.204 icmp_seq=5 Destination Host Unreachable
From 192.168.120.204 icmp_seq=6 Destination Host Unreachable
--- 192.168.120.202 ping statistics ---
8 packets transmitted, 0 received, +6 errors, 100% packet loss, time 7005ms
, pipe 4
ping指定次数
[root@localhost ~]# ping -c 10 192.168.120.206
PING 192.168.120.206 (192.168.120.206) 56(84) bytes of data.
64 bytes from 192.168.120.206: icmp_seq=1 ttl=64 time=1.25 ms
64 bytes from 192.168.120.206: icmp_seq=2 ttl=64 time=0.260 ms
64 bytes from 192.168.120.206: icmp_seq=3 ttl=64 time=0.242 ms
64 bytes from 192.168.120.206: icmp_seq=4 ttl=64 time=0.271 ms
64 bytes from 192.168.120.206: icmp_seq=5 ttl=64 time=0.274 ms
64 bytes from 192.168.120.206: icmp_seq=6 ttl=64 time=0.295 ms
64 bytes from 192.168.120.206: icmp_seq=7 ttl=64 time=0.269 ms
64 bytes from 192.168.120.206: icmp_seq=8 ttl=64 time=0.270 ms
64 bytes from 192.168.120.206: icmp_seq=9 ttl=64 time=0.253 ms
64 bytes from 192.168.120.206: icmp_seq=10 ttl=64 time=0.289 ms
--- 192.168.120.206 ping statistics ---
10 packets transmitted, 10 received, 0% packet loss, time 9000ms
rtt min/avg/max/mdev = 0.242/0.367/1.251/0.295 ms
返回域名的IP地址 ,用来查询DNS记录
语法
host (选项) (参数)
选项
-a : 显示详细的DNS信息
-c<类型> : 指定查询类型,默认值为“IN”
-C : 查询指定主机的完整的SOA记录
-r : 在查询域名时,不使用递归的查询方式
-t<类型> : 指定查询的域名信息类型
-v : 显示指令执行的详细信息
-w : 如果域名系统服务器没有给出应答信息,则总是等待,直到域名服务器给出应答
-W<时间> : 指定域名查询最长时间,如果在指定时间内域名服务器没有给出应答信息,则退出指令
-4 : 使用IPv4
-6 : 使用IPv6
查出某个主机名的IP
第一种方法:是用resolv.conf中定义的DNS服务器查出百度主机的IP。
第二种方法:是用谷歌的DNS(8.8.8.8)来查百度主机的IP。
查询域名的所有信息
[root@localhost ~]# host -a www.baidu.com //查询域名的所有信息
Trying "www.baidu.com"
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 51953
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 1, ADDITIONAL: 0
;; QUESTION SECTION:
;www.baidu.com. IN ANY
;; ANSWER SECTION:
www.baidu.com. 696 IN CNAME www.a.shifen.com.
www.a.shifen.com. 22 IN A 111.13.100.91
www.a.shifen.com. 22 IN A 111.13.100.92
;; AUTHORITY SECTION:
a.shifen.com. 60 IN SOA ns1.a.shifen.com. baidu_dns_master.baidu.com. 1810060004 5 5 2592000 3600
Received 147 bytes from 172.20.10.1#53 in 10 ms
命令用来查看和配置网络设备。当网络环境发生改变时可通过此命令对网络进行相应的配置。
命令格式:
ifconfig [网络设备] [参数]
命令参数
up 启动指定网络设备/网卡。
down 关闭指定网络设备/网卡。该参数可以有效地阻止通过指定接口的IP信息流,如果想永久地关闭一个接口,我们还需要从核心路由表中将该接口的路由信息全部删除。
arp 设置指定网卡是否支持ARP协议。
-promisc 设置是否支持网卡的promiscuous模式,如果选择此参数,网卡将接收网络中发给它所有的数据包
-allmulti 设置是否支持多播模式,如果选择此参数,网卡将接收网络中所有的多播数据包
-a 显示全部接口信息
-s 显示摘要信息(类似于 netstat -i)
add 给指定网卡配置IPv6地址
del 删除指定网卡的IPv6地址
<硬件地址> 配置网卡最大的传输单元
mtu<字节数> 设置网卡的最大传输单元 (bytes)
netmask<子网掩码> 设置网卡的子网掩码。掩码可以是有前缀0x的32位十六进制数,也可以是用点分开的4个十进制数。如果不打算将网络分成子网,可以不管这一选项;如果要使用子网,那么请记住,网络中每一个系统必须有相同子网掩码。
tunel 建立隧道
dstaddr 设定一个远端地址,建立点对点通信
-broadcast<地址> 为指定网卡设置广播协议
-pointtopoint<地址> 为网卡设置点对点通讯协议
multicast 为网卡设置组播标志
address 为网卡设置IPv4地址
txqueuelen<长度> 为网卡设置传输列队的长度
使用实例:
实例1:显示网络设备信息(激活状态的)
ifconfig
eth0 Link encap:Ethernet HWaddr 00:50:56:BF:26:20
inet addr:192.168.120.204 Bcast:192.168.120.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:8700857 errors:0 dropped:0 overruns:0 frame:0
TX packets:31533 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:596390239 (568.7 MiB) TX bytes:2886956 (2.7 MiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:68 errors:0 dropped:0 overruns:0 frame:0
TX packets:68 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:2856 (2.7 KiB) TX bytes:2856 (2.7 KiB)
ifconfig eth0 up
ifconfig eth0 down
ifconfig eth0 up 为启动网卡eth0 ;
ifconfig eth0 down 为关闭网卡eth0。
实例3:配置IP地址
[root@localhost ~]# ifconfig eth0 192.168.120.56
//给eth0网卡配置IP地:192.168.120.56
[root@localhost ~]# ifconfig eth0 192.168.120.56 netmask 255.255.255.0
//给eth0网卡配置IP地址:192.168.120.56 ,并加上子掩码:255.255.255.0
[root@localhost ~]# ifconfig eth0 192.168.120.56 netmask 255.255.255.0 broadcast 192.168.120.255
///给eth0网卡配置IP地址:192.168.120.56,加上子掩码:255.255.255.0,加上个广播地址: 192.168.120.255
一般是root
)拦截和显示发送或收到过网络连接到该计算机的TCP/IP和其他数据包。
命令格式:
tcpdump [-AennqX] [-i 接口] [-w 存储文件名] [-c 次数] [-r 文件] [所要抓取的数据包格式]
命令参数
-s number:tcpdump默认只会截取前96字节的内容,要想截取所有的报文内容,就需要使用这个选项,其中number是需要截取的报文字节数,如果是0的话,表示截取报文全部内容;
-A # 数据包的内容以ASCII显示,通常用来抓取WWW的网页数据包
-e # 使用数据链路层(osi第2层)的MAC数据包数据来显示
-nn # 直接以IP及port显示,而不用主机名与服务名显示
-q # 列出较为简短的数据包信息,每一行内容比较精简
-X # 列出十六进制(hex)以及ASCII数据包内容,对于监听数据包内容很有用
-i # 后接要监听的网络接口,如eth0/eth1/lo/ppp0等
-w # 后接文件名,将监听的数据包数据存储到文件中
-r # 后接文件名,从文件中读出数据,这个文件必须存在,且是由-w所产生的
-c # 监听的数据包数,如果没有这个参数,tcpdump会一直监听,直到按Ctrl+C为止
'host 127.0.0.1' # 针对单台主机抓包
'net 192.168' # 针对某个网络抓包
'src host 127.0.0.1' 'dst net 192.168' # 同时加上源(src)和目标限制(dst)
'tcp port 21' # 针对通信协议(tcp/udp/arp/ether)、端口检测
过滤器
在服务器上的网络报文是异常的多,很多时候我们只关注和具体问题有关的数据报文,而这些有用的报文只占到很小的一部分,为了不让我们在报文的海洋里迷失自己,我们就非常有必要学习一下tcpdump提供的灵活而且功能强大的过滤器。
过滤器也可以简单地分为三类:type
,dir
和proto
。
type
:主要用来区分过滤报文源类型,主要由host
主机报文,net
网段报文和port
指定端口的报文组成;dir
:只过滤报文的源地址和目的地址,主要包括src源地址
和dst目的地址
;proto
:只过滤报文的协议类型,支持tcp,udp和icmp
等;使用的时候可以省略proto关键字:
tcpdump -i eth1 arp
tcpdump -i eth1 ip
tcpdump -i eth1 tcp
tcpdump -i eth1 udp
tcpdump -i eth1 icmp
-i eth0 监听eth0接口
port 80 监听80端口
tcp port 80 tcp80端口
udp port 80 udp80端口
src port 80 来源端口80
dst port 80 发往端口80
host 192.168.0.1监听与主机192.168.0.1通信内容
src 192.168.0.1 监听来源自192.168.0.1内容
dst 192.168.0.1 监听发往192.168.0.1内容
条件组合
抓包命令中,包含越多的限制条件,抓的无关包就会越少,所以在进行抓包时,我们可以使用“与”(and、&&)
、“或”(or、||)
和“非”(not、!)
来将多个条件组合起来。这对我们需要基于某些条件来分析网络包是非常有用的。
使用实例:
命令:tcpdump -i eth1
说明:监视指定网络接口的数据包
命令:tcpdump host 210.27.48.3
说明:截获210.27.48.3主机收到的和发出的所有数据包
命令:tcpdump host 210.27.48.4 and (210.27.48.5 or 210.27.48.6)
说明:截获210.27.48.3主机和210.27.48.5或者210.27.48.6主机进行通信的所有数据包
命令:tcpdump net 192.168.1.0/24
说明:截获192.168.1.0/24整个网络的数据包
命令:tcpdump -i eth0 src host 210.27.48.3
说明:监视eth0网卡上源地址是210.27.48.3的所有网络包
命令:tcpdump -i eth0 dst host 210.27.48.3
说明:监视eth0网卡上目的地址是210.27.48.3的所有网络包
命令:tcpdump tcp port 23 and host 210.27.48.3
说明:获取主机210.27.48.3上端口为23的应用发出和接收的所有TCP协议包
命令:tcpdump udp port 123
说明:获取本机123端口发出和接收的所有UDP协议包
命令:tcpdump src host 10.126.1.222 and dst net 10.126.1.0/24
说明:截获源主地址为10.126.1.222,目的地址是10.126.1.0/24整个网络
命令:tcpdump -i eth0 -s0 -G 60 -Z root -w %Y_%m%d_%H%M_%S.pcap
说明:抓取报文后按照指定时间间隔保存;-G选项后面接时间,单位为秒;上述命令就是每隔60秒生存一个文件
命令:tcpdump -i eth0 -s0 -C 1 -Z root -w eth0Packet.pcap
说明:抓取报文后按照指定报文大小保存;-C选项后接文件大小,单位为MB;上述命令就是每抓包文件达到1MB时就使用一个新的文件保存新抓的报文
1、https://www.cnblogs.com/ggjucheng/archive/2012/01/08/2316661.html
2、https://www.cnblogs.com/echo1937/p/6677325.html
3、https://github.com/twomonkeyclub/BackEnd/tree/master
4、https://www.cnblogs.com/peida/archive/2013/02/27/2934525.html
5、https://www.cnblogs.com/zingp/p/8000174.html
5、https://www.jellythink.com/archives/478
6、https://www.jellythink.com/archives/478