我使用以下方法为机器创建了一个新的 VLAN IP
vconfig add eth0 22
然后我做了:
ifconfig eth0.22 192.168.3.2 netmask 255.255.255.0 up`.
在此之后,当我执行时,ping 192.168.3.2
它就成功了。
此后,当我重做此过程以在同一本地网络 ( 192.168.3.1
) 中的另一台机器上创建另一个 VLAN IP 并对其进行 ping 时,它失败了。但是,如果我使用命令 ping 它,它会成功ping 192.168.3.1 -I eth0
。
我的问题是,内部发生了什么,导致了:
- 同一台机器的VLAN IP成功。
- 使用常规 ping 命令无法检测其他机器的 VLAN IP。
- 使用指定 eth0 的 ping 命令可以成功检测其他机器的 VLAN IP。
答案1
您正在创建一个 VLAN,这意味着(在本例中)从 eth0.22 数据包发出的任何数据包都带有 802.1Q 标头(标签)作为前缀,表示该数据包的目的地是 VLAN 22。交换机在中继接口上接受此数据包,并将该数据包从定义为允许 VLAN 22(或定义为允许任何 VLAN)的任何端口转发出去。
如果出站接口是接入交换机端口(即不是中继端口),则删除 802.1Q 报头并转发数据包。如果端口是中继端口,则保留 802.1Q 标签。
为了使这一切正常工作,您需要一个可管理的交换机 - 一个能够识别 VLAN 的交换机。就您而言,您要么没有这样的交换机,要么您连接的端口未配置为中继。
对于非管理型交换机来说,标记的数据包无法被理解,因此会被丢弃。
您遇到的情况是,当您执行 ping 操作时,您的操作系统会选择适当的接口 - eth0.22,然后使用 802.1q 标签发送数据包。
操作系统根据路由表选择适当的接口。由于192.168.3.0
明确连接到 eth0.22 接口,因此默认情况下,此网络的任何数据包都通过此接口发送。请参阅路由表:
$ netstat -rn
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
[..snip..]
192.168.3.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0.22
由于交换机不知道如何处理它,所以它会被丢弃。
当您强制从 eth0 接口发出 ping 时,它将从无标记接口发出,因此交换机会理解数据包并转发它。接收机器看到它,并且根据 ping 的工作方式,将从 ping 到达的接口发出响应,而不是更合适的 eth0.22 接口。
有可能 ping 可以工作,但其他服务却不工作。
如果您想使用 VLAN,那么您需要一个支持 VLAN 的交换机,否则,如果您没有,那么您可以在 eth0 接口上使用辅助寻址。
之所以在您自己 ping 时此方法有效,是因为 802.1q 标记直到出口才会发生。因此,如果192.168.3.1
正在 ping 192.168.3.1
,它不会将数据包发送到网络上,因此不会对其进行标记。