我想知道 Ubuntu 中的环回接口和虚拟接口之间有什么区别以及它们的行为方式。
因为当我在环回接口上分配 /24 IP 地址并在网络中路由此范围时,服务器会响应所有 IP 地址,甚至响应未分配给接口的 IP 地址。但虚拟接口的行为类似于物理接口,并响应我分配给接口的特定 IP 地址。
答案1
与其他接口相反,当 Linux 内核向环回接口添加地址时,其 LAN 路由也会作为类型添加到local
(scope 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
不是为了路由到其他地方:目标是主机。