Linux 桥接网络受路由表影响

Linux 桥接网络受路由表影响

我正在做一个关于Linux桥接的实验,我的网络拓扑如下:

在此处输入图片描述

如您所见,LAN 中有两台主机,Host1(10.74.68.58)和 Host2(10.74.68.47)。在 Host1 上,我创建了一个网桥br0并为其分配一个 IP(192.168.3.101)。然后我连接eth0到桥上:

[[email protected]:~] # bridge link
2: eth0 state UP : <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 master br0 state forwarding priority 32 cost 2

我将默认路由设置为br0并且可以ping 10.74.68.47

[[email protected]:~] # ip r
default dev br0  scope link
172.17.0.0/16 dev docker0  proto kernel  scope link  src 172.17.42.1
192.168.3.0/24 dev br0  proto kernel  scope link  src 192.168.3.101

但事情变得无法解释当我将默认路由设置为eth0

[[email protected]:~] # ip r
default dev eth0  scope link
172.17.0.0/16 dev docker0  proto kernel  scope link  src 172.17.42.1
192.168.3.0/24 dev br0  proto kernel  scope link  src 192.168.3.101

什么时候eth0是默认路由接口,我尝试通过两种不同的方式 ping host2:

1、ping 10.74.68.47

失败了。我检查了 tcpdump 文件(在接口 br0 上捕获)后发现,br0 只收到了 ARP 响应。因此接口 eth0 上没有 ARP 信息,因此无法获取 host2 的 mac。我认为这是正确的行为,我的理解对吗?

2,然后我尝试ping -I br0 10.74.68.47

我想使用 -I 选项来避开默认路由,但也失败了。在我检查 tcpdump 文件(在接口 br0 上捕获)后,我发现已经有一对icmp echo请求和echo reply数据包。这让我很困惑。既然 br​​0 已经收到了回显答复,为什么我无法成功 ping 通 host2?

[[email protected]:~] # ping -I br0 10.74.68.47
2 packets transmitted, 0 received, 100% packet loss, time 1006ms

在此处输入图片描述

你们能给我一些指点吗?

答案1

桥接并不像你想象的那样工作。:-)

桥梁只关心开放系统互连第 2 级(以太网帧)。在此级别上,不存在 IP 地址等。从概念上讲,您可以将网桥视为以太网接口的集合。每个接口称为端口,进入一个端口的数据包会从所有其他端口出来。(实际上,在 Linux 实现中,有一种优化方法可以保留一个可见 MAC 地址表,但从概念上讲,这并不重要)。

因此,网桥可以将多个以太网段连接(“桥接”)成一个大段。

那么“为 Linux 桥接器分配 IP 地址”是什么意思呢?在 Linux 实现中,桥接器并不是一个单独的硬件设备(就像它们最初是那样),它也可以从主机本身访问。这意味着它就像一种具有许多端口的“超级以太网接口”,但进入内核或从内核发出的数据包任何这些端口通过单个 IP 地址到达 Linux 操作系统。

因此,只要将以太网接口设为网桥的从属(端口),它就不再拥有自己的地址。唯一有用的是网桥的 IP 地址。

换句话说,只用一个端口制作一个网桥是没有意义的(你可以单独使用接口)。试图将数据包路由到网桥的一个端口也是没有意义的(就内核而言,网桥是一个单一设备)。

如果你想玩弄桥梁,你需要这样的结构:

  10.0.2.1/23    10.0.2.2/23    10.0.3.254/23     10.0.3.1/23    10.0.3.2/23 

  ............   ............   ...............   ............   ............
  .  Host A  .   .  Host B  .   .  Host X     .   .  Host C  .   .  Host D  .
  .          .   .          .   . <-- br0 --> .   .          .   .          .
  .   eth0   .   .   eth0   .   . eth0   eth1 .   .   eth0   .   .   eth0   .
  .....|......   .....|......   ...|......|....   .....|......   .....|......
       |              |            |      |            |              |      
  -----+--------------+------------+      +------------+--------------+------

  <-------- left Segment  --------->      <------- right Segment ----------->

这里,左侧网段(包含主机 A 和 B)通过主机 X 桥接到右侧网段(包含主机 C 和 D),并且每个主机都可以通过单个 IP 地址(分配给接口或整个网桥)访问。

答案2

当你ping -I br0 10.74.68.47发现Protocol stackip(10.74.68.47)和br0不在一个LAN内,所以它通过eth0发送ARP。但是eth0连接着br0,它无法连接协议栈,eth0会向br0发送ARP响应,然后br0发现mac不匹配,所以它丢弃了它。所以协议栈没有得到ARP响应。
你可以将br0的ip改为10.74.68.x/24。就没问题了。

相关内容