滴滴云DC2云服务器预装工具介绍(二)网络分析篇

针对滴滴云DC2服务器的预装工具,我们上期已经介绍了性能工具的基本用法,这次我们结合DC2服务器实例,介绍一下网络分析工具的基本用法。

DC2服务器提供了如下8种常用的网络工具,这些工具的功能非常的强大,本文会进行一些基本用法的介绍。如需获得更多用法,请参考相关工具帮助文档。

网络工具 功能介绍
nc 网络工具中的“瑞士军刀”
nmap 网络扫描和嗅探工具
nslookup 常用域名查询工具
traceroute 追踪数据包在网络上的传输时的全部路径
mtr 综合了ping/nslookup/traceroute来判断网络的相关特性
iftop 实时流量监控工具,监控TCP/IP连接
tcpdump 网络数据包截获分析工具
ipset Linux防火墙iptables的一个伴随工具,可实现对一组IP的限制

文章内的实际操作均是在DC2云服务器上进行的,相关购买操作请参见上一篇滴滴云DC2云服务器预装工具介绍(一),或者参见滴滴云DC2云服务器创建帮助文档。
登录DC2服务器之后,我们通过ifconfig命令来查看虚拟机的网络接口配置信息,以备后续操作使用。

[dc2-user@10-254-158-32 ~]$ ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.254.158.32  netmask 255.255.0.0  broadcast 10.254.255.255
        inet6 fe80::250:56ff:fe4c:3fbb  prefixlen 64  scopeid 0x20<link>
        ether 00:50:56:4c:3f:bb  txqueuelen 1000  (Ethernet)
        RX packets 168419  bytes 20518911 (19.5 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 439029  bytes 53830085 (51.3 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1  (Local Loopback)
        RX packets 27702  bytes 2407940 (2.2 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 27702  bytes 2407940 (2.2 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

nc

nc即netcat,是网络中的“瑞士军刀”,它是一款拥有多种功能的CLI工具,能在两台电脑之间建立连接,通过TCP、UDP协议传输读写数据。具体功能包括传输文件、实现简单聊天、模拟ssh登录远程主机或用它作为其他协议的独立客户端等。
nc的基本用法如下:

想要连接到某处: nc [-options] hostname port[s] [ports]

绑定端口等待连接: nc -l port [-options] [hostname] [port]

端口扫描

nc最经典的用法就是端口扫描,端口扫描经常被用来发现在一些机器上开放的端口,识别系统中的漏洞。
如下,我们扫描10.254.96.249的21-25端口

[dc2-user@10-254-164-116 ~]$ nc -v -z -n 10.254.96.249 21-25
nc: connect to 10.254.96.249 port 21 (tcp) failed: Connection refused
Connection to 10.254.96.249 22 port [tcp/*] succeeded!
nc: connect to 10.254.96.249 port 23 (tcp) failed: Connection refused
nc: connect to 10.254.96.249 port 24 (tcp) failed: Connection refused
nc: connect to 10.254.96.249 port 25 (tcp) failed: Connection refused
  • -v 参数指详细输出

  • -z 参数连接成功后立即关闭连接,不进行数据交换

  • -n 参数指不使用DNS反向查询IP地址的域名

简单聊天工具

在A机器上启动一个server:

[dc2-user@10-254-164-116 ~]$ nc -l 2222
A
B
Hello 
world

同时在B机器上启用相应的client :

[dc2-user@10-254-96-249 ~]$ nc 10.254.164.116 2222
A
B
Hello 
world

A机器上的输入便会显示在B机器上,同样的B机器上的输入也会显示在A机器上。nc命令在A机器的2222端口启动了一个tcp服务,所有的标准输入和输出都会输出到该端口。若想实现UDP方式监听,需要使用参数 -u。
在A机器启动一个UDP服务:

[dc2-user@10-254-164-116 ~]$ nc -lu 2222 
A
B

在B机器端启用相应的UDP

[dc2-user@10-254-96-249 ~]$ nc -u  10.254.164.116 2222
A
B

这是A机器上的输入便会显示在B机器上,B机器上的输入也会显示在A机器上

文件传输

在A机器上启动server并重定向输入到1.txt

[dc2-user@10-254-96-249 ~]$ echo "Hello didi" > 1.txt
[dc2-user@10-254-96-249 ~]$ cat 1.txt
Hello didi
[dc2-user@10-254-96-249 ~]$ nc -l 2222 < 1.txt

B机器上启动client进行监听,并将监听到的内容重定向输出到2.txt

[dc2-user@10-254-164-116 ~]$ nc 10.254.96.249 2222  >  2.txt
[dc2-user@10-254-164-116 ~]$ ls
2.txt
[dc2-user@10-254-164-116 ~]$ cat 2.txt
Hello didi

目录传输

如果想要传送整个目录,需要使用压缩工具tar,压缩后发送压缩包。

在A机器上,创建一个tar归档包,然后使用管道重定向给nc,nc可以通过网络进行传送。

[dc2-user@10-254-96-249 ~]$ ls test
A.txt
[dc2-user@10-254-96-249 ~]$ tar -cvf - test | nc -l 2222
test/
test/A.txt

B机器上,通过nc可以获得归档包,查看A机器上的文件

[dc2-user@10-254-164-116 ~]$ nc -n 10.254.96.249 2222 | tar -xvf -
test/
test/A.txt

其中tar的参数解释如下:

-c: 建立压缩档案

-x:解压

-v:显示所有过程

-f:tar必须带的参数

远程shell

若想要使用shell远程控制另一台机器,通常有ssh、telnet与nc。下面介绍nc的使用方法。
在A机器通过hostname显示本机IP,然后启动nc 当连接成功时执行/bin/bash

[dc2-user@10-254-96-249 ~]$ hostname
10-254-96-249
[dc2-user@10-254-96-249 ~]$ nc -l 2222 -e /bin/bash

在B机器上,连接A机器。我们仍通过hostname命令验证,可以看到在B机器上可以查询A机器的IP信息

[dc2-user@10-254-164-116 ~]$ nc 10.254.96.249 2222
hostname
10-254-96-249

另外也可以作反方向shell。在A机器上,启动nc服务

[dc2-user@10-254-96-249 ~]$ nc -l 2222

在B机器上,作为客户端连接A机器

[dc2-user@10-254-164-116 ~]$ nc 10.254.96.249 2222 -e /bin/bash

此时,即可在A机器上对B机器执行shell操作

[dc2-user@10-254-96-249 ~]$ nc -l 2222
hostname
10-254-164-116

这种反向shell操作,经常被用来绕过防火墙的限制,如阻止入站连接

端口转发

设置连接到 80 端口的连接转发到 8080 端口

[dc2-user@10-254-164-116 ~]$ sudo ncat -u -l  80 -c  'ncat -u -l 8080'

nmap

nmap是一款开源的网络探测与安全审核工具,它的设计目标是扫描大型网络。nmap基本功能有三个:扫描主机端口,嗅探所提供的网络服务;探测一组主机是否在线;推断主机所用的操作系统、到达主机经过的路由、系统已开放端口的软件版本。

nmap的基本用法为:

nmap [ip] [-options]

扫描所有tcp端口

如下,我们将扫描10.254.96.249的1-65535端口

[dc2-user@10-254-164-116 ~]$ nmap 10.254.96.249 -p 1-65535

Starting Nmap 6.40 ( http://nmap.org ) at 2018-07-10 16:25 CST
Nmap scan report for 10.254.96.249
Host is up (0.00044s latency).
Not shown: 65533 closed ports
PORT    STATE SERVICE
22/tcp  open  ssh
111/tcp open  rpcbind

Nmap done: 1 IP address (1 host up) scanned in 2.05 seconds

指定端口范围使用-p参数,如果不指定要扫描的端口,nmap默认扫描从1到1024再加上nmap-services列出的端口

扫描UDP端口

[dc2-user@10-254-164-116 ~]$ sudo nmap -sU 10.254.96.249 -Pn

Starting Nmap 6.40 ( http://nmap.org ) at 2018-07-10 16:40 CST
Nmap scan report for 10.254.96.249
Host is up (0.00045s latency).
Not shown: 998 closed ports
PORT    STATE         SERVICE
68/udp  open|filtered dhcpc
111/udp open          rpcbind
MAC Address: 00:50:56:BF:08:33 (VMware)

Nmap done: 1 IP address (1 host up) scanned in 1085.49 seconds

-sU:表示扫描UDP
-Pn:不判断主机是否在线,直接扫描端口
对于udp端口扫描比较慢,上述扫描花了1085.49s 大约18分钟。

扫描多个IP

[dc2-user@10-254-158-32 ~]$ nmap  10.254.96.249 10.254.164.116 --packet-trace

Starting Nmap 6.40 ( http://nmap.org ) at 2018-07-10 17:15 CST
CONN (0.0640s) TCP localhost > 10.254.164.116:80 => Operation now in progress
CONN (0.0642s) TCP localhost > 10.254.96.249:80 => Operation now in progress
CONN (0.0642s) TCP localhost > 10.254.164.116:443 => Operation now in progress
CONN (0.0642s) TCP localhost > 10.254.96.249:443 => Operation now in progress
CONN (2.0656s) TCP localhost > 10.254.96.249:443 => Operation now in progress
CONN (2.0657s) TCP localhost > 10.254.164.116:443 => Operation now in progress
CONN (2.0657s) TCP localhost > 10.254.96.249:80 => Operation now in progress
CONN (2.0657s) TCP localhost > 10.254.164.116:80 => Operation now in progress
Nmap done: 2 IP addresses (0 hosts up) scanned in 3.07 seconds

–packet-trace:表示显示扫描过程中收发报文统计。上述命令完成了两个IP的扫描,我们可以看出nmap在扫描过程中完成了对不同IP的不同的端口的扫描。除此之外namp还可以完成更多IP的扫描,如下我们进行连续IP的扫描

[dc2-user@10-254-158-32 ~]$  nmap 10.254.164.116-120 -Pn 

Starting Nmap 6.40 ( http://nmap.org ) at 2018-07-10 17:29 CST
Nmap scan report for 10.254.164.116
Host is up (0.053s latency).
All 1000 scanned ports on 10.254.164.116 are filtered

Nmap scan report for 10.254.164.117
Host is up (0.0039s latency).
All 1000 scanned ports on 10.254.164.117 are filtered

Nmap scan report for 10.254.164.118
Host is up (0.063s latency).
All 1000 scanned ports on 10.254.164.118 are filtered

Nmap scan report for 10.254.164.119
Host is up (0.045s latency).
All 1000 scanned ports on 10.254.164.119 are filtered

Nmap scan report for 10.254.164.120
Host is up (0.35s latency).
All 1000 scanned ports on 10.254.164.120 are filtered

Nmap done: 5 IP addresses (5 hosts up) scanned in 22.52 seconds

扫描子网所有IP

在nmap后面加一个网段就可以完成一个子网的所有IP的扫描

[dc2-user@10-254-158-32 ~]$ nmap 10.254.164.116/24

Starting Nmap 6.40 ( http://nmap.org ) at 2018-07-10 17:41 CST
Nmap done: 256 IP addresses (1 hosts up) scanned in 14.78 seconds

扫描排除某些IP

通过–exclude可以将一个网段内的部分IP排除,不进行扫描

[dc2-user@10-254-158-32 ~]$ nmap 10.254.164.116/24 --exclude 10.254.164.116-120

Starting Nmap 6.40 ( http://nmap.org ) at 2018-07-10 17:44 CST
Nmap done: 251 IP addresses (0 hosts up) scanned in 13.88 seconds            

扫描文件里面的IP

首先我们在ip.txt内写入几个IP地址,而后使用-iL参数+文件名,可以完成文件内IP地址的扫描。

[dc2-user@10-254-164-116 ~]$ vi ip.txt
[dc2-user@10-254-164-116 ~]$ cat ip.txt
10.254.96.249
10.254.164.116
10.254.158.32
[dc2-user@10-254-164-116 ~]$ nmap -iL ip.txt 

Starting Nmap 6.40 ( http://nmap.org ) at 2018-07-12 20:22 CST
Nmap scan report for 10.254.96.249
Host is up (0.0013s latency).
Not shown: 998 closed ports
PORT    STATE SERVICE
22/tcp  open  ssh
111/tcp open  rpcbind

Nmap scan report for 10.254.164.116
Host is up (0.0016s latency).
Not shown: 998 closed ports
PORT    STATE SERVICE
22/tcp  open  ssh
111/tcp open  rpcbind

扫描多个IP时,排除文件内的地址

通过–excludefile + 文件名可以达到扫描某网段时,不扫描文件内IP的目的

[dc2-user@10-254-164-116 ~]$ nmap 10.254.255.1/24 --excludefile ip.txt

nslookup

nslookup命令用于查询DNS的记录,查看域名解析是否正常,还可以在在网络故障的时候用来诊断网络问题.
nslookup的基本用法如下:

nslookup [-options] domain [dns-server]

直接查询 (A记录)

通过直接指定域名,即可查询对应的IP地址

[dc2-user@10-254-158-32 ~]$ nslookup didiyun.com
Server:     100.64.8.1
Address:    100.64.8.1#53

Non-authoritative answer:
Name:   didiyun.com
Address: 139.199.240.58

上面命令使用默认的DNS server,可以指定其他的DNS server

[dc2-user@10-254-158-32 ~]$ nslookup didiyun.com 8.8.8.8
Server:     8.8.8.8
Address:    8.8.8.8#53

Non-authoritative answer:
Name:   didiyun.com
Address: 139.199.240.58

上述命令我们不指定记录,得到的结果就是默认的A记录。A (Address)记录用来指定主机名(或域名)对应的IP地址记录。域名记录还包括MX记录、CName记录。

MX记录

MX记录(Mail Exchange)是指邮件路由记录,用户可以将该域名下的邮件服务器指向自己的mail server,之后便可自行操作控制所有的邮箱设置。查找MX记录的方法如下:

[dc2-user@10-254-158-32 ~]$ nslookup -query=mx didiyun.com
Server:     100.64.8.1
Address:    100.64.8.1#53

Non-authoritative answer:
didiyun.com mail exchanger = 10 mx2.didiyun.com.
didiyun.com mail exchanger = 10 mx1.didiyun.com.

Authoritative answers can be found from:
didiyun.com nameserver = ns3.didiwuxian.com.
didiyun.com nameserver = ns2.didiwuxian.com.
didiyun.com nameserver = ns1.didiwuxian.com.
ns1.didiwuxian.com  internet address = 123.207.209.253
ns1.didiwuxian.com  internet address = 123.207.209.254
ns1.didiwuxian.com  internet address = 123.207.209.251
ns1.didiwuxian.com  internet address = 123.207.209.252
ns2.didiwuxian.com  internet address = 124.251.93.254
ns2.didiwuxian.com  internet address = 124.251.93.252
ns3.didiwuxian.com  internet address = 139.199.240.252
ns3.didiwuxian.com  internet address = 139.199.240.254
ns3.didiwuxian.com  internet address = 139.199.241.252
ns3.didiwuxian.com  internet address = 139.199.241.254

Cname记录

CName(Canonical Name)记录,(alias from one domain name to another)一般指别名指向,它可以将你注册的不同域名统统转到一个主域名上去。查找CName记录的方法如下:

[dc2-user@10-254-158-32 ~]$ nslookup -query=cname www.didichuxing.com
Server:     100.64.8.1
Address:    100.64.8.1#53

Non-authoritative answer:
www.didichuxing.com canonical name = gz01.router.public.diditaxi.com.cn.

Authoritative answers can be found from:
didichuxing.com nameserver = ns3.didiwuxian.com.
didichuxing.com nameserver = ns1.didiwuxian.com.
didichuxing.com nameserver = ns2.didiwuxian.com.

从上面的结果上我们可以看到www.didichuxing.com是cname到gz01.router.public.diditaxi.com.cn的。

TXT记录

TXT记录用来保存域名的附加文本信息,TXT记录最常用的是SPF格式,SPF用于登记某个域名拥有的用来外发邮件的所有IP地址。使用方法如下:

[dc2-user@10-254-158-32 ~]$ nslookup -query=txt didiyun.com
Server:     100.64.8.1
Address:    100.64.8.1#53

Non-authoritative answer:
didiyun.com text = "v=spf1 include:spf.didiyun.com -all"

Authoritative answers can be found from:
com nameserver = k.gtld-servers.net.
com nameserver = m.gtld-servers.net.
com nameserver = b.gtld-servers.net.
com nameserver = g.gtld-servers.net.
com nameserver = i.gtld-servers.net.
com nameserver = l.gtld-servers.net.
com nameserver = c.gtld-servers.net.
com nameserver = j.gtld-servers.net.
com nameserver = h.gtld-servers.net.
com nameserver = f.gtld-servers.net.
com nameserver = e.gtld-servers.net.
com nameserver = a.gtld-servers.net.
com nameserver = d.gtld-servers.net.

除此之外nslookup的查询类型还包括ISDN(域名对应的ISDN号码)、MB(存放指定邮箱的服务器 )、MG(邮件组记录)、PTR(反向记录)等等,大家可以自行尝试。

上述例子均为非交互模式,我们也可以使用交互模式。

交互模式

命令行输入nslookup后回车,随即进入nslookup的交互命令行,退出需输入exit。

[dc2-user@10-254-158-32 ~]$ nslookup
> didiyun.com
Server:     100.64.8.1
Address:    100.64.8.1#53

Non-authoritative answer:
Name:   didiyun.com
Address: 139.199.240.58
> exit

traceroute

通过traceroute可以知道信息从A计算机到互联网另一端的B主机是走的什么路径。它通过发送小的数据包到目的设备直到其返回,来测量其所需时长。

traceroute的基本基本使用方法如下:

traceroute [-options] domain

Traceroute的设计原理就是利用ICMP以及IP header的TTL值,首先traceroute发送一个TTL为1的IP数据包,到达路径上的第一个路由器后TTL减1变为0,此时,该路由器将丢弃这个数据包,并返回一个「ICMP time exceeded」消息,traceroute收到这个消息后,知道该路由器位于路径上后再发送一个TTL为2的数据包,如此往复,直到数据包到达目的地。

基本用法

[dc2-user@10-254-158-32 ~]$ traceroute www.didiyun.com
traceroute to www.didiyun.com (139.199.240.58), 30 hops max, 60 byte packets
 1  * * *
 2  10.85.244.49 (10.85.244.49)  1.696 ms 10.85.244.53 (10.85.244.53)  1.627 ms 10.85.244.49 (10.85.244.49)  1.950 ms
 3  * * *
 4  125.94.53.93 (125.94.53.93)  8.563 ms  8.717 ms *
 5  113.96.6.174 (113.96.6.174)  3.476 ms 113.96.6.94 (113.96.6.94)  7.224 ms 113.96.6.146 (113.96.6.146)  9.273 ms
 6  113.96.6.133 (113.96.6.133)  9.206 ms  7.753 ms  7.693 ms
 7  14.18.199.26 (14.18.199.26)  2.282 ms 14.18.199.94 (14.18.199.94)  2.462 ms 14.18.199.18 (14.18.199.18)  2.725 ms
 8  * * *
 9  * * *
...
30  * * *

以上返回结果按序号有1-30条记录,每条记录代表一跳,每一跳又代表一个网关。
针对一条记录进行分析,我们可以看到每行有三个时间,单位均为ms,特征即IP地址+时间,这其实是traceroute的-q默认参数,默认向每个网关发送三个数据包,在网关响应后返回响应时间。返回记录中的*代表没有收到数据包的返回数据,原因可能是防火墙封住了ICMP的返回信息。

探测数据包设置

当给-q参数赋予其他的值时,将发送不同数量的探测数据包,示例如下

[dc2-user@10-254-158-32 ~]$ traceroute -q 2 www.didiyun.com
traceroute to www.didiyun.com (139.199.240.58), 30 hops max, 60 byte packets
 1  * *
 2  10.85.244.49 (10.85.244.49)  1.700 ms 10.85.244.53 (10.85.244.53)  1.858 ms
 3  * *
 4  * *
 5  113.96.6.198 (113.96.6.198)  8.736 ms 113.96.6.126 (113.96.6.126)  3.828 ms
 6  113.96.6.21 (113.96.6.21)  8.674 ms 113.96.6.133 (113.96.6.133)  8.215 ms
 7  14.18.199.90 (14.18.199.90)  2.816 ms 14.18.199.18 (14.18.199.18)  2.800 ms
 8  * *
...
30  * *

从上面的返回结果上我们可以看出,当把-q参数设置为2,traceroute将发送两个探测包,并返回响应时间。

跳数设置

除了-q参数,我们也可以改变-m参数来设置跳数。这其实就是通过设置用于输出探测信息包的最大存活时间(TTL)来改变跳数的。实例如下:

[dc2-user@10-254-158-32 ~]$ traceroute -q 2 -m 10 www.didiyun.com
traceroute to www.didiyun.com (139.199.240.58), 10 hops max, 60 byte packets
 1  * *
 2  10.85.244.49 (10.85.244.49)  1.241 ms  1.476 ms
 3  * *
 4  125.94.53.93 (125.94.53.93)  10.074 ms  9.717 ms
 5  113.96.6.190 (113.96.6.190)  3.577 ms 113.96.6.126 (113.96.6.126)  9.051 ms
 6  113.96.6.21 (113.96.6.21)  10.935 ms 113.96.6.133 (113.96.6.133)  9.293 ms
 7  14.18.199.18 (14.18.199.18)  2.546 ms 14.18.199.94 (14.18.199.94)  2.756 ms
 8  * *
 9  * *
10  * *

此时,跳数已从原来默认的30跳变为10跳。

绕过正常路由表,直接发送到相连的主机

[dc2-user@10-254-158-32 ~]$ traceroute -r www.didiyun.com
traceroute to www.didiyun.com (139.199.240.58), 30 hops max, 60 byte packets
connect: Network is unreachable

当指定的主机不在直接连接的网络上,那么将返回一个网络不可达的错误。

不解析主机名

-n参数可以实现以数字方式而不以符号加数字的方式显示跳跃地址。

[dc2-user@10-254-158-32 ~]$ traceroute -n www.didiyun.com
traceroute to www.didiyun.com (139.199.240.58), 30 hops max, 60 byte packets
 1  * * *
 2  10.85.244.49  2.104 ms 10.85.244.53  1.243 ms 10.85.244.49  1.672 ms
 3  * * *
 4  125.94.53.89  7.902 ms  8.223 ms 125.94.53.93  6.943 ms
 5  113.96.6.206  7.069 ms 113.96.6.110  5.459 ms 113.96.6.150  8.933 ms
 6  113.96.6.133  8.057 ms 113.96.6.21  10.042 ms 113.96.6.133  4.773 ms
 7  14.18.199.90  2.618 ms 14.18.199.94  2.518 ms  2.341 ms
 8  * * *
 ...
30  * * *

设置用于探测的端口号

Traceroute在送出数据包到目的地时,它所选择送达的port number是一个一般应用程序都不会用的号码(30000 以上),所以当数据包到达目的地后该主机会送回一个「ICMP port unreachable」的消息,而当traceroute 收到这个消息时,便知道目的地已经到达了。用于探测的基本UDP的端口号的缺省值为33434,我们可以通过traceroute的-p参数来改变这一值。

[dc2-user@10-254-158-32 ~]$ traceroute -p 33436 www.didiyun.com
traceroute to www.didiyun.com (139.199.240.58), 30 hops max, 60 byte packets
 1  * * *
 2  10.85.244.49 (10.85.244.49)  1.742 ms  2.149 ms 10.85.244.53 (10.85.244.53)  1.648 ms
 3  * * *
 4  125.94.53.93 (125.94.53.93)  8.382 ms  8.052 ms  7.599 ms
 5  113.96.6.218 (113.96.6.218)  8.032 ms 113.96.6.190 (113.96.6.190)  8.220 ms 113.96.6.130 (113.96.6.130)  7.686 ms
 6  113.96.6.133 (113.96.6.133)  7.448 ms  6.191 ms 113.96.6.21 (113.96.6.21)  7.943 ms
 7  14.18.199.90 (14.18.199.90)  2.436 ms 14.18.199.18 (14.18.199.18)  2.268 ms 14.18.199.86 (14.18.199.86)  2.637 ms
 8  * * *
...
30  * * *

mtr

mtr是一个网络连通性诊断工具,它结合了 traceroute 、ping和nslookup工具的功能。
mtr的基本使用方法如下:

mtr [-options] domain

动态显示

[dc2-user@10-254-158-32 ~]$ mtr -n -i 1 -c 100 www.didiyun.com

三个参数的含义如下:
* -n:不解析主机
* -i:时间间隔
* -c:发送的次数
命令执行结果如下:

滴滴云DC2云服务器预装工具介绍(二)网络分析篇_第1张图片

返回结果的含义如下:

  • Host:主机IP或主机名;
  • Loss%:丢包率;
  • Snt:每秒发送数据包的数量;
  • Last:最近一次的返回时延;
  • Avg:平均值;
  • Best:最短的一次时间;
  • Wrst:最长的一次时间;
  • StDev:标准偏差。

直接显示最后报告

-r 表示显示最终的报告,而不显示中间过程。

[dc2-user@10-254-158-32 ~]$ mtr -r www.didiyun.com
Start: Wed Jul 11 14:43:51 2018
HOST: 10-254-158-32               Loss%   Snt   Last   Avg  Best  Wrst StDev
  1.|-- 10.85.134.161             90.0%    10    2.3   2.3   2.3   2.3   0.0
  2.|-- 10.85.244.49               0.0%    10    0.9   0.8   0.7   1.0   0.0
  3.|-- ???                       100.0    10    0.0   0.0   0.0   0.0   0.0
  4.|-- 125.94.53.93               0.0%    10    2.3   3.0   2.2   8.1   1.6
  5.|-- 113.96.6.142               0.0%    10    8.5   6.0   2.6   8.9   2.4
  6.|-- 113.96.6.21                0.0%    10    5.0   4.5   3.6   9.5   1.7
  7.|-- 14.18.199.26               0.0%    10    2.4   2.5   2.3   3.5   0.3
  8.|-- ???                       100.0    10    0.0   0.0   0.0   0.0   0.0
  9.|-- ???                       100.0    10    0.0   0.0   0.0   0.0   0.0
 10.|-- ???                       100.0    10    0.0   0.0   0.0   0.0   0.0
 11.|-- ???                       100.0    10    0.0   0.0   0.0   0.0   0.0
 12.|-- 139.199.240.58             0.0%    10    3.3   3.4   3.3   3.6   0.0

iftop

iftop是一款实时流量监控工具,可以监控TCP/IP连接,缺点就是无报表功能。而且需要注意的是iftop必须以root身份才能运行。
iftop的基本使用方法如下:

sudo iftop [-options] [network card]

[dc2-user@10-254-158-32 ~]$ sudo iftop
interface: eth0
IP address is: 10.254.158.32
MAC address is: 00:50:56:4c:3f:bb

实时监控界面如下:

滴滴云DC2云服务器预装工具介绍(二)网络分析篇_第2张图片

其中第一行表示带宽,其后的行中,=>代表发送,<=代表接收,最后三列分别表示2s、10s、40s的平均流量。最下面的三行中,TX:发送流量;RX:接收流量;TOTAL:总流量;Cumm:运行期间的累积流量;peak:流量峰值。

实时监控界面下,还可以按键h获取更多的选项以切换显示自己想要的信息

指定网卡监控

使用-i参数监控指定的网卡,以下命令对环回接lo口进行监控。

[dc2-user@10-254-158-32 ~]$ sudo iftop -i lo
interface: lo
IP address is: 127.0.0.1
MAC address is: 00:00:00:00:00:00

显示IP,不进行DNS反解析

[dc2-user@10-254-158-32 ~]$ sudo iftop -n

显示端口号,不显示对应服务名称

[dc2-user@10-254-158-32 ~]$ sudo iftop -N

tcpdump

网络数据包截获分析工具。支持针对网络层、协议、主机、网络或端口的过滤。并提供and、or、not等逻辑语句帮助去除无用的信息。
tcpdump的基本使用方法如下:

sudo tcpdump [-options] [network card]

基本使用

不加任何参数,会收集网络中所有的信息报头

[dc2-user@10-254-158-32 ~]$ sudo tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
16:00:41.953892 IP 10-254-158-32.ssh > 210.13.242.129.62170: Flags [P.], seq 988951480:988951692, ack 3434489659, win 251, length 212
16:00:41.954273 IP 10-254-158-32.46653 > 100.64.8.1.domain: 15428+ PTR? 129.242.13.210.in-addr.arpa. (45)
16:00:41.955305 IP 100.64.8.1.domain > 10-254-158-32.46653: 15428 NXDomain 0/1/0 (134)
...
^C
37 packets captured
38 packets received by filter
0 packets dropped by kernel

输出结果分析:

输出格式:time.ID src > dst: flags data-seqno ack window urgent options

用DC2服务器返回的结果来分析:

16:00:41.953892 IP 10-254-158-32.ssh > 210.13.242.129.62170: Flags [P.], seq 988951480:988951692, ack 3434489659, win 251, length 212
  • 16:00:41:此包被抓取的时间;
  • 953892 :ID编号;
  • IP: 通讯协议为IP协议
  • 10-254-158-32.ssh >:数据包的源地址,其中>表示数据的传输方向
  • 210.13.242.129.62170: 目的地址即接收端的地址,端口号为62170;
  • Flags [P.]:TCP包中的标志信息 P表示Push 推送比特,还包括S(SYN), F (FIN) , R (RST) “.” (没有标记);
  • seq 988951480:988951692:数据包中的数据的顺序号;
  • ack 3434489659:下次期望的顺序号;
  • win 251:接收缓存的窗口大小为251;
  • length 212:传送报文长度212;
  • 上面未出现的urgent表明数据包中是否有紧急指针;

监听某特定网卡

使用-i参数指定要监听的网卡

[dc2-user@10-254-158-32 ~]$ sudo tcpdump -i eth0

截获网络中某主机所有数据包

在A主机上pingB主机,由此B主机上数据包的发送和接受

[dc2-user@10-254-96-249 ~]$ ping 10.254.164.116
PING 10.254.164.116 (10.254.164.116) 56(84) bytes of data.
64 bytes from 10.254.164.116: icmp_seq=1 ttl=64 time=1.09 ms
64 bytes from 10.254.164.116: icmp_seq=2 ttl=64 time=0.705 ms
64 bytes from 10.254.164.116: icmp_seq=3 ttl=64 time=0.462 ms
64 bytes from 10.254.164.116: icmp_seq=4 ttl=64 time=0.509 ms
^C
--- 10.254.164.116 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3002ms
rtt min/avg/max/mdev = 0.462/0.693/1.096/0.249 ms

在B主机上进行截获,可以查看所有B主机上发送与接收的数据包。

[dc2-user@10-254-164-116 ~]$ sudo tcpdump host 10.254.96.249
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
19:59:14.772778 IP 10.254.96.249 > 10-254-164-116: ICMP echo request, id 6065, seq 1, length 64
19:59:14.772828 IP 10-254-164-116 > 10.254.96.249: ICMP echo reply, id 6065, seq 1, length 64
19:59:15.773981 IP 10.254.96.249 > 10-254-164-116: ICMP echo request, id 6065, seq 2, length 64
...
^C
10 packets captured
10 packets received by filter
0 packets dropped by kernel

从上也可以看出,ping使用的是ICMP协议,当目的主机网络正常,就会回应该消息,返回ICMP响应消息给目的主机

监听特定来源

src后面加数据包的来源Ip地址

[dc2-user@10-254-164-116 ~]$ sudo tcpdump src 10.254.96.249

监听特定目的地址

dst后面加数据包的目的IP地址

[dc2-user@10-254-164-116 ~]$ sudo tcpdump dst 10.254.96.249

监听特定端口

[dc2-user@10-254-158-32 ~]$ sudo tcpdump port 3000

监听TCP、UDP

[dc2-user@10-254-158-32 ~]$ sudo tcpdump tcp
[dc2-user@10-254-158-32 ~]$ sudo tcpdump udp

结合实例

下面的例子,我们监听eth0网卡上来自10.254.96.249的非22端口的ICMP数据报,并保存到target.cap文件里。

[dc2-user@10-254-158-32 ~]$  sudo tcpdump icmp -i eth0 -t -s 0 -c 10 and dst port ! 22 and src net 10.254.96.249 -w ./target.cap
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
10 packets captured
10 packets received by filter
0 packets dropped by kernel
[dc2-user@10-254-158-32 ~]$ ls
1.txt  ip.txt  loop.py  target.cap

参数说明:

  • icmp: ip icmp arp rarp 和tcp、udp、icmp这些选项等都要放到第一个参数的位置,用来过滤数据报的类型
  • -i eth0 : 只抓经过接口eth0的包
  • -t : 不显示时间戳
  • -s 0 : 抓取数据包时默认抓取长度为68字节。加上-S 0 后可以抓到完整的数据包
  • -c 10 : 只抓取10个数据包
  • dst port ! 22 : 不抓取目标端口是22的数据包
  • src net 10.254.96.249: 数据包的源网络地址为10.254.96.249
  • -w ./target.cap : 保存成cap文件,方便用wireshark分析
    上述命令运行之后,会增加一个target.cap 保存截获信息。

ipset

ipset 是Linux内核的一个功能,可以对一组ip等组合成一个ipset,来完成特定的限制。在iptables中可以直接指定ipset。ipset是iptables的扩展,允许创建匹配整个地址的规则
ipset的基本使用规则如下:

ipset [-options] command [command-options]

其中command 包括:{ create | add | del | test | destroy | list | save | restore | flush | rename | swap | help | version | - }

下面,我们使用DC2服务器进行操作:创建一个以hash方式存储,存储内容为IP的ipset,将其命名为ip_y,然后将另外一台服务器的IP添加进入这个ipset。

[dc2-user@10-254-158-32 ~]$ sudo ipset create ip_y hash:ip
[dc2-user@10-254-158-32 ~]$ sudo ipset add ip_y 10.254.164.116
[dc2-user@10-254-158-32 ~]$ sudo ipset list ip_y
Name: ip_y
Type: hash:ip
Revision: 1
Header: family inet hashsize 1024 maxelem 65536
Size in memory: 16544
References: 0
Members:
10.254.164.116

通过list 关键字可以将该ipset的详细信息展示出来。

添加IP段

上面我们添加的是以hash方式存储的IP地址,我们同样也可以将网络端段添加进ipset。如下,我们给一个ipset添加一个网络段。

[dc2-user@10-254-158-32 ~]$ sudo ipset create net_y hash:net
[dc2-user@10-254-158-32 ~]$ sudo ipset add net_y 10.254.164.0/24
[dc2-user@10-254-158-32 ~]$ sudo ipset list net_y
Name: net_y
Type: hash:net
Revision: 3
Header: family inet hashsize 1024 maxelem 65536
Size in memory: 16816
References: 0
Members:
10.254.164.0/24

除此之外,我们还可以针对一个网络段进行IP地址的剔除,即把一个网段的部分IP地址从此网络段中删除保留剩余IP并放入ipset中,示例如下:

[dc2-user@10-254-158-32 ~]$ sudo ipset list net_y
Name: net_y
Type: hash:net
Revision: 3
Header: family inet hashsize 1024 maxelem 65536
Size in memory: 16848
References: 0
Members:
10.254.164.0/24
[dc2-user@10-254-158-32 ~]$ sudo ipset test 10.254.164.22
ipset v6.29: Missing second mandatory argument to command test
Try `ipset help' for more information.
[dc2-user@10-254-158-32 ~]$ sudo ipset test net_y 10.254.164.22
10.254.164.22 is in set net_y.
[dc2-user@10-254-158-32 ~]$ sudo ipset add net_y 10.254.164.22 nomatch
[dc2-user@10-254-158-32 ~]$ sudo ipset test net_y 10.254.164.22
10.254.164.22 is NOT in set net_y.
[dc2-user@10-254-158-32 ~]$ sudo ipset list net_y
Name: net_y
Type: hash:net
Revision: 3
Header: family inet hashsize 1024 maxelem 65536
Size in memory: 16848
References: 0
Members:
10.254.164.0/24
10.254.164.22 nomatch

经过test关键字的测试,我们可以发现,10.254.164.22这个IP已经从net_y这个ipset中剔除掉了。

删除

使用del命令可以删除ipset中的某个IP

[dc2-user@10-254-158-32 ~]$ sudo ipset list ip_y
Name: ip_y
Type: hash:ip
Revision: 1
Header: family inet hashsize 1024 maxelem 65536
Size in memory: 16528
References: 0
Members:
10.254.164.116
10.254.158.32
[dc2-user@10-254-158-32 ~]$ sudo ipset del ip_y 10.254.158.32
[dc2-user@10-254-158-32 ~]$ sudo ipset list ip_y
Name: ip_y
Type: hash:ip
Revision: 1
Header: family inet hashsize 1024 maxelem 65536
Size in memory: 16560
References: 0
Members:
10.254.164.116

使用flush清空某ipset,即删除该ipset中的所有members

[dc2-user@10-254-158-32 ~]$ sudo ipset list ip_y
Name: ip_y
Type: hash:ip
Revision: 1
Header: family inet hashsize 1024 maxelem 65536
Size in memory: 16608
References: 0
Members:
10.254.158.1
10.254.164.116
10.254.164.100
10.254.164.20
[dc2-user@10-254-158-32 ~]$ sudo ipset flush ip_y
[dc2-user@10-254-158-32 ~]$ sudo ipset list ip_y
Name: ip_y
Type: hash:ip
Revision: 1
Header: family inet hashsize 1024 maxelem 65536
Size in memory: 16528
References: 0
Members:

使用destroy彻底销毁某个ipset

[dc2-user@10-254-158-32 ~]$ sudo ipset list net_y
Name: net_y
Type: hash:net
Revision: 3
Header: family inet hashsize 1024 maxelem 65536
Size in memory: 16848
References: 0
Members:
10.254.164.0/24
10.254.164.22 nomatch
[dc2-user@10-254-158-32 ~]$ sudo ipset destroy net_y
[dc2-user@10-254-158-32 ~]$ sudo ipset list net_y
ipset v6.29: The set with the given name does not exist

自动过期,解封

ipset可以通过设置timeout参数完成定时的自动过期,示例如下:

[dc2-user@10-254-158-32 ~]$ sudo ipset create time_out_y hash:ip,port timeout 300
[dc2-user@10-254-158-32 ~]$ sudo ipset add time_out_y 10.254.164.116,80
[dc2-user@10-254-158-32 ~]$ sudo ipset list time_out_y 
Name: time_out_y
Type: hash:ip,port
Revision: 2
Header: family inet hashsize 1024 maxelem 65536 timeout 300
Size in memory: 16592
References: 0
Members:
10.254.164.116,tcp:80 timeout 287
[dc2-user@10-254-158-32 ~]$ sudo ipset list time_out_y 
Name: time_out_y
Type: hash:ip,port
Revision: 2
Header: family inet hashsize 1024 maxelem 65536 timeout 300
Size in memory: 16592
References: 0
Members:
[dc2-user@10-254-158-32 ~]$ sudo ipset add time_out_y 10.254.164.116,80 timeout 600

上面第一条命令创建了名为time_out_y的ipset集合,后面加了timeout参数,值为300,隔几秒执行一次sudo ipset list time_out_y可以看到这个集合里条目的timeout一直在随着时间变化,第二次查询时(300s后)可以看到,添加的IP条目已经被删除了。该参数可以通过add新的条目并赋予不同的timeout参数来进行覆盖。如上面在添加10.254.164.116,80这个条目的时候,将timeout设置成600,查询时time_out将从600开始倒数。

如果在创建ipset的时候没有设置timeout参数,之后再添加条目的时候不支持再添加该参数。如果想要默认条目不自动过期,在之后添加的条目有自动过期特征可以在创建ipset的时候将timeout参数设置为0.

增大初始大小

ipset有默认的初始大小为:hashsize=1024、maxelem=65536,这两个参数分别为创建集合时初始的hash大小和最大存储的条目数量,我们可以通过设置这两个参数来改变初始大小。示例如下:

[dc2-user@10-254-158-32 ~]$ sudo ipset create biger_y hash:ip,port hashsize 4096 maxelem 1000000
[dc2-user@10-254-158-32 ~]$ sudo ipset list biger_y
Name: biger_y
Type: hash:ip,port
Revision: 2
Header: family inet hashsize 4096 maxelem 1000000
Size in memory: 65680
References: 0
Members:

此时,这两个参数值变为hashsize=4096、maxelem=1000000,这代表biger_y这个ipset初始hash大小是4096,如果ipset满了hash还将会自动扩容为之前的两倍。最大能存储的数量是100000个。

保存与恢复

我们可以将所有集合内容输出到标准输出

[dc2-user@10-254-158-32 ~]$ sudo ipset save
create ip_y hash:ip family inet hashsize 1024 maxelem 65536
create time_out_y hash:ip,port family inet hashsize 1024 maxelem 65536 timeout 300
create biger_y hash:ip,port family inet hashsize 4096 maxelem 1000000

也可以将所有内容输出到文件

[dc2-user@10-254-158-32 ~]$ sudo ipset save -f ipset.txt

通过restore可以根据文件恢复ipset

[dc2-user@10-254-158-32 ~]$ sudo ipset destroy ip_y
[dc2-user@10-254-158-32 ~]$ sudo ipset restore -f ipset.txt

ipset存储格式

以上我们通过实验,使用了ipset的几种存储格式,其实他还有很多的存储格式,用法类似,大家可以自己去与探索一下!

Supported set types:
list:set
hash:mac
hash:net,iface
hash:net,port
hash:net,port,net
hash:net,net
hash:net
hash:ip,port,net
hash:ip,port,ip
hash:ip,mark
hash:ip,port
hash:ip
bitmap:port
bitmap:ip,mac
bitmap:ip

以上就是滴滴云DC2服务器预装的网络工具的基本用法,Linux中的网络工具能力十分强大,大家也可以在滴滴云购买DC2服务器之后进行更多用法的探索。

你可能感兴趣的:(Linux)