蛮荆

ifconfig 命令

2017-01-22

ifconfig 命令作用

ifconfig 命令是一个用于配置网络接口的工具,可以查看和设置网络接口的状态和参数,包括 IP 地址、子网掩码、广播地址、MAC 地址等。

虽然在现代 Linux 系统中,ifconfig 已经被 ip 命令替代,但是 ifconfig 依然时兼容性最好的,例如在 Linux, MacOS, Windows 中都默认内置了 ifconfig 命令 (在 Windows 中对应的命令为 ipconfig),本文主要讲一些 ifconfig 命令的常用操作。


ifconfig 输出说明

$ ifconfig

# 输出如下
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:08:03:41:1f  txqueuelen 0  (Ethernet)
        RX packets 142619849  bytes 81211019222 (75.6 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 142040276  bytes 64909981889 (60.4 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.0.5.134  netmask 255.255.255.0  broadcast 10.0.5.255
        inet6 fe80::f816:3eff:fe20:57c3  prefixlen 64  scopeid 0x20<link>
        ether 08:00:27:57:c3:12 txqueuelen 1000  (Ethernet)
        RX packets 162042385  bytes 34008541260 (31.6 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 134343636  bytes 184733360569 (172.0 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 32975502  bytes 50914349583 (47.4 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 32975502  bytes 50914349583 (47.4 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

首先来看输出结果中比较大的数据块,每两个数据块中间使用一个空行进行分隔,每个数据块表示一个单独的网络接口 (包括 物理/虚拟/环回接口)。

下面以网络接口 eth0 为例进行说明,其他接口以此类推即可。

字段说明

接口名称:

eth0: 网络接口的名称,通常表示以太网接口。其他可能的名称包括 wlan0(无线接口)、lo(环回接口)等。

标志位:

  • flags=4163<UP,BROADCAST,RUNNING,MULTICAST>: 标志表示接口的当前状态。
  • UP: 接口已启动
  • BROADCAST: 支持广播
  • RUNNING: 接口正在运行 (网卡已经连接到交换机或者路由器)
  • MULTICAST: 支持多播

MTU (Maximum Transmission Unit):

mtu 1500: 接口的最大传输单元,关于 MTU, 可以参考 这篇文章

IPv4 地址

  • inet 10.0.5.134: 接口的 IPv4 地址
  • netmask 255.255.255.0: 子网掩码
  • broadcast 10.0.5.255: 广播地址

IPv6 地址

  • inet6 fe80::f816:3eff:fe20:57c3: 接口的 IPv6 地址
  • prefixlen 64: 子网前缀长度
  • scopeid 0x20: 地址的作用域(link-local 地址)

硬件地址 (MAC 地址)

  • ether 08:00:27:57:c3:12: 接口的 MAC 地址

传输队列长度:

  • txqueuelen 1000: 传输队列的长度

接口类型

  • (Ethernet): 接口类型,表示以太网

接收数据 (RX)

  • RX packets 162042385 bytes 34008541260 (31.6 GiB): 接收到的数据包和字节数
  • RX errors 0 dropped 0 overruns 0 frame 0: 接收过程中发生的错误统计
    • errors: 接收错误包数量,比如校验错误、帧同步错误等
    • dropped: 丢弃的包数量,即数据包已经收到了 Ring Buffer,但因为内存不足等原因丢包
    • overruns: 超限包数量,即网络 I/O 速度过快,导致 Ring Buffer 中的数据包来不及处理(队列满)而导致的丢包,也就是发送方的速度快于接收方的处理速度
    • frame: 帧错误数量

发送数据 (TX)

  • TX packets 134343636 bytes 184733360569 (172.0 GiB): 发送的数据包和字节数
  • TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0: 发送过程中发生的错误统计
    • errors: 发送错误包数量,同上
    • dropped: 丢弃的包数量,同上
    • overruns: 超限包数量,同上
    • carrier: 载波错误数量,表示发生 carrirer 错误的数据包数,比如双工模式不匹配、物理电缆出现问题等
    • collisions: 碰撞包数量,表示碰撞数据包数

关键指标

💡 TX 和 RX 输出部分的 errors、dropped、overruns、carrier 以及 collisions 等指标不为 0 时,通常表示网络出现了问题。

指定接口

如果不想查看所有接口的信息,而是要查看某个接口的信息,直接将 接口名称 作为 ifconfig 命令的第二个参数即可。

$ ifconfig eth0

常用操作

设置接口网络信息

设置某个网络接口的 IP 地址、子网掩码等。

eth0 接口的 IP 地址设置为 192.168.1.100,子网掩码设置为 255.255.255.0, 广播地址设置为 192.168.1.255

$ ifconfig eth0 192.168.1.100 netmask 255.255.255.0 broadcast 192.168.1.255

启用/禁用接口

# 启用 eth0
$ ifconfig eth0 up

# 禁用 eth0
$ ifconfig eth0 down

分别启用和禁用 eth0 接口。

设置 MAC 地址

eth0 接口的 MAC 地址设置为 00:11:22:33:44:55

$ ifconfig eth0 hw ether 00:11:22:33:44:55

添加接口别名

eth0 接口添加别名 eth0:0,并设置其 IP 地址为 192.168.1.101

$ ifconfig eth0:0 192.168.1.101

添加网络接口 (网卡)

具体脚本参考: https://github.com/yanfeizhang/coder-kung-fu/blob/main/tests/network/test02/php/tool.sh

# 命令格式
# 和 设置接口网络信息 命令类似
$ ifconfig [interface_name] [ip_address] netmask [netmask] up
  • interface_name: 分配给新网卡的接口名
  • ip_address: 分配给新网卡的 IP 地址
  • netmask: 分配给新网卡的子网掩码
  • up: 固定参数,表示启用网卡

需要注意的是,如果没有实际的网卡,也可以通过 网卡别名 的方式添加 虚拟网卡,典型的使用场景就是,使用网卡别名在单一物理网卡上配置多个 IP 地址,对于需要测试多个 IP 地址的服务器或需要不同网络配置时非常有用。

# 例如
$ ifconfig eth0:100 10.88.0.6 netmask 255.255.0.0 up

# 添加之后查看结果
$ ifconfig 

...

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.88.0.5  netmask 255.255.0.0  broadcast 10.88.255.255
        ether da:46:fd:11:99:3e  txqueuelen 0  (Ethernet)
        RX packets 7775  bytes 21486449 (21.4 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 5426  bytes 18395033 (18.3 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth0:100: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.88.0.6  netmask 255.255.0.0  broadcast 10.88.255.255
        ether da:46:fd:11:99:3e  txqueuelen 0  (Ethernet)

...

从输出的结果中可以看到,基于 eth0 扩展的新网卡 eth0:100eth0 的 MAC 地址是一样的,其中:

  • eth0 是实际的物理网卡,负责处理实际的网络数据包
  • eth0:100 是 eth0 的一个别名,别名网卡并不是一个独立的物理网卡,而是 eth0 上的一个虚拟接口。别名网卡可以配置一个独立的 IP 地址和网络设置,与 eth0 一样可以进行网络通信

通过 网卡别名 可以在一个物理接口上运行多个虚拟网络接口,每个虚拟接口都有自己独立的 IP 配置,但它们共用同一个物理网络连接。

题外话

❓ 思考: 使用 ifconfig 添加网络接口 (网卡) 的时候,会 (通知其他主机) 发起 ARP 广播吗?


扩展阅读

转载申请

本作品采用 知识共享署名 4.0 国际许可协议 进行许可,转载时请注明原文链接,图片在使用时请保留全部内容,商业转载请联系作者获得授权。