Ubuntu 20.04 中的环回接口和虚拟接口有什么区别

Ubuntu 20.04 中的环回接口和虚拟接口有什么区别

我想知道 Ubuntu 中的环回接口和虚拟接口之间有什么区别以及它们的行为方式。

因为当我在环回接口上分配 /24 IP 地址并在网络中路由此范围时,服务器会响应所有 IP 地址,甚至响应未分配给接口的 IP 地址。但虚拟接口的行为类似于物理接口,并响应我分配给接口的特定 IP 地址。

答案1

与其他接口相反,当 Linux 内核向环回接口添加地址时,其 LAN 路由也会作为类型添加到localscope host这些才是最重要的)当地的路由表(这使得查找更加困难),而不是主要的路由表。

要检查差异,请检查table all由内核添加的(proto kernel)且类型为 的所有路由表条目() local

lo从只启动而没有执行任何其他操作的系统中:

# ip route show proto kernel type local table all
local 127.0.0.0/8 dev lo table local scope host src 127.0.0.1 
local 127.0.0.1 dev lo table local scope host src 127.0.0.1 
# 

这里 127.0.0.0/8 范围内的所有地址都属于主机(scope host)。

创建dummy0并创建一个地址:

# ip link add name dummy0 up type dummy
# ip addr add 192.0.2.2/24 dev dummy0

# ip route show proto kernel type local table all
local 127.0.0.0/8 dev lo table local scope host src 127.0.0.1 
local 127.0.0.1 dev lo table local scope host src 127.0.0.1 
local 192.0.2.2 dev dummy0 table local scope host src 192.0.2.2 
# ip route
192.0.2.0/24 dev dummy0 proto kernel scope link src 192.0.2.2 
# 

而是将其添加到lo

# ip addr flush dev dummy0
# ip addr add 192.0.2.2/24 dev lo

# ip route show proto kernel type local table all
local 127.0.0.0/8 dev lo table local scope host src 127.0.0.1 
local 127.0.0.1 dev lo table local scope host src 127.0.0.1 
local 192.0.2.0/24 dev lo table local scope host src 192.0.2.2 
local 192.0.2.2 dev lo table local scope host src 192.0.2.2 
# ip route
# 

这次 192.0.2.0/24 是scope host,使得整个范围都属于主机,就像 127.0.0.0/8 一样,而不是之前结果中的 192.0.2.2 (/32)。Linux 遵循弱宿主模型,将回答在任何接口上对这些地址发出的请求,包括相关的 ARP 请求。


有多种方法可以获得相同的结果。因此,可以使用或应该使用什么方法取决于要实现的目标。赞成反对派下面并不总是赞成和反对的,但那是为了比较它们。

  • dummy0

    • pro(除了其他的东西)假的

      • 如果启用了路由/转发,内核默认添加了自动 ( proto kernel) LAN 路由,将把收到的数据包路由到此接口(如果不是其自己的地址)。对于假的接口,因为流量将被丢弃。然而使用假的接口可能是使路由黑洞的一种方法(另一种更永久的方法是添加blackhole不依赖于接口的类型的路由)。
    • 反对派

      • 一个地址。需要多个命令/操作来添加多个地址,每个命令一个。
  • lo

    • 赞成

      • 一次性添加整个主机地址范围

        这应该留给与大规模拦截流量相关的项目。请注意,重要的是内核添加的路由,而不是地址本身。例如,此类路由由Linux 的 tproxy对于透明代理:

        # ip rule add fwmark 1 lookup 100
        # ip route add local 0.0.0.0/0 dev lo table 100
        

        但有特定的策略路由规则,因此它不会总是申请。

        除此之外,使用时只需添加 /32 地址(lo如果有的话)。

      • 永久接口,中立角色

        此接口保证存在,因此可以用作预先添加地址的锚点,而无需知道将存在或应使用哪个接口。与此地址相关的路由不会因接口关闭而改变,因为它处于打开状态lo(没有理由关闭)。某些路由守护程序可能会以特殊方式处理在环回接口上添加的地址。

    • 反对派

      • 不能用于静态路由/转发

        为接口添加的路由lo不是为了路由到其他地方:目标是主机。

相关内容