我正在尝试让两台虚拟机(运行 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 请求。当从接口注释掉桥接时,它表现良好。
在这种情况下 arp_filter 有用吗?它的文档说“您必须使用基于源的路由才能使其工作”。有人可以给我一个链接来解释我如何设置“基于源的路由”(我对这个主题还很陌生)。
可以使用 arptables 或 ebtables 来控制此行为吗?查看它们的文档,我看到了有关如何响应 apr 请求以及何时响应它们的信息,但关于 apr 缓存行为的信息并不多。
一般来说,我应该使用 sysctl 和 ARP 做些什么,还是应该以不同的方式设置我的 IP 分配?我看到网上的指南告诉你如何无忧无虑地做到这一点,但它们都将客户机分配给单独的子网,使网桥成为网关。这对我来说行不通——我需要所有设备都在同一个子网上。
任何想法都可以,只要满足以下条件:
答案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