我正在做一个关于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数据包。这让我很困惑。既然 br0 已经收到了回显答复,为什么我无法成功 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 stack
ip(10.74.68.47)和br0不在一个LAN内,所以它通过eth0发送ARP。但是eth0连接着br0,它无法连接协议栈,eth0会向br0发送ARP响应,然后br0发现mac不匹配,所以它丢弃了它。所以协议栈没有得到ARP响应。
你可以将br0的ip改为10.74.68.x/24。就没问题了。