我有一个完全隔离的 LAN 192.168.22.0/24,有两个硬件交换机:1Gbit 和 10Gbit。旧的 10Gbit 交换机也可以处理 1Gbit,因此将两个交换机连接在一起没有问题。上周我们得到了无法处理 1Gbit 的新 10Gbit 交换机。我必须立即连接这些突然断开的网络部分,因为在 10Gbit 上,主要是服务器(包括 dhcp)和大多数工作站连接到 1Gbit。幸运的是,我有一个连接到这两个部分的 debian linux 盒子,我可以暂时将它配置为 1/10 Gbit 交换机。我遵循了提示,但没有观察到桥接——例如,arp 表中没有效果,从 wks 到服务器没有 ping。我写了一个脚本:
#!/bin/bash
ip link add name br0 type bridge
ip link set dev br0 up
ip link set dev eth0 master br0 #1Gb
ip link set dev eth1 master br0 #XGb
请你能回答我一些问题:
- eth0 和 eth1 可以有(相同的)IP 地址吗?或者IP地址可以得到br0?
- 必须禁用/刷新/卸载 iptables 吗?(未使用 iptables)
- 是否需要设置一些“转发”启用位?
- 这样的软件开关真的可以转发dhcp广播吗?
我的 linux 机器上有一个运行任务,因此我没有测试如何配置 /etc/network/interfaces 的提示——我很高兴我禁用了 NetworkManager,我无法重新启动。
欢迎任何帮助和提示,我很高兴在星期一早上之前重新加入 LAN。
为简化起见,我将只讨论以太网和 IPv4(同样适用于 IPv6/ ip6tables)。如果这个问题让其他人感兴趣,我有时会尝试用比需要更多的细节来解决每一点。
设置
要完整,您应该在初始设置中添加它,以防之前没有完成:
如果您不启动网桥端口,则处于活动状态的网桥将无法接收也无法发送任何帧。这可能是您的问题的原因。
桥接端口和第 3 层
TL;DR:对于最简单的设置,IP 和路由配置应该在桥接接口
br0
上,并且只在它上面。这应该只影响主机的 IP 连接,而不是它的桥接能力。因此,如果之前在eth0上设置了 IP,则应改为在br0上应用它们。如果您不这样做,这将阻止与系统的 IP 连接(但不会阻止桥接)。附带说明一下,ARP 用于本地系统,由 ARP 协议处理,而不是由网桥以任何特殊方式处理。在网桥上有用的是查看 FDB(转发数据库条目)。
本地系统 ARP 状态:
监控变化:
网桥 MAC 转发状态:
监控变化:
其他设置也是可能的,例如使用额外的veth对接口,一端有 IP,另一端作为第三个桥接端口,桥接上没有 IP,使桥接只做桥接,不参与第 3 层。但是正确设置的时间更长(例如:默认情况下随机MAC地址是什么?等等)。
一旦接口成为网桥端口(将网桥作为主端口),其第 3 层信息就会被忽略:在其上配置的 IP(如果有)将变得不可用。值得注意的例外是具有网桥名称的特殊隐式自网桥端口,所以在这里
br0
。如果您为其分配一个 IP,那么除了在第 2 层交换帧外,网桥还将在第 3 层 (IP) 工作。如果您不这样做,它将只能进行交换。iptables/netfilter 和桥接层交互
TL;DR:如果你没有使用任何iptables规则,包括在网络命名空间(容器)中,你不必做任何事情,也不必关心是否加载了一些iptables相关模块。详细解答如下...
在第 2 层(以太网桥)过滤(或修改等)帧应该由ebtables完成,而在第 3 层过滤 IP 数据包应该由iptables完成。所以iptables通常不应该看到帧(除非它们注定要发送到本地系统并作为 IP 数据包到达第 3 层)并且不会对桥接的帧进行任何交互,但是......
ebtables受到更多限制,例如不能直接访问netfilter的conntrack也不能直接访问iptables可用的所有扩展。如果没有这个,就很难实现一个好的第 2 层防火墙(它充当交换机而不是路由器)。这就是为什么除了ebtables之外,还有一种特殊模式允许桥接代码调用iptables(将帧临时更改为 IP 数据包以供iptables使用) 。它在什么是 bridge-netfilter?在基于 Linux 的桥上的 ebtables/iptables 交互中,最突出的交互示例在7. 帧/数据包通过iptables PREROUTING、FORWARD 和 POSTROUTING 链的两种可能方式。Netfilter 和通用网络示意图的链路层侧的数据包流详细说明了蓝色( ebtables)和绿色(iptables)的处理。
通过加载br_netfilter模块(例如)启用此模式
modprobe br_netfilter
,但只需使用带有physdev匹配的iptables规则将自动加载它。当这个模块被加载(并且默认的 sysctl 仍然存在:)
net.bridge.bridge-nf-call-iptables=1
然后iptables将与网桥交互,特别是当网桥有 IP 时,因为这将在网桥层完成额外的时间,而不仅仅是从网络层。因此,按照前面第 7 章中的示例,如果您要桥接 LAN 192.168.22.0/24 并且还有第三个接口,而不是用于通过 NAT 访问 Internet 的桥接器的一部分,则此规则(如果单独使用):除了 NATing路由流量到外部之外,还将 NAT桥接流量:每个接收桥接帧的系统都会将桥接的 IP 视为源,而不是原始 IP。这就是为什么这通常是这样写的(你会看到像 LXC 这样的应用程序设置的):
所以是的,你甚至可以使用iptables,但你应该小心不要使用bridge-nf(br_netfilter模块)或调整规则。一些处理网络的应用程序,尤其是与容器相关的(Docker、Kubernetes ...)可能会激活它。
关于网络命名空间的注意事项:bridge-nf很快就会变成 per-namespace,但事实并非如此。可以加载模块,停用选项,然后设置每个网桥选项,但我认为现在它只能在初始命名空间中正常工作。此外,从任何网络命名空间触发模块自动加载(通过使用physdev)将影响所有其他网络命名空间,初始包括在内,这就是为什么规则应该始终为此做好准备。
注意 2:一旦nftables可以使用网桥连接跟踪,就没有理由使用bridge-nf了。
转发
默认情况下,如果没有其他选项,网桥会在其端口和自身启动后几秒钟转发帧(并且不处理 STP)。所以如果你知道不可能有任何循环,它应该已经准备好了。
DHCP
是的,网桥应该转发 DHCP 查询和回答,这里的网桥级别没有什么特别的。
杂项
VLAN
您的设置似乎在任何地方都没有 VLAN ID,因此不需要与 VLAN 相关的任何特殊内容。只是让您知道,如果涉及 VLAN 标记的帧,网桥将需要额外的设置来正确处理它们(从 开始
ip link set dev br0 type bridge vlan_filtering 1
,然后是一些适当的bridge vlan ...
命令)。故障排除
您应该在每个接口上运行tcpdump ,例如:
同时帮助查看发生了什么。
配置
如果您在 Debian 上使用ifupdown的那种配置,安装包含过时命令brctl的bridge-utils包还将添加bridge-utils-interfaces钩子以在接口节中配置网桥。对于简单的网桥配置应该足够好。