前几天朋友找我帮忙,说家里装了新的服务器,做了网桥配置,结果一测速发现带宽只有标称的一半。明明是千兆宽带,实测才跑出三百多兆,Wi-Fi 都比这快。问题不出在运营商,也不在光猫,根源就在网桥本身。
网桥不是插上线就完事
很多人以为网桥(Bridge)就是把几个网络接口绑在一起,让设备共享一个 IP 段,但实际上一旦配置不当,性能损耗非常明显。特别是用 Linux 做软网桥时,转发效率直接受系统设置影响。
最常见的问题是默认开启了 net.bridge.bridge-nf-call-iptables。这个参数会让所有经过网桥的数据包被 iptables 处理,听起来安全,但实际会拖慢转发速度,尤其在高并发小包场景下,CPU 占用飙升,吞吐直接掉下来。
解决办法很简单,关掉它:
sysctl -w net.bridge.bridge-nf-call-iptables=0
sysctl -w net.bridge.bridge-nf-call-ip6tables=0
如果想永久生效,加到 /etc/sysctl.conf 里。
网卡驱动和中断合并
另一个容易被忽视的点是网卡驱动。有些廉价主板或虚拟机环境用的是半虚拟化网卡(比如 virtio),虽然兼容性好,但默认配置并不适合高速桥接。
可以试试开启网卡的 TSO(TCP Segmentation Offload)和 GSO(Generic Segmentation Offload)。这些功能能让网卡自己处理大包分片,减轻 CPU 负担。
ethtool -K eth0 tso on
ethtool -K eth0 gso on
注意:别乱开 LRO(Large Receive Offload),某些驱动和网桥组合会有兼容问题,反而丢包。
交换模式 vs 路由模式
如果你只是做透明桥接,别让系统误当成路由器用。检查有没有多余的 NAT 规则或者策略路由干扰。有时候不小心启了 IP 转发(ip_forward=1),又配了 SNAT,数据包来回绕路,延迟上去了,测速自然拉胯。
确认一下:
sysctl net.ipv4.ip_forward
如果是网桥用途,最好保持为 0,除非你明确要做三层转发。
实测案例:从 300M 到 940M
上次帮客户调环境,CentOS 7 上搭了个 KVM 宿主机,桥接了几台虚拟机,外网测速一直卡在 300Mbps 左右。查了一圈才发现,不仅 iptables 拦了桥流量,还开着 IP 转发,宿主机自己在偷偷做 SNAT。关掉相关设置,再调整网卡 offload 参数,速度立马冲到 940Mbps,延迟也稳定了。
所以别一上来就怪硬件,先看看软件配置是不是拖了后腿。网桥配置慢,八成是细节没抠到位。