网络互连模型
主要就是值得 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。根据官网介绍,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
pcap 是用于捕获网络流量的应用程序编程接口 。类 Unix 系统在 libpcap 库中实现 pcap,对于 Windows,有一个名为 WinPcap(已不在维护),后来有人在此基础上开发了 Win10Pcap,也没再更新过,还有一个名为 Npcap,目前用的比较多。
-
WinPcap: WinPcap是一个用于 Win32 平台的包捕获和网络分析的开源库。官网是 https://www.winpcap.org/,官网上有详细的文档 。
在 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)),官网是 http://www.win10pcap.org/,根据官网介绍,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。根据官网介绍,这就是一个个人改进的小众版本,估计后续也不怎么更新了! -
Npcap: 这其实也是个 WinPcap 的改进版,只不过改进比较彻底,很多功能都进行了重写!官网是 https://npcap.com/,官网的文档也很详细(其文档就是照抄的 WinPcap 然后改的)。Npcap 也将驱动模型升级到了 NDIS 6.x,以更好的用于 Win7 及以上系统。
Npcap 有免费版和商业版两种,免费版的使用限制比较多。于 2021 年 10 月 7 日发布 1.60 版本,下载地址:https://npcap.com/#download。源代码同样托管于 Github。 -
libpcap: Unix/Linux 平台下的网络数据包捕获函数库。它是一个独立于系统的用户层包捕获的 API 接口,为底层网络监测提供了一个可移植的框架。官网是 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 上也不是官网最新的)。具体步骤如下:
sudo add-apt-repository ppa:wireshark-dev/stable
sudo apt-get update
sudo apt install wireshark
安装时,系统会询问你是否允许非超级用户捕获数据包。使用 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 的数据包生成和发送工具,你可以使用它来创建一个数据包,然后通过计算机上指定的接口发送它。官网是 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 的使用主要分为三步:
- 用 tcpprep 对报文的通信流量的两方(服务器 / 客户端)进行分离。数据包一般来自 Wireshark 或者 tcpdump 保存的 pcap 文件
- 用 tcprewrite 对报文进行改写
- 用 tcpreplay 回放数据包。当然你也可以直接回放Wireshark 或者 tcpdump 保存的 pcap 文件。
示例
在 Windows 11 上使用 xcap 构造了一个 icmp-ping 的报文,然后发给 Ubuntu,Ubuntu 上打开 Wireshark 监控通信报文,将报文保存 到本地,然后使用 tcpreplay 进行回放。具体环境如下:
操作过程如下:
注意,由于我使用了 VNC 远程 Ubuntu,因此会导致多了很多 TCP 报文。
参考
- https://en.wikipedia.org/wiki/Iproute2
- https://linux.cn/article-4326-1.html
- https://www.cnblogs.com/fyc119/p/7499829.html
- https://net-tools.sourceforge.io/
- https://blog.csdn.net/weixin_42767604/article/details/106251844
- https://linux.cn/article-12290-1.html
- http://lnmp.ailinux.net/ethtool
- http://www.uml.org.cn/embeded/201305152.asp
- https://www.cnblogs.com/wenqiang/p/6306727.html
- https://www.cnblogs.com/codestack/p/13438808.html
- https://www.cnblogs.com/machangwei-8/p/10388883.html
- https://www.cnblogs.com/ggjucheng/archive/2012/01/08/2316692.html
- https://en.wikipedia.org/wiki/Pcap
- https://www.cnblogs.com/qishui/p/5428938.html
- http://www.colasoft.com.cn/
- https://wsgzao.github.io/post/osi/
- https://www.cnblogs.com/onepixel/p/7092302.html
- https://blog.csdn.net/weixin_40748006/article/details/84661014
- https://www.jianshu.com/p/e8dca7627e46