CentOS 7高级网络配置工具
目前很多Linux在使用之前的arp、ifconfig和route命令。虽然这些工具能够工作,但它们在Linux 2.2和更高版本的内核上显得有一些落伍。无论对于Linux开发者还是Linux系统管理员,网络程序调试时数据包的采集和分析是必不可少。tcpdump
是Linux中强大的数据包采集分析工具之一。本节主要介绍iproute2
和tcpdump
的相关知识。
高级网络管理工具iproute2
相对于系统提供的arp、ifconfig和route等旧版本的命令,iproute2
工具包提供了更丰富的功能,除了提供了网络参数设置,路由设置,带宽控制等功能,最新的GRE隧道也可以通过此工具进行配置。
现在大多数Linux发行版本都安装了iproute2
软件包,如没有安装可以使用yum
工具进行安装,应该注意的是yum
工具需要联网才能使用。iproute2
工具包中主要管理工具为ip
命令。下面将介绍iproute2
工具包的安装与使用。安装过程如【示例1-1】所示。
【示例1-1】
[root@node1 ~]# yum install -y iproute
#安装过程省略
[root@node1 ~]# rpm -aq | grep iproute
iproute-4.11.0-25.el7_7.2.x86_64
#检查安装情况
[root@node1 ~]# ip -V
ip utility, iproute2-ss170501
ip
命令的语法如【示例1-2】所示。
【示例1-2】
[root@node1 ~]# ip help
Usage: ip [ OPTIONS ] OBJECT { COMMAND | help }
ip [ -force ] -batch filename
where OBJECT := { link | address | addrlabel | route | rule | neigh | ntable |
tunnel | tuntap | maddress | mroute | mrule | monitor | xfrm |
netns | l2tp | fou | macsec | tcp_metrics | token | netconf | ila |
vrf }
OPTIONS := { -V[ersion] | -s[tatistics] | -d[etails] | -r[esolve] |
-h[uman-readable] | -iec |
-f[amily] { inet | inet6 | ipx | dnet | mpls | bridge | link } |
-4 | -6 | -I | -D | -B | -0 |
-l[oops] { maximum-addr-flush-attempts } | -br[ief] |
-o[neline] | -t[imestamp] | -ts[hort] | -b[atch] [filename] |
-rc[vbuf] [size] | -n[etns] name | -a[ll] | -c[olor]}
1.使用ip命令来查看网络配置
ip
命令是iproute2
软件的命令工具,可以替代ifconfig
、route
等命令,查看网络配置的用法如【示例1-3】所示。
【示例1-3】
#显示当前网卡参数,同ipconfig
[root@node1 ~]# ip addr list
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:37:b3:0d brd ff:ff:ff:ff:ff:ff
inet 192.168.139.152/24 brd 192.168.139.255 scope global noprefixroute dynamic ens33
valid_lft 1653sec preferred_lft 1653sec
inet6 fe80::e12:bbab:adf8:2d97/64 scope link noprefixroute
valid_lft forever preferred_lft forever
#添加新的网络地址
[root@node1 ~]# ip addr add 192.168.139.162/24 dev ens33
[root@node1 ~]# ip addr list | grep ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
inet 192.168.139.152/24 brd 192.168.139.255 scope global noprefixroute dynamic ens33
inet 192.168.139.162/24 scope global secondary ens33
#删除网络地址
[root@node1 ~]# ip addr del 192.168.139.162/24 dev ens33
[root@node1 ~]# ip addr list | grep ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
inet 192.168.139.152/24 brd 192.168.139.255 scope global noprefixroute dynamic ens33
上面的命令显示了机器上所有的地址,以及这些地址属于哪些网络接口。“inet”表示Internet(IPv4)。ens33的IP地址与192.168.139.152/24相关联,“/24”指IP地址表示网络地址的位数,“lo”则为本地回路信息。
2.显示路由信息
如需查看路由信息,可以使用“ip route list”命令,如【示例1-4】所示。
【示例1-4】
#查看路由情况
[root@node1 ~]# ip route list
default via 192.168.139.2 dev ens33 proto dhcp metric 100
192.168.139.0/24 dev ens33 proto kernel scope link src 192.168.139.152 metric 100
#[root@node1 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.139.2 0.0.0.0 UG 100 0 0 ens33
192.168.139.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
#添加路由
[root@node1 ~]# ip route add 192.168.139.152 dev ens33
以上示例首先查看系统中当前的路由情况,其功能和route
命令类似。
以上只是初步介绍了iproute2
的用法,更多信息请查看系统帮助。
1.5.2 网络数据采集与分析工具tcpdump
tcpdump
即dump traffic on a network
,根据使用者的定义对网络上的数据包进行截获的包分析工具。无论对于网络开发者还是系统管理员,数据包的获取与分析是最重要的技术直以。对于系统管理员来说,在网络性能急剧下降的时候,可以通过tcpdump
工具分析原因,找出造成网络阻塞的来源。对于程序开发者来说,可以通过tcpdump
工具来调试程序。tcpdump
工具来调试程序。tcpdump
支持针对网络层、协议、主机、网络或端口的过滤,并提供and
、or
、not
等逻辑语句过滤不必要的信息。
提示:Linux系统下tcpdump
普通用户是不能正常执行,一般通过root用户执行。
tcpdump
采用命令行方式,命令格式如下,参数说明如表1.1所示。
tcpdump [-aAbdDefhHIJKlLnNOpqStuUvxX#] [ -B size ] [ -c 数量 ]
[ -C file_size ] [ -E algo:secret ] [ -F 文件名 ] [ -G seconds ]
[ -i 网络接口 ] [ -j tstamptype ] [ -M secret ] [ --number ]
[ -Q|-P in|out|inout ]
[ -r 文件名 ] [ -s snaplen ] [ --time-stamp-precision precision ]
[ --immediate-mode ] [ -T 类型 ] [ --version ] [ -V file ]
[ -w 文件名 ] [ -W filecount ] [ -y datalinktype ] [ -z postrotate-command ]
[ -Z user ] [ 表达式 ]
表1.1 tcpdump命令参数含义说明
参数 | 含义 |
---|---|
-A | 以ASCII码方式显示灭一个数据包,再程序调试时可方便你查看数据 |
-a | 将网络地址和广播地址转变成名字 |
-c | tcpdump将在接收到指定数目的数据包后退出 |
-d | 将匹配信息包的代码以人们能够理解的汇编格式给出 |
-dd | 将匹配信息包的代码以C语言程序端的格式给出 |
-ddd | 将匹配信息包的代码以十进制的形式给出 |
-e | 在输出行打印出数据链路层的头部信息 |
-f | 将外部的Internet地址以数字的形式打印出来 |
-F | 使用文件作为过滤条件表达式额的输入,此时命令行上的输入将被忽略 |
-i | 指定监听的网络接口 |
-l(小写L) | 使标准输出变为缓冲行形式 |
-n | 不把网络地址转换成名字 |
-N | 不打印出host的域名部分 |
-q | 打印很少的协议相关信息,从而输出行都比较简短 |
-r | 从文件file中读取报数据 |
-s | 设置tcpdump的数据包抓取长度,如果不设置默认为68字节 |
-t | 在输出的每一行不打印时间戳 |
-tt | 不对每行输出的时间进行格式处理 |
-ttt | tcpdump输出是,每两行打印之间会延迟一个时间段,以ms为单位 |
-tttt | 在每行打印的时间戳之前添加日期的打印 |
-v | 输出一个稍微详细的信息,例如在ip包种可以包括ttl和服务类型的信息 |
-vv | 输出详细的报文信息 |
-vvv | 产生比-vv更详细的输出 |
-x | 当分析和打印时,tcpdump会打印每个包的头部数据,同时会以十六进制打印出每个包的数据,但不包括连接层的头部 |
-xx | tcpdump会打印每个包的头部数据,同时会以十六进制打印出每个包的数据,其中包括数据链路层的头部 |
-X | tcpdump会打印每个包的头部数据,同时会以十六进制和ASCII码形式打印出每个包的数据,但不包括连接层的头部 |
-XX | tcpdump会打印每个包的头部数据,同时会以十六进制和ASCII码形式打印出每个包的数据,其中包括数据链路层的头部 |
首先确认本机tcptump
是否安装,如没有安装,可以使用【示例1-5】中的方法安装。
【示例1-5】
#安装tcpdump
[root@node1 ~]# yum install -y tcpdump
#安装过程省略
tcpdump
最简单的使用方法如【示例1-6】所示。
【示例1-6】
[root@node1 ~]# tcpdump -i any
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
09:37:14.916833 IP node1.ssh > 192.168.139.1.55389: Flags [P.], seq 1374288458:1374288670, ack 3781888358, win 274, length 212
09:37:14.917031 IP 192.168.139.1.55389 > node1.ssh: Flags [.], ack 212, win 4106, length 0
09:37:14.917567 IP node1.42316 > gateway.domain: 9137+ PTR? 1.139.168.192.in-addr.arpa. (44)
09:37:14.945893 IP gateway.domain > node1.42316: 9137 NXDomain 0/1/0 (79)
09:37:14.946865 IP node1.59398 > gateway.domain: 1667+ PTR? 152.139.168.192.in-addr.arpa. (46)
09:37:15.564883 IP node1.bootpc > 192.168.139.254.bootps: BOOTP/DHCP, Request from 00:0c:29:37:b3:0d (oui Unknown), length 300
#部分结果省略,按下Ctrl+C终止输出
以上示例演示了tcpdump
最简单的使用方式,如不跟任何参数,tcpdump
会从系统接口列表搜寻编号最小的以配置好的接口,不包括loopback接口,一旦找到第1个符合条件的接口,搜寻马上结束,并将获取的数据包打印出来。
tcpdump
利用表达式作为过滤数据包的条件,表达式可以是正则表达式。如果数据包符合表达式,则数据包被截获;如果没有给出任何条件,则接口上所有的信息报包将会被截获。
表达式中一般有如下几种关键字:
(1)第1种是关于类型的关键字,如host
、net
和port
。例如host 192.168.16.150
指明192.168.16.150为一台主机,而net 192.168.16.150
则表示192.168.16.150则表示192.168.16.150为一个网络地址。如果没有指定类型,默认的类型是host
。
(2)第2种是确定数据包传输方向的关键字,包含src
、dst
、dst or src
和dst and src
,这些关键字指明了数据包的传输方向。例如src 192.168.15.150
指明数据包种的源地址是192.168.15.150,而dst 192.168.15.150
则指明数据包中的目的地址是192.168.15.150。如果没有指明方向关键字,则默认src or dst
是关键字。
(3)第3种是协议的关键字,如指明是TCP还是UDP协议。
除了这3种类型的关键字之外,还有3种逻辑运算,取非运算时“not”,或“!”,与运算是“and”或“&&”,或运算是“or”或“||”。通过这些关键字的组合可以实现复杂强大的条件。接下来看一个综合【示例1-7】所示。
【示例1-7】
[root@node1 ~]# tcpdump -i any tcp and dst host 192.168.139.152 and dst port 22 -s100 -XX -n
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 100 bytes
09:57:48.473276 IP 192.168.139.1.55389 > 192.168.139.152.ssh: Flags [.], ack 1374303674, win 4106, length 0
0x0000: 0000 0001 0006 0050 56c0 0008 0000 0800 .......PV.......
0x0010: 4500 0028 af59 4000 8006 b38b c0a8 8b01 E..(.Y@.........
0x0020: c0a8 8b98 d85d 0016 e16b 45ee 51ea 35ba .....]...kE.Q.5.
0x0030: 5010 100a 806d 0000 0000 0000 0000 0000 P....m..........
0x0040: 0000 0000 0000 0000 0000 0000 0000 ..............
以上tcpdump
表示抓取发往本机22端口的请求,“-i any”表示截获本机所有网络接口的数据包,“tcp”表示TCP协议,“dst host”表示数据包地址为192.168.139.152,“ds port”表示目的地址端口为22,“-XX”表示同时会以十六进制和ASCII码形式打印出来每个包的数据,“-s100”表示设置tcpdump
的数据包抓取长度为100字节,如果不设置默认为68字节,“-n”表示不对地址如主机地址和端口号进行数字表示到名字表示的转换。输出部分“09:57:48”表示时间,然后是发起请求的源IP端口和目的IP端口,“Flags[P.]”是TCP包中的标志信息:S是SYN标志,F表示FIN,P表示PUSH,R表示RST,“.”则表示没有标记,详细说明可进一步参考TCP各种状态之间的转换规则。