概述:
在日常工作中经常会遇到一些网络问题,如何去排查网络问题,需要针对性的运用一些工具,以下就是常用的一些网络工具的介绍和简单使用教程,涉及从网络端口探测到网络质量检测、网络数据包分析等。
nc工具
nc是netcat的简写,非常小巧,功能丰富强大,经常用在各种网络分析中。
主要作用:
1、实现任意TCP/UDP端口的侦听,nc可以作为server以TCP或UDP方式侦听指定端口。
2、端口的探测,nc可以作为client发起TCP或UDP连接。
3、机器之间传输文件。
nc常用参数
-l:用于指定nc将处于侦听模式。指定该参数,则意味着nc被当作server,侦听并接受连接,而非向其它地址发起连接。
-s :指定发送数据的源IP地址,适用于多网卡机
-u:指定nc使用UDP协议,默认为TCP
-v:输出详细信息
-w:超时时间单位为秒
-z:表示zero,表示扫描时不发送任何数据
常见用法
启动任意端口侦听
1 | nc -l port_number (tcp) |
1 | nc -ul port_name (udp) |
端口探测
1 | nc -vzw 2 47.104.162.0 443 (tcp) |
1 | nc -vuzw 2 47.104.162.0 9000(udp) |
-v 显示详细过程
-z只扫描不发送数据
-w超时时间(单位为秒)
-u表示udp默认不指定为TCP
传输文件
nc传输文件根传统scp和rsync相比比较方便不用输密码,只要对端有通过nc启动对应服务有暴露端口就可以,还可以通过压缩方式传输文件,提高传输效率。
方式一:
先接收端启动nc准备接收文件,比如我们传输1.py这个文件
接收端执行命令,这里命令意思就是监听TCP 9000端口,将收取到的文件重定向到当前目录sendmail.py文件
1 | nc -l 9000 > sendmail.py |
发送端执行发送命令
1 | nc 47.104.162.0 9000 < sendmai.py |
将sendmai.py重定向发送到47.104.162.0 TCP 9000端口
发送完毕后,接收端和发送端会自动退出监听。
方式二:
前面那种方式是需要先将接受端启动侦听,然后发送端在将文件通过接受端侦听的端口发送过去,方式二是反过来的是发送端先启动发送指令,然后接受端在接收
发送端执行
1 | nc -l 9000 < sendmai.py |
表示通过本机9000端口发送
接收端
1 | nc 47.104.162.1 9000 > sendmai.py |
从47.104.162.1 9000端口或取文件,然后写入到sendmai.py文件
方式三:
压缩传输,可以将整个目录文件传输到对端
接收端启动,管道后必须接的是-不能是其他
1 | nc -l 9000 |tar xfvz - |
发送端将目录下文件全部打包压缩发送到47.104.162.0 9000端口
1 | tar cfz - * |nc 47.104.162.0 9000 |
例
在发送发端创建test目录并创建文件
1 | mkdir /root/test |
1 | touch ~/test {1..100} |
接收端执行
1 | nc -l 9000 |tar xfvz - |
发送端切换test目录,执行
1 | tar cfz - * |nc 47.104.162.0 9000 |
nmap工具
全称Network Mapper是linux系统下网络扫描和嗅探工具。
主要作用
1、端口扫描,并自动分析端口对应的服务和对应的软件版本
2、主机存活检测
nmap常用参数
-s:扫描模式
-S:指定源IP
-p:指定端口范围扫描
-sV:暴露端口的软件的版本
-n:不做dns解析
-sn:不做端口扫描只检测主机存活
-e :指定网卡
-Pn:跳过主机存活性检测
-Su:仅扫描UDP端口
-sS:半连接方式扫描,不需要完成完整的tcp三次握手简单来说就是一个TCP_SYN扫描,扫描器对客户端发送syn包,得到ack响应,扫描器发送一个RST包断开连接,这样就不用完成三次握手,建立正常的TCP连接。
常见用法:
端口扫描
1 | nmap ip_addr |
直接不接任何参数扫描,默认户将tcp,udp这些全部列出来
加了-sS以后就是嗅探tcp时效率高点,其他都一样
可以对域名进行扫描也可以对IP进行扫描
1 | nmap -sS ip_addr |
端口状态
open:端口处于开放状态,可以建立正常的连接。
closed:端口处于关闭状态,没有应用在监听这个端口。
Filtered:发出去的探测报文被过滤了,返回的ICMP报文状态是目的主机不可达,nmap无法确定端口状态,同时端口无法被nmap访问。
Unfiltered:未被过滤状态,nmap不确定端口状态,但端口能被nmap访问。
open|filtered:无法确定端口是open还是filtered状态,比如常见的开放的端口不响应发出去的请求就是这种状态。
按照上述命令扫描端口默认是扫描1-1024+nmap-server数据库里面收录的一些已知应用端口,所以要扫描大范围需要使用-p参数如
1 | nmap ip_addr -p1-65535 |
软件版本检测
列出扫描出的端口对应的应用的软件版本信息,这里就直接显示了openssh的版本和对应的操作系统信息
1 | nmap -sV 172.31.164.57 |
通过ping扫描指定范围内机器是否up
经常要测试一个地址范围内ip的联通性就可以使用这个命令
1 | nmap -sn 172.31.164.57-60 |
伪装源ip检测
在用些场景我们需要伪装我们的源IP去进行嗅探,或我们的源IP被防火墙拉入了黑名单此时可以通过伪装ip的方式进行检测,
1 | nmap -e eth0 10.0.1.161 -S 10.0.1.167 -Pn |
使用-S伪装自己源地址进行扫描的话,你必须另外使用-e 指定网卡和-Pn参数才能伪装
iperf工具
iperf是一款网络性能测试工具,主要用来测试网络之间的带宽和丢包率。
主要作用
1、网络带宽性能测试
2、网络丢包率测试(UDP关注点)
iperf3常用参数
iperf3常用参数
-f, –format [bkmaBKMA]
格式化带宽数输出。支持的格式有:
‘b’ = bits/sec ‘B’ = Bytes/sec
‘k’ = Kbits/sec ‘K’ = KBytes/sec
‘m’ = Mbits/sec ‘M’ = MBytes/sec
‘g’ = Gbits/sec ‘G’ = GBytes/sec
‘a’ = adaptive bits/sec ‘A’ = adaptive Bytes/sec
-i:设置每次报告之间的时间间隔,单位为秒。如果设置为非零值,就会按照此时间间隔输出测试报告。默认值为零。
-l,[KM]:设置读写缓冲区的长度。TCP方式默认为8KB,UDP方式默认为1470字节。
-m, –print_mss:输出TCP MSS值(通过TCP_MAXSEG支持)。MSS值一般比MTU值小40字节。
-p:设置端口,与服务器端的监听端口一致。默认是5001端口,与tcp的一样。
-u:使用UDP方式而不是TCP方式(iperf3不需要)
-b: 指定带宽(测试UDP时使用)
-B:绑定到主机的多个地址中的一个。对于客户端来说,这个参数设置了出站接口。对于服务器端来说,这个参数设置入栈接口。这个参数只用于具有多网络接口的主机。在Iperf的UDP模式下,此参数用于绑定和加入一个多播组。使用范围在224.0.0.0至239.255.255.255的多播地址。参考-T参数。
-M, –mss #[KM}:通过TCP_MAXSEG选项尝试设置TCP最大信息段的值。MSS值的大小通常是TCP/IP头减去40字节。在以太网中,MSS值 为1460字节(MTU1500字节)。许多操作系统不支持此选项。
-s:Server模式运行
-c:Client模式运行,后面接上连接server的ip
-P:测试数据流并发数量
iper3常见用法
测试性能
服务器端
1 | iperf3 -s -i2 -p 5001 |
客户端
1 | iperf3 -i 1 -c x.x.x.x -t 60 |
-i多久显示一次,单位S
-c后跟服务器IP
-t持续多久,单位秒
需要在主机上打开5001端口
1 | iptables -I INPUT -p tcp --dport 5001 -j ACCEPT |
测试,可以发现,每秒都会显示网络带宽,这个网络是个千兆网络,默认是以4个并发进行测试的,如果发现带宽根实际物理带宽差距太大可以调整并发数在测试。
tcpdump工具
tcpdump是linux下最常用的抓包分析工具。
主要作用:
1、抓取网卡数据包
tcpdump参数
-i:指定监听的端口
-w:将结果保存到指定位置,可以保存成cap文件用wireshark做数据包分析
-vnn:以ip和端口方式输出详细信息
-c:抓取包的数量,默认不指定会一直不断的抓直到ctrl+c
-nn:以ip和端口方式显示,不以主机名和服务名方式显示,可以看起来直观
-v:输出详细信息
-X 直接输出package data数据,默认不设置,只能通过-w指定文件进行输出
常见用法:
监视指定网络接口的数据包
1 | tcpdump -i eth1 |
如果不指定网卡,默认tcpdump只会监视第一个网络接口,一般是eth0,下面的例子都没有指定网络接口。
监视指定主机的数据包(如rke-node1)
1 | tcpdump host rke-node1 |
输出test-1 与 test-2或者与 test-3 之间通信的数据包
1 | tcpdump host test-1 and \( test-2 or test-3 \) |
打印test-1与任何其他主机之间通信的IP 数据包, 但不包括与test-2之间的数据包.
1 | tcpdump host test-1 and ! test-2 |
截获源ip为xxx.xxx.xxx.xxx发送的所有数据
1 | tcpdump -i eth0 src host xxx.xxx.xxx.xxx |
监视所有送到目的主机的数据包
1 | tcpdump -i eth0 dst host ipaddr or hostname |
抓取100个数据包信息保存为cap文件可以用wireshark分析
1 | tcpdump -i eth0 -c 100 -w /tmp/capture2.cap |
抓取指定协议的数据包
1 | tcpdump -i eth0 -vnn icmp -w /tmp/1 |
抓取udp协议的123端口的数据包
1 | tcpdump udp port 123 |
抓取host为192.168.1.1并且udp端口为23的数据包
1 | tcpdump tcp port 23 and host 192.168.1.1 |
netstat工具
netstat是一款本机网络状态分析工具
作用:
分析本机端口监听状态,连接状态,连接数等
netstat常用参数
-a :显示所有状态连接
-n:显示ip地址
-t:显示TCP协议连接
-l:显示LISTEN状态连接
-u:显示UDP状态连接
-p:显示socket的PID和程序名
-i:显示网卡信息
TCP连接的常见状态
LISTENING:侦听状态
ESTABLISHED:建立连接状态
CLOSE_WAIT:等待关闭状态。
TIME_WAIT:主动关闭连接的一方会进入TIME_WAIT状态。为了防止最终的ACK包未到达,活动的TCP连接等待2MSL时间释放连接。
SYN_SENT:表示请求连接,发送SYN报文。
常见用法:
列出本机所有tcp连接
1 | netstat -at |
列出本机所有udp连接
1 | netstat -au |
显示所有数据包的统计情况
1 | netstat -s |
显示网络接口收发报情况
1 | netstat -i |
列出本机LISTEN状态的TCP端口
1 | netstat -lnt |
列出本机所有LISTEN状态的UDP端口
1 | netstat -lnu |
统计产生TIME_WAIT最多的几个IP
1 | netstat -ptan | grep TIME_WAIT |awk '{print $5}' |awk -F : '{print $1}'|sort |uniq -c|sort -r |