我对 Linux 桥的思维模型是错误的。
我一直认为桥接器类似于简单的非托管交换机:插入一些以太网电缆,然后根据在该端口上通信的 MAC 地址将数据从一个端口复制到另一个端口。特别是:开关本身不是有一个IP地址。
所以我原以为我可以简单地做:
brctl addbr mybr
brctl addif mybr eth0
eth0 具有 IP 地址。
但我无法让它发挥作用:任何与 eth0 关联的 IP 地址似乎都会被忽略。
相反,我可以这样做:
default_interface=$(ip -4 route ls | grep default | grep -Po '(?<=dev )(\S+)')
dif=$default_interface
gw=$(ip -4 route ls | grep default | grep -Po '(?<=via )(\S+)')
dif_ip=$(ip -4 route ls | grep default | grep -Po '(?<=src )(\S+)')
echo Add bridge
sudo brctl addbr mybr
# $dif must be up, but with no ip addr
sudo ip addr flush dev $dif
sudo brctl addif mybr $dif
sudo ifconfig mybr $dif_ip
sudo route add -net 0.0.0.0 gw $gw
这会将 IP 地址和路由从 eth0 移动到网桥。
我明白那我不能简单地做:brctl addif eth0
我不明白的是为什么。