network 之四 常用 linux 网络命令及网络调试工具介绍 -ag凯发k8国际
主要就是值得 osi 参考模型与 tcp/ip 五层模型:
下面再来一张详细点的(来源于科来网络):
目前,我们常用的网络相关的命令有两大类:net-tools 和 iproute2。其中,net-tools 是前辈,iproute2 则是后起之秀。作为网络配置工具的一份子,iproute2 的出现旨在从功能上取代 net-tools。同时,一些 linux 发行版比如 arch linux 和 centos/rhel 7 则已经完全抛弃了 net-tools,只支持 iproute2。下图列举了一个两者功能对比:
此外,在我们查阅一些命令的说明文档或者看某些 linux 书的时候,常会看到 ifconfig(8)、conect(2)、select(2) 等等这样的写法。后面的这个括号及数字其实 man 手册的标准要求(表示 man 的章节号)。不同的数字表示命令的类型。使用 man man 可以进行查看:
- 1: 可执行程序或者 shell 命令。又叫用户命令, 可由任何人使用
- 2: 系统调用, 即由内核提供的函数
- 3: 库函数
- 4: 设备及特殊文件(/dev目录下)
- 5: 文件格式描述, 例如 /etc/passwd
- 6: 游戏等
- 7: 杂项, 例如宏命令包、惯例等
- 8: 系统管理员工具, 只能由 root 启动
- 9: 内核例程, 用来存放内核例行程序的文档。
- n: 新文档, 可能要移到更适合的领域。
- o: 老文档, 可能会在一段期限内保留。
- l: 本地文档,与本特定系统有关的。
在使用 man 查询这些命令的时候, 可以用下面这样的格式:$man 数字 命令。例如 : $man 1 kill 表示命令kill 、$man 2 kill 表示系统调用 kill。
这些编号的历史可以追溯到 1971 年 thompson 和 ritchie 编写的 unix programmer’s manual (unix 程序员手册),如今来看,其已经有了一些变化。如下是部分截图:
在实际使用中还会有一些非标准的编号:
net-tools
net-tools 起源于 bsd 的 tcp/ip 工具箱,后来成为老版本 linux 内核中配置网络功能的工具。但自 2001年起,linux社区已经对其停止维护。 net-tools 通过 procfs(/proc) 和 ioctl 系统调用去访问和改变内核网络配置。这套工具主要包括:arp、hostname、ifconfig、ipmaddr、iptunnel、mii-tool、nameif、netstat、plipconfig、rarp、route、slattach。
目前,我们可以从 https://sourceforge.net/projects/net-tools/ 获取到源代码。
mii-tool
mii-tool 是配置网络设备协商方式的工具。它一个较老的程序,执行与 ethtool 类似的功能。从 2003 年开始,被认为是过时的,并被 ethtool 取代。下图是 mii-tool 的用法及参数说明:
iproute2
iproute2 是一个使用 gplv2 协议开源的开源软件,源代码可以通过 github 或者 kernel.org gitweb 来查看及获取。对应的官方网站介绍是:https://wiki.linuxfoundation.org/networking/iproute2。根据ag凯发k8国际官网介绍,iproute2 原作者是 alexey kuznetsov,目前由 stephen hemminger 维护。
iproute2 就是通过 netlink 套接字接口与内核通讯的一些列小工具的集合。这些工具包括:arpd、bridge、ctstat、dcb、devlink、ip、lnstat、nstat、rdma、routef、routel、rtacct、rtmon、rtstat、ss、tc、tipc。其中的核心就是 ip 这个命令。
ethtool
ethtool 用于查看和修改网络设备(尤其是有线以太网设备)的驱动参数和硬件设置。可以根据需要更改以太网卡的参数,包括自动协商、速度、双工和局域网唤醒等参数。默认情况下,大多数系统上应该已经安装了 ethtool。如果没有,可以从发行版的官方版本库中安装。
ethtool 由内核空间和用户空间两部分,一个是 linux 内核中的 api,nic 的驱动程序软件可以使用该 api 发送和接收参数,另一个是基于 linux siocethtool ioctl 机制的用户空间 api,应用程序程序可以使用该 api 与内核通信以发送和接收 nic 和 nic 驱动程序参数。下图是 ethtool 在 linux 中的实现框架:
ethtool 的命令的基本格式是:ethtool [选项] 网络接口名。其中,[选项] 是可选的。要配置网络接口,首先就需要检查 linux 上的可用网络接口,这里就可以上面我们介绍的命令(ip 或 ifconfig)来实现。如下图所示:
旧的 linux 发行版通常使用的是 eth[x] 格式。例如,rhel 6 和它们的旧版本。现代的 linux 发行版使用 enp[xxx] 或 ens[xxx] 格式。例如, rhel 7、debian 10、ubuntu 16.04 等大多数现代 linux 发行版都使用这种格式。
获取了网络接口名字之后,重点就是 ethtool 的各个选项的含义了。ethtool 的选项非常多,下面我列出了一些常用的参数以及在我的系统上的一些示例:
- 无:当不使用任何参数的时候,默认将列出指定网络接口的配置信息。
- -a: 查看网卡中 接收模块 rx、发送模块 tx 和 autonegotiate 模块的状态:启动 on 或 停用 off。
- -a: 修改网卡中 接收模块 rx、发送模块 tx 和 autonegotiate 模块的状态:启动 on 或 停用 off。
- -c: 显示指定以太网卡的 coalesce 信息
- -c: 更改指定以太网卡的 coalesce 设置
- -g: 显示指定以太网卡的 rx/tx 环参数信息
- -g: 更改指定以太网卡的 rx/tx 环设置。
- -i: 显示网卡驱动的信息,如驱动的名称、版本等。
- -d: 显示 register dump 信息, 部分网卡驱动不支持该选项。
- -e: 显示 eeprom dump 信息,部分网卡驱动不支持该选项。
- -e: 修改网卡 eeprom byte。
- -k: 显示网卡 offload 参数的状态:on 或 off,包括rx-checksumming、tx-checksumming等。
- -k: 修改网卡 offload 参数的状态。
- -p: 用于区别不同 网卡名字 对应网卡的物理位置,常用的方法是使网卡 port 上的 led 不断的闪;n 指示了网卡闪的持续时间,以秒为单位。
- -r: 如果 auto-negotiation 模块的状态为 on,则 restarts auto-negotiation。
- -s: 显示 nic(network interface card)- and driver-specific 的统计参数,如网卡接收/发送的字节数、接收/发送的广播包个数等。
- -t: 让网卡执行自我检测,有两种模式:offline or online。
- -s: 修改网卡的部分配置,包括网卡速度、单工/全双工模式、mac 地址等。
在系统重启后,你使用 ethtool 所做的更改将被默认恢复。要使自定义设置永久化,需要更新网络配置文件中的值。根据不同的 linux 发行版,需要将修改的值更新到正确的文件中。
pcap 是用于捕获网络流量的应用程序编程接口 。类 unix 系统在 libpcap 库中实现 pcap,对于 windows,有一个名为 winpcap(已不在维护),后来有人在此基础上开发了 win10pcap,也没再更新过,还有一个名为 npcap,目前用的比较多。
-
winpcap: winpcap是一个用于 win32 平台的包捕获和网络分析的开源库。ag凯发k8国际官网是 https://www.winpcap.org/,ag凯发k8国际官网上有详细的文档 。
在 2013 年 3 月 8 日发布 4.1.3 版本之后就再也没有更新过,下载地址:https://www.winpcap.org/install/default.htm。其源代码可以在如下地址下载到 https://www.winpcap.org/devel.htm -
win10pcap: win10pcap 与 winpcap 完全兼容(安装后的 dll 同名(wpcap.dll、packet.dll)),ag凯发k8国际官网是 http://www.win10pcap.org/,根据ag凯发k8国际官网介绍,win10pcap 是基于 ndis(network driver interface specification) 6.x 驱动模型实现的,以更好的工作在 windows 10 系统,而 winpcap 是基于 ndis 5.x 驱动模型的。
在 2015 年 10 月 8 日发布了 10.2.5002 版本之后就再也没有更新,下载地址:http://www.win10pcap.org/download/。源代码托管于 github。根据ag凯发k8国际官网介绍,这就是一个个人改进的小众版本,估计后续也不怎么更新了!网络驱动程序接口规范(network driver interface specification,ndis)是微软所提供的网络接口卡(nic)api
-
npcap: 这其实也是个 winpcap 的改进版,只不过改进比较彻底,很多功能都进行了重写!ag凯发k8国际官网是 https://npcap.com/,ag凯发k8国际官网的文档也很详细(其文档就是照抄的 winpcap 然后改的)。npcap 也将驱动模型升级到了 ndis 6.x,以更好的用于 win7 及以上系统。
npcap 有免费版和商业版两种,免费版的使用限制比较多。于 2021 年 10 月 7 日发布 1.60 版本,下载地址:https://npcap.com/#download。源代码同样托管于 github。 -
libpcap: unix/linux 平台下的网络数据包捕获函数库。它是一个独立于系统的用户层包捕获的 api 接口,为底层网络监测提供了一个可移植的框架。ag凯发k8国际官网是 https://www.tcpdump.org/,文档也非常详细!
目前,最新版是 2021 年 6 月 9 日发布的 1.10.1 版本,可以直接下载预编译的可执行程序。源代码托管于 github。
strace
strace 是一个用于 linux 的诊断、调试和教学的用户空间实用程序。它用于监视和篡改进程和 linux 内核之间的交互,包括系统调用(包括参数,返回值,执行消耗的时间)、信号传递和进程状态的更改。
strace 的操作是由称为 ptrace 的内核特性实现的。源代码可以在 github 获取:https://github.com/strace/strace,官方网站是:https://strace.io/ 。
strace 的用法很简单,主要有两种模式。一种是通过它启动要跟踪的进程。用法很简单,在原本的命令前加上 strace 即可。例如:strace ethtool -g ens160,输出内容如下:
zcshou@zcshou:~$ strace strace: must have prog [args] or -p pid try 'strace -h' for more information. zcshou@zcshou:~$ strace ethtool -g ens160 execve("/sbin/ethtool", ["ethtool", "-g", "ens160"], 0x7ffc2822d1d0 /* 57 vars */) = 0 brk(null) = 0x5570315f4000 access("/etc/ld.so.nohwcap", f_ok) = -1 enoent (no such file or directory) openat(at_fdcwd, "/etc/ld.so.cache", o_rdonly|o_cloexec) = 3 fstat(3, {st_mode=s_ifreg|0644, st_size=180943, ...}) = 0 mmap(null, 180943, prot_read, map_private, 3, 0) = 0x7fcb69fc5000 ------------------------省略一大部分---------------- exited with 0另外一种运行模式,是跟踪已经在运行的进程,在不中断进程执行的情况下,理解它在干嘛。 这种情况,给 strace 传递个 -p pid 选项即可。例如:strace -p 12313。
iperf
iperf 是一个广泛使用的网络性能测量和调整工具。我们需要注意的是当前存在 iperf2 和 iperf3 这两个不同的版本 ,这两个版本是相互独立的,默认我们使用的就是 iperf2;iperf3 则是重新实现的,与 iperf2 并不兼容。目前这两个版本都在积极开发中!以下是两个的功能对比:
- iperf2 源代码托管于 https://sourceforge.net/projects/iperf2/ ;iperf3 源代码托管于 https://github.com/esnet/iperf
- iperf2 最初由 nlanr/dast 开发;iperf3 由 esnet / lawrence berkeley national laboratory 开发,并在 bsd 协议下开源
- iperf2 官方网站:https://iperf2.sourceforge.io/iperf-manpage.html;iperf3 则是参考 https://software.es.net/iperf
- iperf3 使用了 iperf2 的部分代码,他们的部分开发者同时参与了这两个版本的开发,具体见 https://iperf.fr/
- 截止发文时间,iperf2 最新版为 2.1.6,iperf3 最新版为 3.11
- iperf2 支持 windows、linux、macos;iperf3 仅支持 linux(vivien guéant 曾在 2016 年编译过 windows 版本,但后来没有再维护过)
默认情况下,linux 系统没有安装 iperf,debian 系列直接使用 sudo apt install iperf 安装即可。注意,这里安装的其实是 iperf2,如果要安装 iperf3 则需要显示指明:sudo apt install iperf3。如下图所示:
要是用 iperf,必须在测试的两台计算机上同时安装 iperf,其中一个作为服务器,另一个作为服务端。 我这里就以 iperf2 为例,在我的 window 11 与 ubuntu 两台电脑之间简单测试如下:
下面就来简单说一下 iperf 的用法。基本用法有以下四种:iperf -s [options]、iperf -c server [options]、iperf -u -s [options]、iperf -u -c server [options],其中,-s 表示服务器模式;-c server 表示以客户端模式连接到指定 server;默认是 tcp 协议,使用 -u 表示指定为 udp 协议。至于 [options] 就比较多了,如下图我截取了一部分:
至于每个参数的具体使用,需要对照手册说了来!
wireshark
wireshark 默认并没有提供 linux 的安装包,如果选择使用源代码进行安装,则要考虑各种依赖关系,非常麻烦。而且 ubuntu 的 universe 存储库中的 wireshark 版本又太低,因此,我选择了使用 wireshark 开发者提供了一种官方 ppa 方式来进行安装(目前来看,ppa 上也不是ag凯发k8国际官网最新的)。具体步骤如下:
debian 存储库中有更新的版本:https://packages.qa.debian.org/w/wireshark.html
安装时,系统会询问你是否允许非超级用户捕获数据包。使用 tab 键选择 “yes” 允许,选择“no” 限制非超级用户捕获数据包,如下图所示,按 回车确定,最后完成安装。
允许非超级用户捕获数据包,还需要将使用 wireshark 的用户添加到 wireshark 组。使用 usermod 命令将自己添加到 wireshark 组:sudo usermod -ag wireshark $(whoami),否则无法启动抓包。
如果在安装完成时不小心选择了 “no”,则以 root 用户身份运行以下命令:sudo dpkg-reconfigure wireshark-common,然后按 tab 键并使用回车键选择 “yes”。
注意:windows 系统中,wireshark 依赖于 npcap,在安装时默认就会安装 npcap;linux 系统中,wireshark 依赖于 libpcap。
xcap
xcap 是一个基于 windows 的数据包生成和发送工具,你可以使用它来创建一个数据包,然后通过计算机上指定的接口发送它。ag凯发k8国际官网是 http://xcap.weebly.com/。目前最新版是 2021年 5月 4 日 发布的1.3.0 版本。
注意,xcap 依赖 winpcap,但是 winpcap 已经不在更新,后来出了个基于 winpcap 的 win10pcap ,主要用于 win7 及以上系统,可以直接用它来代替 winpcap。
xcap 使用起来还是挺简单,xcap 的基本操作流程就是:网络接口(首先启用接口) —> 报文组(新建报文组) —> 报文(在报文组中添加多条报文)----> 发送(在启用的接口上发送选定的报文)。xcap 采用自下而上的方式一步一步来构造报文。
tcpreplay
tcpreplay (第一个字母大写)是一系列工具的总称,用于编辑和重放以前由 tcpdump 和 wireshark 等工具捕获的网络流量。目前在 gplv3 协议下开源,源代码可以在 https://github.com/appneta/tcpreplay 获取,官方网站是 https://tcpreplay.appneta.com/。主要工具如下所示:
- 网络重放工具:
- tcpreplay: 在网络上以任意速度重放 pcap 文件,并可以选择用任意 ip 地址重放
- tcpreplay-edit: 在网络上以任意速度重放 pcap 文件,有许多选项可以在动态中修改数据包
- tcpliveplay: 以远程服务器将响应的方式,在现网中重播存储在 pcap 文件中的 tcp 网络流量
- pcap 文件编辑器及实用工具:
- tcpprep:多通道 pcap 文件预处理器,它决定数据包作为客户端或服务器,并将它们分割成输出文件供 tcpreplay 和 tcprewrite 使用
- tcprewrite: pcap 文件编辑器,主要用来修改数据包的 2 层,3 层,4 层报文头,即mac 地址,ip 地址和端口等
- tcpcapinfo: pcap 文件分析器用于调试损坏的 pcap 文件
- tcpbridge: 用 tcprewrite 功能桥接两个网段
默认情况下,系统可能并没有安装 tcpreplay,debian 系列可以直接使用 sudo apt install tcpreplay 命令进行在线安装(可能不是最新版),其他系统自行搜索对应的安装命令即可。tcpreplay 的使用主要分为三步:
在 windows 11 上使用 xcap 构造了一个 icmp-ping 的报文,然后发给 ubuntu,ubuntu 上打开 wireshark 监控通信报文,将报文保存 到本地,然后使用 tcpreplay 进行回放。具体环境如下:
操作过程如下:
注意,由于我使用了 vnc 远程 ubuntu,因此会导致多了很多 tcp 报文。
总结
以上是ag凯发k8国际为你收集整理的network 之四 常用 linux 网络命令及网络调试工具介绍的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇:
- 下一篇: