为什么当接口关闭时 `ip` 和 `ifconfig` 会有不同的行为?

为什么当接口关闭时 `ip` 和 `ifconfig` 会有不同的行为?

我首先关闭接口

# Shutdown the interfaces
ip link set enp2s0f0 down
ip link set enp2s0f1 down

使用ifconfig

# Set subnets to interfaces
ifconfig enp2s0f0 10.0.0.1/24
ifconfig enp2s0f1 10.0.1.1/24

# Add two routes
ip route add 10.11.1.1 dev enp2s0f0
ip route add 10.11.0.1 dev enp2s0f1

# Result => NO PROBLEM, my routes are here even tho the interfaces are down
$ip route
10.0.0.0/24 dev enp2s0f0 proto kernel scope link src 10.0.0.1 
10.0.1.0/24 dev enp2s0f1 proto kernel scope link src 10.0.1.1 
10.11.0.1 dev enp2s0f1 scope link 
10.11.1.1 dev enp2s0f0 scope link 

使用ip

# Set subnets to interfaces
ip addr add 10.0.0.1/24 dev enp2s0f0
ip addr add 10.0.1.1/24 dev enp2s0f1

$ip route
#NOTHING => Where are the routes?!

# Add two routes
ip route add 10.11.1.1 dev enp2s0f0
ip route add 10.11.0.1 dev enp2s0f1

$ip route
#NOTHING => Where are my routes?!

ip link set enp2s0f0 up
ip link set enp2s0f1 up

# Result => WOW only two routes appeared miraculously
$ip route
10.0.0.0/24 dev enp2s0f0 proto kernel scope link src 10.0.0.1 
10.0.1.0/24 dev enp2s0f1 proto kernel scope link src 10.0.1.1 
# => Where are my 10.11.*.* routes?
  1. 为什么不ip route显示我的路线?
  2. 我启动接口后,我的路由奇迹般地添加到哪里了?为什么我之前看不到它们?
  3. 为什么我打开接口后没有显示路由?

我想在启动接口之前设置所有路由。这样做对我来说没有任何问题ifconfig。我想知道接下来会发生什么意外。

我认为ifconfig并且ip兼容,从 ifconfig 到 ip 的移动不会那么容易。

答案1

您的三个问题都源于一个误解:

ifconfig具有接口和地址意味着up选项,因此在您的ifconfig示例中,接口在您为其指定地址的同时出现。

这意味着

ifconfig enp2s0f0 10.0.0.1/24
ifconfig enp2s0f1 10.0.1.1/24

实际上是缩写

ifconfig enp2s0f0 10.0.0.1/24 up
ifconfig enp2s0f1 10.0.1.1/24 up

ipiproute2更清晰地组织以下行为:

  • 带来界面将其拿起并取下(ip link),
  • 分配 IP地址连接至网络设备 ( ip address),以及
  • 配置内核路由表格(ip route)。

ifconfig将这些不同的概念混合在一起,这可能会更加令人困惑或不太直观。


如果您想要一种方便的方式来管理路由、网络设备、接口和隧道的状态,您应该考虑使用网络配置管理工具。 它们让您以方便的声明性语法定义您的网络,您可以使用一个命令快速启动或关闭它。

这些是常见 Linux 发行版中包含的一些工具:

  • Debian –下拉/etc/network/interfaces/etc/network/interfaces.d/
  • Ubuntu –netplan.io/etc/netplan/
  • Red Hat Enterprise Linux/CentOS –管理接口/etc/sysconfig/network-scripts/
  • 通常是带有桌面环境的发行版 –网络管理器/etc/NetworkManager/

为了完整起见,以下是对您的问题的回答:

  1. 为什么不ip route显示我的路线?

如果相应的链路断开,则不会将路由保存到主表中。您的ip命令序列不会首先调出所涉及的接口。

  1. 我启动接口后,我的路由奇迹般地添加到哪里了?为什么我之前看不到它们?

如果接口关闭,设备的路由将不会在路由表中注册。

  1. 为什么我打开接口后没有显示路由?

由于相应的接口必须先启动,所以未添加路由。如果尝试在关闭的接口上添加路由,您应该会看到类似RTNETLINK answers: Network is down或的错误消息Error: Device for nexthop is not up.。返回代码 ( $?) 也应该为非零。

我想在启动接口之前设置所有路由。

据我所知,即使使用 ,也无法做到这一点ifconfig。请记住,您的ifconfig命令实际上是在添加路由之前启动接口。

不知道接下来又会出现什么惊喜呢。

希望没有。 ip如果你了解它

我以为ifconfig并且ip兼容

这两个命令有一些重叠,但不能互换。

相关内容