![为什么当接口关闭时 `ip` 和 `ifconfig` 会有不同的行为?](https://linux22.com/image/1604293/%E4%B8%BA%E4%BB%80%E4%B9%88%E5%BD%93%E6%8E%A5%E5%8F%A3%E5%85%B3%E9%97%AD%E6%97%B6%20%60ip%60%20%E5%92%8C%20%60ifconfig%60%20%E4%BC%9A%E6%9C%89%E4%B8%8D%E5%90%8C%E7%9A%84%E8%A1%8C%E4%B8%BA%EF%BC%9F.png)
我首先关闭接口
# 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?
- 为什么不
ip route
显示我的路线? - 我启动接口后,我的路由奇迹般地添加到哪里了?为什么我之前看不到它们?
- 为什么我打开接口后没有显示路由?
我想在启动接口之前设置所有路由。这样做对我来说没有任何问题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
ip
从iproute2更清晰地组织以下行为:
- 带来界面将其拿起并取下(
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/
)
为了完整起见,以下是对您的问题的回答:
- 为什么不
ip route
显示我的路线?
如果相应的链路断开,则不会将路由保存到主表中。您的ip
命令序列不会首先调出所涉及的接口。
- 我启动接口后,我的路由奇迹般地添加到哪里了?为什么我之前看不到它们?
如果接口关闭,设备的路由将不会在路由表中注册。
- 为什么我打开接口后没有显示路由?
由于相应的接口必须先启动,所以未添加路由。如果尝试在关闭的接口上添加路由,您应该会看到类似RTNETLINK answers: Network is down
或的错误消息Error: Device for nexthop is not up.
。返回代码 ( $?
) 也应该为非零。
我想在启动接口之前设置所有路由。
据我所知,即使使用 ,也无法做到这一点ifconfig
。请记住,您的ifconfig
命令实际上是在添加路由之前启动接口。
不知道接下来又会出现什么惊喜呢。
希望没有。 ip
如果你了解它。
我以为
ifconfig
并且ip
兼容
这两个命令有一些重叠,但不能互换。