For a bridge that is defined as auto br0iface br0 inet dhcp        bridge-ifaces enp0s8        bridge-ports enp0s8        up ifconfig enp0s8 upiface enp0s8 inet manualthe os sets up the 2 routes on the interface up:192.168.1.0/24 dev enp0s8  proto kernel  scope link  src 192.168.1.134192.168.1.0/24 dev br0  proto kernel  scope link  src 192.168.1.134But if one tries to make the same up manually with:ip route add 192.168.1.0/24 dev br0 proto kernel src 192.168.1.134ip route add 192.168.1.0/24 dev enp0s8 proto kernel src 192.168.1.134then the second command fails with RTNETLINK answers: File exists.The question:Does the kernel cheat or there is some key I missed in my ip route add commands?It's not about whether this configuration makes sense or not, it's about how the kernel could do that.
Two routes to the same network through different interfaces
linux;ubuntu;networking;routing
You should check the official documentation which says (after the first example):You will note that auto eth0 and iface eth0 inet manual are not in the file. This is because br0 will bring up the components assigned to it.It makes no sense to configure the Ethernet adapters connected to a bridge as they simply share the bridge's IP address.The reason you were not able to add the route manually is because you didn't reproduce the steps in the init scripts.  If you set an IP on enp0s8, then the system will allow you to add the route.  Again note that this is wrong and will make routing more complicated (especially if you do advanced routes, forwarding or NATing).To reproduce the system's init scripts, after deleting all relevant routes and removing the bridge if it already exists:brctl addbr br0ifconfig enp0s8 192.168.1.0/24ifconfig br0 192.168.1.0/24This will get ip route to output both routes.  If you add enp0s8 to the bridge then that will not work anymore.  You are simply getting a slightly abnormal result from an obviously bad configuration.