Potential bug: Inconsistent next-hop resolution in multi-homed same-subnet setup

Pysio mcyouyousever at gmail.com
Sun Jan 11 19:09:37 CET 2026


Additionally, I should mention that the issue persists even when I
explicitly declare the IGP table using the following configuration file.

protocol bgp cloudflare_tpix_210440_v4 {
    local as 210440;
    source address 203.163.223.48;
    neighbor 203.163.222.39 as 13335;
    ipv4 {
        table table_tpix_210440_v4;
        import keep filtered on;
        import where import_filter_v4();
        export where export_filter_tpix_210440();
        graceful restart on;
        export limit 99 action block;
        igp table table_tpix_210440_v4;
    };
}

BIRD 2.17.1 ready.
Table table_tpix_210440_v4:
1.1.1.0/24           unicast [cloudflare_tpix_210440_v4 2026-01-12
02:07:03] * (100) [AS13335i]
        via 203.163.222.39 on ens23
        Type: BGP univ
        BGP.origin: IGP
        BGP.as_path: 13335
        BGP.next_hop: 203.163.222.39
        BGP.local_pref: 100
        BGP.aggregator: 162.158.240.1 AS13335
        BGP.community: (13335,10080)
        BGP.large_community: (213605, 10, 1) (213605, 10, 4)


BIRD 2.17.1 ready.
Table table_tpix_210440_v4:
203.163.222.0/23     unicast [direct_tpix_210440 2026-01-12 02:04:33] *
(240)
        dev ens4
        Type: device univ


On Mon, Jan 12, 2026 at 1:57 AM Pysio <mcyouyousever at gmail.com> wrote:

> Hi Alexander,
>
> Thank you for your response. To answer your question: yes, I am using
> specific tables (e.g., table_tpix_210440_v4) for each BGP session, and I
> have corresponding protocol direct instances to populate those tables
> with the respective interface routes.
>
> However, despite having a valid direct route in the specific table, BIRD
> still resolves the BGP next hop via ens23 (the first interface in the
> kernel's subnet list) instead of honoring the device route defined in the
> local table.
>
> Below is the relevant part of my configuration for your review.
>
> ```config
> table table_tpix_210440_v4;
> table table_tpix_210440_v6;
>
> protocol direct direct_tpix_210440 {
>     ipv4 { table table_tpix_210440_v4; };
>     ipv6 { table table_tpix_210440_v6; };
>     interface "ens4";
> }
>
>
> protocol bgp cloudflare_tpix_210440_v4 {
>     local as 210440;
>     source address 203.163.223.48;
>     neighbor 203.163.222.39 as 13335;
>     ipv4 {
>         table table_tpix_210440_v4;
>         import keep filtered on;
>         import where import_filter_v4();
>         export where export_filter_tpix_210440();
>         graceful restart on;
>         export limit 99 action block;
>     };
> }
>
> ```
>
> Even though table_tpix_210440_v4 contains a direct route for
> 203.163.222.0/23 via ens4, BIRD's show route output for the BGP session
> on ens4 indicates the next hop is resolved via ens23.
>
> On Mon, Jan 12, 2026 at 1:06 AM Alexander Zubkov <green at qrator.net> wrote:
>
>> Hi Lui,
>>
>> Does cloudflare_tpix_210440_v4 bgp protocol use table_tpix_210440_v4 as
>> IGP table also? It might be better to have an overview of your config file.
>>
>> Regards,
>> Alexander
>>
>> On Sun, Jan 11, 2026 at 3:14 PM HaoRanLiu <mcyouyousever at gmail.com>
>> wrote:
>>
>>> Hello,
>>>
>>> I am writing to report a potential issue (or seek clarification on
>>> resolution logic) in BIRD 2.17.1 regarding how next hops are resolved
>>> when multiple interfaces exist in the same subnet.
>>>
>>> [ Environment ]
>>> - BIRD version: 2.17.1
>>> - OS: Linux
>>> - Setup: Multiple physical interfaces (ens4, ens23, ens2) are configured
>>> with IP addresses in the same prefix: 203.163.222.0/23.
>>>
>>> [ Observation ]
>>> Within a specific routing table (table_tpix_210440_v4), BIRD's recursive
>>> resolution for a BGP route does not seem to honor the "Direct/Device"
>>> route present in that same table.
>>>
>>> [ Evidence ]
>>>
>>> 1. The Direct Route in table "table_tpix_210440_v4" points to ens4:
>>>
>>> bird> show route for 203.163.222.39/32 table table_tpix_210440_v4 all
>>> Table table_tpix_210440_v4:
>>> 203.163.222.0/23     unicast [direct_tpix_210440 2026-01-11 21:10:29] *
>>> (240)
>>>          dev ens4
>>>          Type: device univ
>>>
>>> 2. However, a BGP route in the SAME table resolves via ens23:
>>>
>>> bird> show route for 1.1.1.1 table table_tpix_210440_v4 all
>>> Table table_tpix_210440_v4:
>>> 1.1.1.0/24           unicast [cloudflare_tpix_210440_v4 2026-01-11
>>> 21:33:43] * (100) [AS13335i]
>>>          via 203.163.222.39 on ens23
>>>          Type: BGP univ
>>>          BGP.origin: IGP
>>>          BGP.as_path: 13335
>>>          BGP.next_hop: 203.163.222.39
>>>          ...
>>>
>>> [ System Network State ]
>>> The OS kernel shows three interfaces in this subnet:
>>>
>>> # ip route show 203.163.222.0/23
>>> 203.163.222.0/23 dev ens23 proto kernel scope link src 203.163.223.49
>>> 203.163.222.0/23 dev ens2 proto kernel scope link src 203.163.223.50
>>> 203.163.222.0/23 dev ens4 proto kernel scope link src 203.163.223.48
>>>
>>> [ Questions ]
>>> 1. Is this a bug in the recursive resolution logic? It appears BIRD
>>> might be picking an interface from the global interface list (perhaps
>>> the first one UP) rather than following the best route available in the
>>> specific table being queried.
>>> 2. Why does the BGP route's "via" field not honor the interface (ens4)
>>> defined by the device route in the same table?
>>> 3. Is there any configuration to force BIRD to resolve next hops
>>> strictly based on the current table's best path in such multi-homed
>>> scenarios?
>>>
>>> Any insights would be appreciated.
>>>
>>> Best regards,
>>> Liu HaoRan
>>>
>>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://trubka.network.cz/pipermail/bird-users/attachments/20260112/a5f490d6/attachment.htm>


More information about the Bird-users mailing list