2017-01-22 计算机网络 Linux 命令

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 广播吗?


扩展阅读