数据包不通过 linux 以太网桥

ric*_*chd 5 linux networking debian ethernet bridge

我正在尝试设置一个 eth0 和 eth1 桥接的 debian 8.3 机器,但我无法让数据包通过桥接。目前,eth0 与许多其他主机(包括 DHCP 服务器)连接到 LAN。Eth1 连接到一个普通交换机,并连接了一台机器。

这是我的 /etc/network/interfaces:

iface eth0 inet manual
iface eth1 inet manual

allow-hotplug br0
auto br0
iface br0 inet static
        bridge_ports eth0 eth1
        address 172.16.1.111
        netmask 255.255.0.0
        broadcast 172.16.255.255
        gateway 172.16.1.254
        dns-servers 172.16.1.1
Run Code Online (Sandbox Code Playgroud)

/proc/sys/net/ipv4/ip_forward 设置为 1。

根据连接到eth1网络的测试机上运行的tcpdump,测试机正在发送DHCP请求,但根据桥接主机上运行的tcpdump,它没有收到此类请求。

另一台主机插入连接到 eth1 的交换机也可以看到测试机器确实在发送 DHCP 请求,但同样,在桥接主机上运行 tcpdump 显示没有传入的 DHCP 请求。

当我在网桥主机上的 eth1 上运行 tcpdump 时,我确实看到数据包从网络的 eth0 端传出 eth1,但即使 tcpdump 声称这些数据包正在退出 eth1,eth1 网络上的主机也无法看到任何他们。

如果我给连接到 eth1 的测试机器一个静态 ip 172.16.1.112,它不会从网桥主机(172.16.1.111)得到 ping 响应。插入交换机的另一台主机可以看到测试主机发出 arp who-has 172.16.1.111 请求,但是在桥接主机上的 eth1 上运行的 tcpdump 显示没有传入的 arp 请求。

如果我把网桥全部删掉,给eth1分配一个192.168.200.1的ip,测试机插到eth1一个192.168.200.2的ip,然后ping,ssh,一切正常,说明物理没有问题网络连接。此外,两个接口的“ifconfig ethx promisc up”也没有帮助。

来自 ifconfig:

br0       Link encap:Ethernet  HWaddr 00:22:19:d5:48:a5  
          inet addr:172.16.1.111  Bcast:172.16.255.255  Mask:255.255.0.0
          inet6 addr: fe80::222:19ff:fed5:48a5/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1789546 errors:0 dropped:0 overruns:0 frame:0
          TX packets:7077 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:89574606 (85.4 MiB)  TX bytes:1096756 (1.0 MiB)

eth0      Link encap:Ethernet  HWaddr 00:22:19:d5:48:a5  
          UP BROADCAST RUNNING PROMISC MULTICAST  MTU:1500  Metric:1
          RX packets:1796423 errors:0 dropped:6430 overruns:0 frame:0
          TX packets:7124 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:123614592 (117.8 MiB)  TX bytes:1159358 (1.1 MiB)
          Interrupt:16 

eth1      Link encap:Ethernet  HWaddr 00:22:19:d5:48:a6  
          UP BROADCAST RUNNING PROMISC MULTICAST  MTU:1500  Metric:1
          RX packets:6437 errors:0 dropped:6435 overruns:0 frame:0
          TX packets:1782083 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:1737578 (1.6 MiB)  TX bytes:121076196 (115.4 MiB)
          Interrupt:17
Run Code Online (Sandbox Code Playgroud)

其他地方讲到了ebtables,这是我的:

root@face:~# ebtables -L
Bridge table: filter

Bridge chain: INPUT, entries: 0, policy: ACCEPT

Bridge chain: FORWARD, entries: 0, policy: ACCEPT

Bridge chain: OUTPUT, entries: 0, policy: ACCEPT
Run Code Online (Sandbox Code Playgroud)

而且,iptables:

# Generated by iptables-save v1.4.21 on Fri Mar 25 12:07:16 2016
*mangle
:PREROUTING ACCEPT [160073:12825881]
:INPUT ACCEPT [125398:10762899]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [2598:515898]
:POSTROUTING ACCEPT [2598:515898]
COMMIT
# Completed on Fri Mar 25 12:07:16 2016
# Generated by iptables-save v1.4.21 on Fri Mar 25 12:07:16 2016
*filter
:INPUT ACCEPT [125467:10767745]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [2631:519386]
COMMIT
# Completed on Fri Mar 25 12:07:16 2016
# Generated by iptables-save v1.4.21 on Fri Mar 25 12:07:16 2016
*nat
:PREROUTING ACCEPT [59097:4965900]
:INPUT ACCEPT [24420:2902790]
:OUTPUT ACCEPT [513:27017]
:POSTROUTING ACCEPT [513:27017]
COMMIT
# Completed on Fri Mar 25 12:07:16 2016
Run Code Online (Sandbox Code Playgroud)

brctl 的东西:

root@face:~# brctl show
bridge name     bridge id               STP enabled     interfaces
br0             8000.002219d548a5       no              eth0
                                                        eth1
root@face:~# bridge link show
2: eth0 state UP : <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 master br0 state forwarding priority 32 cost 4 
3: eth1 state UP : <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 master br0 state forwarding priority 32 cost 19 
root@face:~# 
Run Code Online (Sandbox Code Playgroud)

我一定错过了一些愚蠢的东西,但我看不到它是什么。我究竟做错了什么?

编辑: 我确实可以确认上面粘贴的 iptables-save 转储是正在运行的 iptables 配置的全部内容。现在,重新启动后, iptables-save 不返回任何内容。

我还在接口配置的 br0 部分添加了“bridge_fd 0”和“bridge_maxwait 1”,但是在重新启动这些更改后大约 10 分钟,仍然没有流量到达任何地方。

我切换了 eth0 和 eth1 线,看起来 eth0 插入的地方就是 br0 响应 ping 的地方。经过几分钟的 ping 后,仍然没有流量通过。

为了进一步调查问题,我交换了 /etc/udev/rules.d/70-persistent-net.rules 中的 mac 地址,以便 eth0 现在是 eth1,而 eth1 具有以前的 eth0 mac 地址。重启后,br0 仍然拥有 eth0 的 mac,现在是 eth1,它仍然是唯一确认任何传入数据包的一方。br0 可以设置为第三个非 eth0 或 eth1 mac 地址吗?

小智 6

这是一个很老的问题,但可能对其他人有帮助。

如果配置不正确,Linux 网桥可能会丢弃数据包。我遇到了同样的问题,可以使用以下信息解决它:

简而言之,有一些选项可以配置网桥:例如

# do not query iptables for packet routing
echo 0 > /proc/sys/net/bridge/bridge-nf-call-iptables

# no additional processing for multicast packets
echo 0 > /sys/devices/virtual/net/br0/bridge/multicast_querier
echo 0 > /sys/devices/virtual/net/br0/bridge/multicast_snooping
Run Code Online (Sandbox Code Playgroud)


roa*_*ima 2

配置看起来大致正确(即我看不出有什么大问题)。

不过,您缺少生成树延迟的值,这意味着网桥在启动后 15 秒(默认值)内不会转发任何数据包。bridge_fd通过添加到您的接口配置来修复。0如果没有其他相关网桥,则使用该值;如果网络中可能存在环路,则使用更大的值。

另外,当您添加值时,我建议您在桥初始化期间减少继续操作之前等待的最长时间。我发现设置bridge_maxwait为比该值多一秒bridge_fd通常就足够了。

bridge_fd 0
bridge_maxwait 1
Run Code Online (Sandbox Code Playgroud)

  • 当生成树未启用时,您不需要生成树延迟值(如 brctl 所示)。 (2认同)