网络互连模型

主要就是值得 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 系统调用去访问和改变内核网络配置。这套工具主要包括:arphostnameifconfigipmaddriptunnelmii-toolnameifnetstatplipconfigrarprouteslattach

目前,我们可以从 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 套接字接口与内核通讯的一些列小工具的集合。这些工具包括:arpdbridgectstatdcbdevlinkiplnstatnstatrdmaroutefroutelrtacctrtmonrtstatsstctipc。其中的核心就是 ip 这个命令。

ethtool

  ethtool 用于查看和修改网络设备(尤其是有线以太网设备)的驱动参数和硬件设置。可以根据需要更改以太网卡的参数,包括自动协商、速度、双工和局域网唤醒等参数。默认情况下,大多数系统上应该已经安装了 ethtool。如果没有,可以从发行版的官方版本库中安装。

  1. 不同的发行版安装命令不同。例如,对于基于 Debian 的系统,使用 apt 命令 或 apt-get 命令安装:sudo apt-get install ethtool
  2. 了解众多 Linux发行版参考:Linux 之五 最新 2021 一图看尽 Linux 发行版
  3. ethtool 的源代码可以从 https://mirrors.edge.kernel.org/pub/software/network/ethtool/ 获取

  ethtool 由内核空间和用户空间两部分,一个是 Linux 内核中的 API,NIC 的驱动程序软件可以使用该 API 发送和接收参数,另一个是基于 Linux SIOCETHTOOL Ioctl 机制的用户空间 API,应用程序程序可以使用该 API 与内核通信以发送和接收 NIC 和 NIC 驱动程序参数。下图是 ethtool 在 Linux 中的实现框架:

  ethtool 的命令的基本格式是:ethtool [选项] 网络接口名。其中,[选项] 是可选的。要配置网络接口,首先就需要检查 Linux 上的可用网络接口,这里就可以上面我们介绍的命令(ipifconfig)来实现。如下图所示:

  旧的 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。根据官网介绍,这就是一个个人改进的小众版本,估计后续也不怎么更新了!

    网络驱动程序接口规范(Network Driver Interface Specification,NDIS)是微软所提供的网络接口卡(NIC)API

  • 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 上也不是官网最新的)。具体步骤如下:

  1. sudo add-apt-repository ppa:wireshark-dev/stable
  2. sudo apt-get update
  3. sudo apt install wireshark

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 的数据包生成和发送工具,你可以使用它来创建一个数据包,然后通过计算机上指定的接口发送它。官网是 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 的使用主要分为三步:

  1. 用 tcpprep 对报文的通信流量的两方(服务器 / 客户端)进行分离。数据包一般来自 Wireshark 或者 tcpdump 保存的 pcap 文件
  2. 用 tcprewrite 对报文进行改写
  3. 用 tcpreplay 回放数据包。当然你也可以直接回放Wireshark 或者 tcpdump 保存的 pcap 文件。

示例

  在 Windows 11 上使用 xcap 构造了一个 icmp-ping 的报文,然后发给 Ubuntu,Ubuntu 上打开 Wireshark 监控通信报文,将报文保存 到本地,然后使用 tcpreplay 进行回放。具体环境如下:

操作过程如下:

注意,由于我使用了 VNC 远程 Ubuntu,因此会导致多了很多 TCP 报文。

参考

  1. https://en.wikipedia.org/wiki/Iproute2
  2. https://linux.cn/article-4326-1.html
  3. https://www.cnblogs.com/fyc119/p/7499829.html
  4. https://net-tools.sourceforge.io/
  5. https://blog.csdn.net/weixin_42767604/article/details/106251844
  6. https://linux.cn/article-12290-1.html
  7. http://lnmp.ailinux.net/ethtool
  8. http://www.uml.org.cn/embeded/201305152.asp
  9. https://www.cnblogs.com/wenqiang/p/6306727.html
  10. https://www.cnblogs.com/codestack/p/13438808.html
  11. https://www.cnblogs.com/machangwei-8/p/10388883.html
  12. https://www.cnblogs.com/ggjucheng/archive/2012/01/08/2316692.html
  13. https://en.wikipedia.org/wiki/Pcap
  14. https://www.cnblogs.com/qishui/p/5428938.html
  15. http://www.colasoft.com.cn/
  16. https://wsgzao.github.io/post/osi/
  17. https://www.cnblogs.com/onepixel/p/7092302.html
  18. https://blog.csdn.net/weixin_40748006/article/details/84661014
  19. https://www.jianshu.com/p/e8dca7627e46

Network 之四 常用 Linux 网络命令及网络调试工具介绍相关推荐

  1. 37条常用Linux Shell命令组合

    2019独角兽企业重金招聘Python工程师标准>>> 37条常用Linux Shell命令组合,推荐个各位网友,老手和新手们都值得收集和总结的东西.一起来看看 序号 任务 命令组合 ...

  2. linux下的网络管理命令,常用linux网络管理命令(下)

    常用linux网络管理命令(下) ip:更改或显示路由.IP.协议等信息 ip link:接口管理 show [DEVICE]:显示网卡接口信息 set [DEVICE] [up | down]:开启 ...

  3. 利用常见的网络命令获取网络信息

    利用常见的网络命令获取网络信息 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 利用常见的网络命令获取网络信息 前言 一.利用ipconfig命令获取本地网络信息 二.实训 ...

  4. 金融信息安全实训——利用常见的网络命令获取网络信息

    实训2 金融信息安全实训--利用常见的网络命令获取网络信息 实训目的 掌握常见网络命令使用方法. 学习使用网络命令嗅探网络信息. 学习使用网络命令判断和处理网络问题. 实训准备及注意事项 1.装有Wi ...

  5. linux使用命令配置网络,使用nmcli命令配置网络

    使用nmcli命令配置网络 NetworkManager是管理和监控网络设置的守护进程,设备既就是网络接口,连接是对网络接口的配置,一个网络接口可以有多个连接配置,但同时只有一个连接配置生效. 1 配 ...

  6. linux nc命令 测试网络连通性

    利用nc命令查看网络连通性, 有时候telnet可能没有安装 有时候ping 虽然能ping通,但是实际上还是连不上 这时候可以考虑用nc 拒绝连接 xxx.xx.xxx.xxx是ip -bash-4 ...

  7. 清空缓存的命令_最实用的6个网络命令,网络故障不求人

    很多弱电工程师朋友在项目中经常遇到一些网络故障,需要通过一些一些命令去检测.定位故障点,通过使用网络命令,故障解决的工作取得了事半功倍的效果.下面就一起温故而知新吧! 一.ping命令(因特网包探索器 ...

  8. 释放tcp连接的命令是_最实用的6个网络命令,网络故障不求人

    很多弱电工程师朋友在项目中经常遇到一些网络故障,需要通过一些一些命令去检测.定位故障点,通过使用网络命令,故障解决的工作取得了事半功倍的效果.下面就一起温故而知新吧! 一.ping命令(因特网包探索器 ...

  9. 测试常用——linux 基础命令

    测试常用 的 linux 基础命令 1,查看服务器日志 vi 查看文件 (查找关键字:exception /exception  :  从上往下找,按n查找下一个关键字,按shift+n查找上一个关键 ...

最新文章

  1. jQuery源码分析系列:属性操作
  2. python中的EVAL函数的定义和用法!
  3. jqgrid ajax 请求参数,如何将csrf_令牌传递给jqgrid的editurl的post参数?
  4. SolrJ管理SolrCloud
  5. 【51nod2026】Gcd and Lcm(杜教筛)
  6. 38行代码AC——UVA-167The Sultan‘s Successors(八皇后问题,附视频讲解)
  7. 使用Ext.grid.Panel显示远程数据
  8. 中one_Chair_One 一号椅
  9. 二十五、JAVA多线程(二、吃苹果案例)
  10. jstl获取表格单元格值_表格单元格和位置绝对值
  11. 1003【顺序结构】A+B 问题
  12. DL3 - optimization algorithms
  13. Jboot 跨域请求
  14. 【SDOI2009】【BZOJ1227】虔诚的墓主人
  15. 服务器存储视频文件夹在哪里找,微信视频文件夹存储在什么位置?在哪里能找到...
  16. 【BZOJ 2330】 [SCOI2011]糖果【差分约束】
  17. c语言中负数的读取和存储,C语言中负数的存储方式
  18. WIN10系统下运行地下管线数据处理系统
  19. sql语句查询 近7天,三十天数据
  20. Ubuntu系统下,在指定的虚拟环境下Lintel安装向导

热门文章

  1. 删除online日志測试及ora-600 [4194]错误的处理
  2. Apache Mahout基于商品的协同过滤算法流程分析
  3. java interface 不能存常量数组?
  4. 基于JSON的高级AJAX开发技术
  5. windows和linux运算结果不同,从Windows和Linux读取文件会产生不同的结果(字符编码?)...
  6. horizon client长时间不操作不断开_动挡操作禁忌,伤车只在一瞬间!否则变速箱会提前...
  7. springboot整合视图层Thymeleaf、freemarker
  8. HDFS NameNode进程挂了并且数据也丢失了,如何进行恢复?
  9. ZooKeeper在HBase集群中的作用
  10. docker私有仓库harbor配置helm chart仓库(安装helm chart插件)