本地 IP 别名通过本地路由,而不是通过 eth0 路由

本地 IP 别名通过本地路由,而不是通过 eth0 路由

我想知道一件事。我正在使用 EC2 实例,并希望使用 192.168.1.0/29 范围内的某个本地子网。因此,我在 eth0 上设置了别名,如下所示:

[root@server jvehent]# ifconfig -a
eth0      Link encap:Ethernet  HWaddr 12:25:8B:0a:B1:EB  
          inet addr:10.28.118.95  Bcast:10.28.118.255  Mask:255.255.254.0
[...]
eth0:1    Link encap:Ethernet  HWaddr 12:25:8B:0a:B1:EB    
          inet addr:192.168.1.1  Bcast:192.168.1.7  Mask:255.255.255.248
[...]
eth0:2    Link encap:Ethernet  HWaddr 12:25:8B:0a:B1:EB    
          inet addr:192.168.1.2  Bcast:192.168.1.7  Mask:255.255.255.248
[...]
eth0:3    Link encap:Ethernet  HWaddr 12:25:8B:0a:B1:EB    
          inet addr:192.168.1.3  Bcast:192.168.1.7  Mask:255.255.255.248
[...]
eth0:4    Link encap:Ethernet  HWaddr 12:25:8B:0a:B1:EB  
          inet addr:192.168.1.4  Bcast:192.168.1.7  Mask:255.255.255.248
[...]
lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0

很好,所以我得到了以下路由表

[root@server jvehent]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.1.0    0.0.0.0         255.255.255.248 U     0      0        0 eth0
10.28.118.0     0.0.0.0         255.255.254.0   U     0      0        0 eth0
0.0.0.0         10.28.118.1     0.0.0.0         UG    0      0        0 eth0

现在,如果我希望两个服务使用本地别名互相通信,我可以按如下方式设置 netcat:

监听 netcat:

nc -l 192.168.1.4 1664

连接netcat:

nc -s 192.168.1.1 192.168.1.4 1664

据我所见,流量通过本地主机接口。我用 tcpdump -i lo 检查,发现数据包通过。eth0 上没有任何东西。

我对内核的基本了解告诉我,由于内核拥有所有的 IP,它在内部执行所有操作并将数据包从一个套接字复制到另一个套接字,而不将其传递给 NIC。对吗?

有没有办法强制内核在网络上发送这些数据包?

答案1

是的,不是。是的,内核通过将其传递到环回接口来短路。不,您无法将它们发送到网络,因为网络不会将它们发回。NIC 可以发送或接收数据包,但它不能同时发送数据包和接收数据包。(也许可以对交换机进行编程来模拟这种情况,但您使用的是 EC2 实例,而且首先没有交换机;见鬼,没有 NIC)

相关内容