3.5 Linux高级网络配置工具
目前很多Linux在使用之前的arp、ifconfig和route命令。虽然这些工具能够工作,但它们在Linux 2.2和更高版本的内核上显得有一些落伍。无论对于Linux开发者还是Linux系统管理员,网络程序调试时数据包的采集和分析是不可少的。tcpdump是Linux中强大的数据包采集分析工具之一。本节主要介绍iproute2和tcpdump的相关知识。
3.5.1 高级网络管理工具iproute2
相对于系统提供的arp、ifconfig和route等旧版本的命令,iproute2工具包提供了更丰富的功能,除了提供了网络参数设置,路由设置,带宽控制等功能,最新的GRE隧道也可以通过此工具进行配置。
现在大多数Linux发行版本都安装了iproute2软件包,如没有安装可以使用yum工具进行安装,应该注意的是yum工具需要联网才能使用。iproute2工具包中主要管理工具为ip命令。下面将介绍iproute2工具包的安装与使用。安装过程如【示例3-21】所示。
【示例3-21】
[root@CentOS Packages]# yum install -y iproute #安装过程省略 [root@CentOS Packages]# rpm -qa|grep iproute iproute-3.10.0-13.el7.x86_64 #检查安装情况 [root@CentOS Packages]# ip -V ip utility, iproute2-ss130716
ip命令的语法如【示例3-22】所示。
【示例3-22】
[root@CentOS ~]# ip help Usage: ip [ OPTIONS ] OBJECT { COMMAND | help } ip [ -force ] -batch filename where OBJECT := { link | addr | addrlabel | route | rule | neigh | ntable | tunnel | tuntap | maddr | mroute | mrule | monitor | xfrm | netns | l2tp | tcp_metrics | token } OPTIONS := { -V[ersion] | -s[tatistics] | -d[etails] | -r[esolve] | -f[amily] { inet | inet6 | ipx | dnet | bridge | link } | -4 | -6 | -I | -D | -B | -0 | -l[oops] { maximum-addr-flush-attempts } | -o[neline] | -t[imestamp] | -b[atch] [filename] | -rc[vbuf] [size]}
1.使用ip命令来查看网络配置
ip命令是iproute2软件的命令工具,可以替代ifconfig、route等命令,查看网络配置的用法如【3-23】所示。
【示例3-23】
#显示当前网卡参数,同ipconfig [root@CentOS ~]# ip addr list 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 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: eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:0b:07:76 brd ff:ff:ff:ff:ff:ff inet 192.168.128.133/24 brd 192.168.128.255 scope global dynamic eno16777736 valid_lft 1149sec preferred_lft 1149sec inet6 fe80::20c:29ff:fe0b:776/64 scope link valid_lft forever preferred_lft forever 3: eno33554984: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:0b:07:80 brd ff:ff:ff:ff:ff:ff inet 192.168.146.150/24 brd 192.168.146.255 scope global eno33554984 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fe0b:780/64 scope link valid_lft forever preferred_lft forever #添加新的网络地址 [root@CentOS ~]# ip addr add 192.168.128.140/24 dev eno16777736 [root@CentOS ~]# ip addr list #部分结果省略 4: eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:0b:07:76 brd ff:ff:ff:ff:ff:ff inet 192.168.128.133/24 brd 192.168.128.255 scope global dynamic eno16777736 valid_lft 1776sec preferred_lft 1776sec inet 192.168.128.140/24 scope global secondary eno16777736 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fe0b:776/64 scope link valid_lft forever preferred_lft forever #删除网络地址 [root@CentOS ~]# ip addr del 192.168.3.123/24 dev eth0
上面的命令显示了机器上所有的地址,以及这些地址属于哪些网络接口。“inet”表示Internet (IPv4)。eth0的IP地址与192.168.3.88/24相关联,“/24”指IP地址表示网络地址的位数,“lo”则为本地回路信息。
2.显示路由信息
如需查看路由信息,可以使用“ip route list”命令,如【示例3-24】所示。
【示例3-24】
#查看路由情况 [root@CentOS ~]# ip route list default via 192.168.146.2 dev eno33554984 proto static metric 1024 192.168.128.0/24 dev eno16777736 proto kernel scope link src 192.168.128.133 192.168.146.0/24 dev eno33554984 proto kernel scope link src 192.168.146.150 [root@CentOS ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 192.168.146.2 0.0.0.0 UG 1024 0 0 eno33554984 192.168.128.0 0.0.0.0 255.255.255.0 U 0 0 0 eno16777736 192.168.146.0 0.0.0.0 255.255.255.0 U 0 0 0 eno33554984 #添加路由 [root@CentOS ~]# ip route add 192.168.3.1 dev eno33554984
上述示例首先查看系统中当前的路由情况,其功能和route命令类似。
以上只是初步介绍了iproute2的用法,更多信息请查看系统帮助。
3.5.2 网络数据采集与分析工具tcpdump
tcpdump即dump traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具。无论对于网络开发者还是系统管理员,数据包的获取与分析是最重要的技术之一。对于系统管理员来说,在网络性能急剧下降的时候,可以通过tcpdump工具分析原因,找出造成网络阻塞的来源。对于程序开发者来说,可以通过tcpdump工具来调试程序。tcpdump支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句过滤不必要的信息。
提示
Linux系统下tcpdump普通用户是不能正常执行,一般通过root用户执行。
tcpdump采用命令行方式,命令格式如下,参数说明如表3.12所示。
tcpdump [ -adeflnNOpqStvx ] [ -c 数量 ] [ -F 文件名 ] [ -i 网络接口 ] [ -r 文件名] [ -s snaplen ] [ -T 类型 ] [ -w 文件名 ] [表达式 ]
表3.12 tcpdump命令参数含义说明
首先确认本机tcpdump是否安装,如没有安装,可以使用【示例3-25】中的方法安装。
【示例3-25】
#安装tcpdump [root@CentOS Packages]# yum install -y tcpdump #安装过程省略
tcpdump最简单的使用方法如【示例3-26】所示。
【示例3-26】
[root@CentOS Packages]# 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 65535 bytes 15:47:05.143823 IP 192.168.146.150.ssh > 192.168.146.1.52161: Flags [P.], seq 1017381117:1017381313, ack 1398930582, win 140, length 196 15:47:05.144050 IP 192.168.146.1.52161 > 192.168.146.150.ssh: Flags [.], ack 196, win 16169, length 0 15:47:06.148824 IP 192.168.146.150.56971 > ns.sc.cninfo.net.domain: 29605+PTR? 1.146.168.192.in-addr.arpa. (44) 15:47:06.158878 IP ns.sc.cninfo.net.domain > 192.168.146.150.56971: 29605 NXDomain 0/0/0 (44) #部分结果省略,按下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为一个网络地址。如果没有指定类型,默认的类型是host。
(2)第2种是确定数据包传输方向的关键字,包含src、dst、dst or src和dst and src,这些关键字指明了数据包的传输方向。例如src 192.168.16.150指明数据包中的源地址是192.168.16.150,而dst 192.168.16.150则指明数据包中的目的地址是192.168.16.150。如果没有指明方向关键字,则默认是src or dst关键字。
(3)第3种是协议的关键字,如指明是TCP还是UDP协议。
除了这3种类型的关键字之外,还有3种逻辑运算,取非运算是“not”或“!”,与运算是“and”或“&&”,或运算是“or”或“||”。通过这些关键字的组合可以实现复杂强大的条件。接下来看一个综合【示例3-27】所示。
【示例3-27】
[root@CentOS ~]# tcpdump -i any tcp and dst host 192.168.19.101 and dst port 3306 -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 16:08:05.539893 IP 192.168.19.101.49702 > 192.168.19.101.mysql: Flags [P.], seq 79:108, ack 158, win 1024, options [nop,nop,TS val 17107592 ecr 17107591], length 29 0x0000: 0000 0304 0006 0000 0000 0000 0000 0800 ................ 0x0010: 4508 0051 ffe8 4000 4006 929b c0a8 1365 E..Q..@.@......e 0x0020: c0a8 1365 c226 0cea 32aa f5e0 c46e c925 ...e.&..2....n.% 0x0030: 8018 0400 a85e 0000 0101 080a 0105 0a88 .....^.......... 0x0040: 0105 0a87 1900 0000 0373 656c 6563 7420 .........select. 0x0050: 2a20 6672 6f6d 206d 7973 716c *.from.mysql
以上tcpdump表示抓取发往本机3306端口的请求。“-i any”表示截获本机所有网络接口的数据报,“tcp”表示TCP协议,“dst host”表示数据包地址为192.168.19.101,“dst port”表示目的地址为3306,“-XX”表示同时会以十六进制和ASCII码形式打印出每个包的数据,”-s100”表示设置tcpdump的数据包抓取长度为100个字节,如果不设置默认为68字节,“-n”表示不对地址如主机地址或端口号进行数字表示到名字表示的转换。输出部分“16:08:05”表示时间,然后是发起请求的源IP端口和目的IP和端口,“Flags[P.]”是TCP包中的标志信息:S是SYN标志,F表示FIN,P表示PUSH,R表示RST,“.”则表示没有标记,详细说明可进一步参考TCP各种状态之间的转换规则。