CentOS 7高级网络配置工具

目前很多Linux在使用之前的arp、ifconfig和route命令。虽然这些工具能够工作,但它们在Linux 2.2和更高版本的内核上显得有一些落伍。无论对于Linux开发者还是Linux系统管理员,网络程序调试时数据包的采集和分析是必不可少。tcpdump是Linux中强大的数据包采集分析工具之一。本节主要介绍iproute2tcpdump的相关知识。

高级网络管理工具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软件的命令工具,可以替代ifconfigroute等命令,查看网络配置的用法如【示例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

tcpdumpdump traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具。无论对于网络开发者还是系统管理员,数据包的获取与分析是最重要的技术直以。对于系统管理员来说,在网络性能急剧下降的时候,可以通过tcpdump工具分析原因,找出造成网络阻塞的来源。对于程序开发者来说,可以通过tcpdump工具来调试程序。tcpdump工具来调试程序。tcpdump支持针对网络层、协议、主机、网络或端口的过滤,并提供andornot等逻辑语句过滤不必要的信息。

提示: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将网络地址和广播地址转变成名字
-ctcpdump将在接收到指定数目的数据包后退出
-d将匹配信息包的代码以人们能够理解的汇编格式给出
-dd将匹配信息包的代码以C语言程序端的格式给出
-ddd将匹配信息包的代码以十进制的形式给出
-e在输出行打印出数据链路层的头部信息
-f将外部的Internet地址以数字的形式打印出来
-F使用文件作为过滤条件表达式额的输入,此时命令行上的输入将被忽略
-i指定监听的网络接口
-l(小写L)使标准输出变为缓冲行形式
-n不把网络地址转换成名字
-N不打印出host的域名部分
-q打印很少的协议相关信息,从而输出行都比较简短
-r从文件file中读取报数据
-s设置tcpdump的数据包抓取长度,如果不设置默认为68字节
-t在输出的每一行不打印时间戳
-tt不对每行输出的时间进行格式处理
-ttttcpdump输出是,每两行打印之间会延迟一个时间段,以ms为单位
-tttt在每行打印的时间戳之前添加日期的打印
-v输出一个稍微详细的信息,例如在ip包种可以包括ttl和服务类型的信息
-vv输出详细的报文信息
-vvv产生比-vv更详细的输出
-x当分析和打印时,tcpdump会打印每个包的头部数据,同时会以十六进制打印出每个包的数据,但不包括连接层的头部
-xxtcpdump会打印每个包的头部数据,同时会以十六进制打印出每个包的数据,其中包括数据链路层的头部
-Xtcpdump会打印每个包的头部数据,同时会以十六进制和ASCII码形式打印出每个包的数据,但不包括连接层的头部
-XXtcpdump会打印每个包的头部数据,同时会以十六进制和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种是关于类型的关键字,如hostnetport。例如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种是确定数据包传输方向的关键字,包含srcdstdst or srcdst 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各种状态之间的转换规则。

最后修改:2020 年 10 月 19 日 07 : 46 PM
如果觉得我的文章对你有用,请随意赞赏