数据包未通过 Linux 以太网桥移动

数据包未通过 Linux 以太网桥移动

我正在尝试设置一台 eth0 和 eth1 桥接的 debian 8.3 机器,但我无法让数据包穿过桥接。目前,eth0 连接到具有许多其他主机的 LAN,包括 DHCP 服务器。 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

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

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

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

当我在网桥主机上的 eth1 上运行 tcpdump 时,我确实看到了据称从网络 eth0 端发出的数据包,但即使 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分配一个ip 192.168.200.1,插入eth1的测试机ip为192.168.200.2,然后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

其他地方谈到了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

并且,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

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:~# 

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

编辑: 我确实可以确认上面粘贴的 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 地址吗?

答案1

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

如果配置不正确,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

答案2

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

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

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

bridge_fd 0
bridge_maxwait 1

相关内容