用 ip 命令创建并启用 bridge 接口的正确步骤是:先 ip link add name br0 type bridge 创建网桥,再 ip link set dev br0 up 启用;接着清空物理口 IP(ip addr flush dev eth0),最后将物理口加入网桥(ip link set dev eth0 master br0)。

怎么用 ip 命令创建并启用 bridge 接口
Linux 下最直接、最可控的方式是用 ip 配合 ip link add 创建网桥,而不是依赖老旧的 brctl(已废弃,不支持 netns 和 modern cgroup v2 场景)。
常见错误是创建后忘记启用(ip link set up),或误把物理网卡也设为 UP 状态却没删掉它的 IP——这会导致路由冲突甚至断网。
-
ip link add name br0 type bridge:创建名为br0的网桥(不带 IP) -
ip link set dev br0 up:必须启用,否则无法收发包 -
ip addr flush dev eth0:清空物理口eth0的 IP(关键!否则和br0同网段会打架) -
ip link set dev eth0 master br0:把eth0加入网桥(不是add,是master)
bridge 上配 IP 后为什么 SSH 断了
因为传统配置习惯把 IP 配在物理口上,改成桥接后若仍保留原 IP 或未及时调整默认路由,SSH 连接会因响应路径不对而中断。本质是三层转发路径和二层泛洪行为不匹配。
典型现象:ping br0 通但 SSH 连不上;或者连上后立刻断开;tcpdump -i br0 port 22 能看到 SYN 包进来,但没回包。
- 确保物理口
eth0没有 IP(ip addr show eth0应为空) - IP 必须配在
br0上:ip addr add 192.168.1.100/24 dev br0 - 检查默认路由是否指向正确网关:
ip route replace default via 192.168.1.1 dev br0 - 如果用了 DHCP,改用
dhclient br0,别再跑dhclient eth0
虚拟机或容器怎么连到这个 bridge
纯 host-only 场景下,bridge 就是宿主机的“虚拟交换机”,VM 或容器要连它,关键不是“创建成功”,而是“让流量真正走过去”。常见问题不是桥没建好,而是 namespace 隔离或 forwarding 关闭导致包被静默丢弃。
- 确认内核开启转发:
sysctl net.ipv4.ip_forward=1(临时);永久写进/etc/sysctl.conf - KVM 虚拟机 XML 中
<interface type='bridge'>的<source bridge='br0'/>必须和宿主 bridge 名一致 - 容器用
--network bridge默认走docker0,要连自建br0得用--network none+ 手动ip link set dev vethX master br0 - 注意:bridge 本身不处理 ARP 代理,若虚机里 ping 不通网关,先
arping -I br0 192.168.1.1看物理网关是否响应
brctl 已废弃,但旧脚本还在用怎么办
brctl 在 kernel 5.10+ 和 systemd-networkd / NetworkManager 共存环境下容易出竞态,比如 brctl addif br0 eth0 返回成功,但 ip link show br0 里看不到端口 —— 实际是 systemd-networkd 抢占了接口管理权。
- 查谁在管接口:
networkctl status eth0,若显示 “unmanaged” 是安全的;若为 “configured”,得先停掉对应 .network 文件或禁用systemd-networkd - 替代命令:所有
brctl功能都能用ip link+ip addr+sysctl组合覆盖,例如brctl show→ip link show type bridge - 脚本迁移时特别注意:
brctl setfd br0 0对应ip link set dev br0 forward_delay 0,但现代内核建议保留默认 15 秒防环路
bridge 的麻烦不在创建,在于它一旦介入网络栈,就牵扯到路由表、iptables/nftables、netfilter conntrack、甚至 cgroup network priority。调不通时,先 ip -br a 和 ip -br l 看状态,比翻日志快得多。

















