我有一个Linux的盒子,有一个真正的(反对虚拟,又名别名)以太网接口,我可以使用(eth0用于其他目的 – 不能使用它,也不能添加更多的网卡)。 说这是eth1
我需要通过SNMP来控制一些对象/实体,所以我为每个对象设置了一个虚拟的以太网接口,以及相应的MAC地址。 我这样做(以vif1为例):
ip -family inet link add link eth1 name vif1 address <the MAC addr> type macvlan ip link set vif1 up multicast on ip route del default dev vif1 table main /* enable the pings/TFTP going out! */ ip route add default via 192.168.1.1 table main proto static metric /* restore orig */
eth1,vif1,vif2,…都从单个(远程)DHCP服务器获取IP地址。 所有这些IP地址当然是在同一个IP子网上,比如10.11.1.0/24
问题:从Linux机箱ping到DHCP服务器(比如10.11.1.1)机器工作。 ping从DHCP服务器机器到eth1 IP或任何vif#X IP工作,但(问题,我想…)只有eth1响应ICMP数据包(由ifconfig计数器和wireshark嗅探validation)此问题导致无法连接到与vif接口的IP地址关联的SNMP代理。
我猜测我需要设置内部路由,以便IP数据包到达目的地vif#X。 我已经尝试添加一个新的IP路由表的IP规则,但可能没有正确地设置它(新表)…任何人都可以告诉我如何(最好也是为什么)做到这一点?
Linux机器运行Ubuntu9.04,DHCP服务器运行Windows XP SP3
解决了它,最后:这是一个ARP相关的问题。
但
当服务器发送IP数据包(在我的情况下,SNMP消息),它使用虚拟接口的MAC地址。 当它到达Linux机器时,内核只是丢弃这些帧,因为它不知道如何转发它们; 运行Wireshark显示这些消息,因为通常界面被置于混杂模式
为了使SNMP消息到达绑定到虚拟接口的SNMP代理,IP数据包必须具有真实接口的MAC地址 (我认为只有内核根据IP地址进行VLAN路由…)
实现这一点的方法是从Linux的box真实接口向服务器发送一个免费的ARP请求,指出新分配的IP地址(对于其中一个虚拟接口…)由真实接口的“拥有” MAC地址。 这会正确更新服务器的ARP表。
顺便说一句,这也解释了为什么在启动SNMPstream量之前等待一段时间:服务器的ARP表项已经老化,所以服务器发送一个由真实接口 正确响应的ARP请求
你为什么不build立一个桥接设备? brctl addbr bridge将物理设备的IP和MAC添加到该网桥,将设备(无IP)移动到网桥,然后将VIF连接到网桥。