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