我最近注意到打印 FreeBSD 的路由表(带有
netstat -r
)显示:
Routing tables
Internet:
Destination Gateway Flags Netif Expire
default 10.102.0.254 UGS em0
10.102.0.0/16 link#3 U em0
10.102.91.1 link#3 UHS lo0
...
这条线对我来说毫无意义:
10.102.91.1 link#3 UHS lo0
10.102.91.1是本机的IP地址,配置在接口
em0
.
为什么 FreeBSD 在被要求打印其路由表时说这个 IP 地址绑定到
lo0
而它应该绑定到 em0
(在那种特定情况下)?
我在 FreeBSD 联机帮助页中找不到
netstat
(https://man.freebsd.org/cgi/man.cgi?netstat) 的任何内容可以解释这个“选择”(?)。
此行为是否有技术原因?除了明确打印“嘿管理员,这个 IP 是本地的”。
基本上,IP 堆栈并不是真正的每个接口,您可以应用过滤器或绑定来强制执行类似的东西。但在大多数情况下,如果您的机器在接口
eth3
上的 IP 为 10.102.91.1,则这是机器 IP,而不是接口 IP。
所以发送数据包到 10.102.91.1
或 127.0.0.1
是非常相似的。他们都到达 IP 堆栈的接收部分。
您仍然可以使用 bind 仅过滤来自特定 IP 的连接或数据包。但是,如果您不这样做,例如,侦听 tcp 端口 80 的服务器将收到发送的两个数据包 10.102.91.1:80
或 127.0.0.1:80
.
所以当你的 IP 路由表配置好后,除非你做了什么不寻常的事情,
10.102.91.1
和 127.0.0.1
都会到达同一个地方。这是IP栈的接收端。
事实上,至少在 linux 中,我很确定如果你发送一个数据包到10.102.91.1
,而且这是一个本地 IP,它永远不会真正遍历任何与eth3
相关的东西