受路由表影响的 Linux 桥接网络

rua*_*hao 0 networking linux routing ping bridge

我正在做一个关于 linux bridge 的实验,我的网络拓扑是这样的:

在此处输入图片说明

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

[root@10.74.68.58:~] # bridge link
2: eth0 state UP : <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 master br0 state forwarding priority 32 cost 2
Run Code Online (Sandbox Code Playgroud)

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

[root@10.74.68.58:~] # 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
Run Code Online (Sandbox Code Playgroud)

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

[root@10.74.68.58:~] # 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
Run Code Online (Sandbox Code Playgroud)

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 request和echo reply包了。这让我很困惑。既然br0已经收到echo回复了,为什么我ping不通host2呢?

[root@10.74.68.58:~] # ping -I br0 10.74.68.47
2 packets transmitted, 0 received, 100% packet loss, time 1006ms
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

大家能给我指点一下吗?

dir*_*rkt 6

桥接并不像您认为的那样工作。:-)

网桥只与OSI级别 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 ----------->
Run Code Online (Sandbox Code Playgroud)

此处,带有主机 A 和 B 的左侧网段由主机 X 桥接到带有主机 C 和 D 的右侧网段,每个主机都可以通过单个 IP 地址访问(分配给接口或整个网桥)。

  • 谢谢你!这是一个很棒的答案,消除了我对网络桥接的一些误解。 (2认同)