我想知道一件事。我正在使用 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)