![如何在虚拟接口和真实以太网接口之间设置内部路由(Linux)](https://linux22.com/image/567673/%E5%A6%82%E4%BD%95%E5%9C%A8%E8%99%9A%E6%8B%9F%E6%8E%A5%E5%8F%A3%E5%92%8C%E7%9C%9F%E5%AE%9E%E4%BB%A5%E5%A4%AA%E7%BD%91%E6%8E%A5%E5%8F%A3%E4%B9%8B%E9%97%B4%E8%AE%BE%E7%BD%AE%E5%86%85%E9%83%A8%E8%B7%AF%E7%94%B1%EF%BC%88Linux%EF%BC%89.png)
我有一台 Linux 机器,上面有一个真实的(与虚拟的,又称别名)以太网接口可供使用(eth0 用于其他目的 - 不能使用它,也不能添加更多 NIC)。假设它是 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)机器。从 DHCP 服务器机器 ping 通 eth1 IP 或任何 vif#X IP 机器,但是(这问题,我猜...)只有 eth1 响应 ICMP 数据包(通过 ifconfig 计数器和 wireshark 嗅探验证)此问题导致无法连接到与 vif 接口的 IP 地址关联的 SNMP 代理。
我猜我需要设置内部路由,以便 IP 数据包到达其目的地 vif#X。我尝试添加 IP 规则和新的 IP 路由表,但可能没有正确设置它(新表)... 有人可以告诉我如何(最好还能告诉我为什么)这样做吗?
Linux 系统运行 Ubuntu9.04,DHCP 服务器运行 Windows XP SP3
答案1
终于解决了:这是一个与 ARP 相关的问题。
- DHCP 服务器为虚拟接口 MAC 地址分配一个 IP 地址,并在服务器的本地 ARP 表中设置此对
- Linux 机器将新的 IP 地址与请求该地址的虚拟接口绑定在一起。
- PING 以两种方式工作:
- 执行 ping 操作时从Linux 到服务器,它通过真实接口出去(位于同一 IP 子网)
- 从服务器 ping 时到Linux,再次真实接口响应,所以它似乎好像一切都还好……
但
当服务器发送 IP 数据包(在我的情况下是 SNMP 消息)时,它会使用虚拟接口的 MAC 地址。当它到达 Linux 机器时,内核会丢弃这些帧,因为它不知道如何转发它们;运行 Wireshark 会显示这些消息,因为通常接口处于混杂模式
为了使 SNMP 消息到达绑定到虚拟接口的 SNMP 代理,IP 数据包必须具有真实接口的 MAC 地址(我认为只有这样内核才会根据 IP 地址进行 VLAN 路由......)
实现此目的的方法是发送免费ARPLinux 机器的真实接口向服务器发送请求,指出新分配的 IP 地址(分配给虚拟接口之一...)由真实接口的 MAC 地址“拥有”。这会正确更新服务器的 ARP 表。
顺便说一句,这也解释了为什么在启动 SNMP 流量之前要等待一段时间:服务器的 ARP 表条目已过期,因此服务器发送一个 ARP 请求,该请求被响应正确地由真实界面
答案2
为什么不设置桥接设备?
brctl addbr bridge
将物理设备的 IP 和 MAC 添加到该桥接器,将没有 IP 的设备移动到桥接器,然后将 VIF 也连接到桥接器。