Linux 使用错误的接口存储 arp 缓存条目

Linux 使用错误的接口存储 arp 缓存条目

我正在尝试让两台虚拟机(运行 CentOS)使用 VDE 和外部网络与主机(Ubuntu 10.04)通信。

到目前为止,我遇到了 ARP 问题。

在主机上,我有一个物理 eth0 和一个由 br0 桥接的虚拟 tap0 接口。全部位于同一子网上。

br0       Link encap:Ethernet  HWaddr 78:e3:b5:90:88:df  
          inet addr:172.16.1.3  Bcast:172.255.255.255  Mask:255.0.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:10 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:1381 (1.3 KB)

br0:1     Link encap:Ethernet  HWaddr 78:e3:b5:90:88:df  
          inet addr:172.16.1.4  Bcast:172.255.255.255  Mask:255.0.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

eth0      Link encap:Ethernet  HWaddr 78:e3:b5:90:88:df  
          inet addr:172.16.1.1  Bcast:172.255.255.255  Mask:255.0.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:18 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:2362 (2.3 KB)
          Interrupt:33 Base address:0x6000 

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:778 errors:0 dropped:0 overruns:0 frame:0
          TX packets:778 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:62832 (62.8 KB)  TX bytes:62832 (62.8 KB)

tap0      Link encap:Ethernet  HWaddr b6:22:43:93:ed:60  
          inet addr:172.16.1.2  Bcast:172.255.255.255  Mask:255.0.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:15 errors:0 dropped:3 overruns:0 carrier:0
          collisions:0 txqueuelen:500 
          RX bytes:0 (0.0 B)  TX bytes:1980 (1.9 KB)

当我从另一台机器(或从客户机) ping 这台主机 Ubuntu 机器时,arp 缓存条目存储为 br0 条目,因此 Ubuntu 机器从不响应 ping。

Address                  HWtype  HWaddress           Flags Mask            Iface
172.22.64.4                      (incomplete)                              eth0
172.22.64.4              ether   00:25:b3:0f:0b:14   C                     br0

这是实际用于设置所有接口的 IP 地址的接口文件:auto lo iface lo inet loopback

auto eth0
iface eth0 inet manual
        address 172.16.1.1
        netmask 255.0.0.0
        gateway 172.16.1.255
        post-up ifconfig eth0 172.16.1.1 netmask 255.0.0.0

auto tap0
iface tap0 inet static
        address 172.16.1.2
        netmask 255.0.0.0
        gateway 172.16.1.255
        pre-up vde_tunctl -t $IFACE
        post-up ifconfig tap0 172.16.1.2 netmask 255.0.0.0
        post-up vde_switch -t $IFACE -s /tmp/vde-$IFACE -d -g rhuser -m 664
        post-down vde_tunctl -d $IFACE

auto br0
iface br0 inet static
        address 172.16.1.3
        netmask 255.0.0.0
        gateway 172.16.1.255
        post-up ifconfig br0 172.16.1.3 netmask 255.0.0.0
        post-up ifconfig br0:1 172.16.1.4 netmask 255.0.0.0
        bridge_ports eth0 tap0

我尝试通过 关闭 br0 上的 ARP ip link set br0 arp off。我还尝试为 br0 设置 arp_ignore 之类的东西。在这两种情况下,Ubuntu 根本不响应 ARP 请求。这是我的第一个问题 - 为什么当存在桥接时,eth0 不响应 ARP 请求。当从接口注释掉桥接时,它表现良好。

  1. 在这种情况下 arp_filter 有用吗?它的文档说“您必须使用基于源的路由才能使其工作”。有人可以给我一个链接来解释我如何设置“基于源的路由”(我对这个主题还很陌生)。

  2. 可以使用 arptables 或 ebtables 来控制此行为吗?查看它们的文档,我看到了有关如何响应 apr 请求以及何时响应它们的信息,但关于 apr 缓存行为的信息并不多。

  3. 一般来说,我应该使用 sysctl 和 ARP 做些什么,还是应该以不同的方式设置我的 IP 分配?我看到网上的指南告诉你如何无忧无虑地做到这一点,但它们都将客户机分配给单独的子网,使网桥成为网关。这对我来说行不通——我需要所有设备都在同一个子网上。

任何想法都可以,只要满足以下条件:

  • 虚拟机与外部网络位于同一子网。
  • 虚拟机可以与主机通信以获取 NFS 等。
  • 主机不一定需要与外部网络对话。

  • 答案1

    这就是所谓的“arp问题”。

    http://www.ssi.bg/~ja/#arp_announce

    有关 arp_announce 和 arp_ignore 设备标志的更多信息,请参阅 linux/Documentation/networking/ip-sysctl.txt 文件。

    我认为您希望所有接口的 arp_announce=1。

    另请参阅(一般):

    http://www.austintek.com/LVS/LVS-HOWTO/HOWTO/LVS-HOWTO.arp_problem.html

    相关内容