ifconfig 命令
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:100
和 eth0
的 MAC 地址是一样的,其中:
- eth0 是实际的物理网卡,负责处理实际的网络数据包
- eth0:100 是 eth0 的一个别名,别名网卡并不是一个独立的物理网卡,而是 eth0 上的一个虚拟接口。别名网卡可以配置一个独立的 IP 地址和网络设置,与 eth0 一样可以进行网络通信
通过 网卡别名
可以在一个物理接口上运行多个虚拟网络接口,每个虚拟接口都有自己独立的 IP 配置,但它们共用同一个物理网络连接。
题外话
❓ 思考: 使用 ifconfig 添加网络接口 (网卡) 的时候,会 (通知其他主机) 发起 ARP 广播吗?