metallb/metallb

Add support for BGP on link-local addresses

doka380 opened this issue · 3 comments

Is your feature request related to a problem?

At the moment, it's not possible to use link-local addresses for building BGP peering, since there is no ability to specify interface where peer can be found. Value e.g. fe80::xxxx:xxxx:xxxx:xxxx%enp1s0 for peerAddress in BGPPeer rejected with the error Error from server (Forbidden): error when creating "metlb-conf.yaml": admission webhook "bgppeersvalidationwebhook.metallb.io" denied the request: parsing peer gk-peer-v6: invalid BGPPeer address "fe80::b8a3:17ff:fe0c:c54a%enp1s0"

Describe the solution you'd like

This is already supported by FRR:

 neighbor fe80::a876:4dff:fe77:408 remote-as 64501
 neighbor fe80::a876:4dff:fe77:408 interface enp1s0

and the second line of the config above (interface specification) can be generated based on the following BGPPeer specification:

spec:
  peerASN: 64501
  peerAddress: fe80::a876:4dff:fe77:408
  peerInterface: enp1s0

Additional context

This change will allow to use any available addressing in IPv6 environment, including link-local addresses.

There was a discussion here about this - https://kubernetes.slack.com/archives/C8FSTGU56/p1717574500705649

I've read and agree with the following

  • I've checked all open and closed issues and my request is not there.
  • I've checked all open and closed pull requests and my request is not there.

Thanks for raising this! We are working on it!
At some point we'll create a design proposal.

Just to make it clear - this is not something exotic, the same approach also implemented in another routing software - Bird - https://bird.network.cz/?get_doc&v=20&f=bird-6.html#ss6.4 -

interface string
     Define interface we should use for link-local BGP IPv6 sessions. Interface can also be specified
     as a part of neighbor address (e.g., neighbor fe80::1234%eth0 as 65000;).

@fedepaol you could assign that to me, it might relevant to the unnumber BGP peering (as we would add interface name in the config), thanks