为什么添加外部IP到环回(lo)就像添加到ethX一样工作

对于长年(> 7年)的我的自动化脚本是以这种方式添加新的外部IP到服务器

ifconfig lo:0 11.22.99.44 netmask 255.255.255.255 ifconfig lo:1 11.22.33.44 netmask 255.255.255.255 ... 

这与所有(> 10)供应商合作良好,我从来没有遇到过问题。

现在我意识到,我正在添加ips来回送,这可能是错误的
LO刚刚离开后在127.0.0.0/8沙盒=)

一个简短的调查发现,必要的路由自动添加到这些IPS的包到达正确路由

路线在胭脂可见

  11.22.33.44 local 11.22.33.44 kernel host lo local 11.22.99.44 local 11.22.33.44 kernel host lo local 

但不是在ip route show中

 default via 99.88.22.1 dev eth0 99.88.22.0/24 dev eth0 proto kernel scope link src 99.88.22.123 

testing路由:通过默认路由发送到服务器的基本(添加到eth0)IP网关

 #ip route get 5.5.5.5 from 11.22.33.44 iif lo 5.5.5.5 from 11.22.33.44 via 99.88.22.1 dev eth0 

所以,即时消息从11.22.33.44发送到192.168.1.1而不是11.22.33.1的数据包,它可以工作在许多configuration没有任何问题提供商的问题。

Q1:为什么这个工作?
问题2:添加多个网关哪种方式更好?(源11.22.99.44为11.22.99.1,源11.22.33.44为11.22.33.1)

是添加多个像下面的一个好主意或基于src的路由更好?

 auto eth0:0 iface eth0:0 inet static address 11.22.33.44 netmask 255.255.255.0 broadcast 11.22.33.255 gateway 11.22.33.1 auto eth0:1 iface eth0:1 inet static address 11.22.99.44 netmask 255.255.255.0 broadcast 11.22.99.255 gateway 11.22.99.1 

感谢帮助!

  1. 这是由于ARP协议和路由表。 当一个服务器不知道在哪个networking块发送一个IP地址的数据包的时候,该接口被configuration为路由,它将发送一个ARP请求并且用它的响应更新它的ARP表。 您的服务器也将响应APR对其支持的所有IP地址的请求。 对于其他地址,stream量将被路由到支持目标IP地址的最小configurationnetworking块的已configuration路由。

  2. 如果只有一个接口,则所有外部stream量都将通过该接口进行路由。 其余的将被发送到应该有路由到所有设备的路由器。 您实际上不需要为路由器的默认路由和默认路由添加路由。

当你有多个接口时它变得更加复杂。 在这种情况下,您可能需要添加非本地networking块的路由,这些路由通过路由器在非默认路由的接口上路由。

当在同一接口上的多个networking块中有IP地址时,最好将它们添加到接口而不是回送接口。 通常,当我使用多个networking块中具有地址的服务器时,每个networking块都位于单独的接口上。

在回送接口上具有辅助IP地址可以解决应用程序必须configuration为响应接口上的通信的端口冲突。 这可能会导致其他应用程序使用辅助IP地址上的相同端口的问题。

Linux使用强大的terminal系统模型,这意味着IP地址属于本机,而不属于它的接口。 由于系统不需要将数据包路由到自己的IP地址,因此路由不会造成任何伤害,所以在networking掩码为255.255.255.255的情况下,路由不会执行任何操作。 所以效果只是告诉系统它有一个额外的IP地址,这是所需要的。