我正在尝试设置一台 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 网桥可能会丢弃数据包。我遇到了同样的问题,可以使用以下信息解决它:
- https://serverfault.com/questions/347676/linux-bridge-brctl-is-dropping-packets
- https://superuser.com/questions/1211852/why-linux-bridge-doesnt-work
简而言之,有一些选项可以配置网桥:例如
# 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