如何设置虚拟接口和实际以太网接口之间的内部路由(Linux)

我有一个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相关的问题。

  1. DHCP服务器为虚拟接口MAC地址分配一个IP地址,并在服务器的本地ARP表中设置该对
  2. Linux框将新的IP地址绑定到请求它的虚拟接口。
  3. PING正在两种方式上工作:
  4. Linux到服务器进行ping时,通过真实接口(位于相同的IP子网)
  5. 从服务器 Linux的ping,再次真正的接口响应,所以好像一切正常…

当服务器发送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连接到网桥。