<div dir="auto"><div>Hi Christian and all!</div><div dir="auto"><br></div><div dir="auto">I wonder if it is necessary at all to set a vrf on an accepted connection? It seems to me that setting or checking vrf should be avoided instead for an accepted connection. What do you think?<br><br><div class="gmail_quote" dir="auto"><div dir="ltr" class="gmail_attr">On Sat, Jul 27, 2024, 11:54 Christian Svensson via Bird-users <<a href="mailto:bird-users@network.cz">bird-users@network.cz</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Since Linux 5.7 (see linux/c427bfec18f21) non-root users are allowed to<br>
bind a socket using SO_BINDTODEVICE as long as the socket is not already<br>
bound.<br>
<br>
When using BGP with VRFs, BIRD correctly binds the listening socket to<br>
the VRF but also re-binds the accept()'d socket to the same VRF.<br>
This is not needed as the interface bind is inherited in this case, and<br>
indeed this redundant bind causes an -EPERM if BIRD is running as non-root<br>
making BIRD close the connection and reject the peer.<br>
<br>
We change the behaviour of the generic sk_setup to first query the socket<br>
and see if the socket is already correctly bound, and call<br>
setsockopt(SO_BINDTODEVICE) iff it is truly needed. In addition,<br>
since the getsockopt(SO_BINDTODEVICE) was implemented in Linux 3.8 or<br>
otherwise might be blocked in existing installations, we quietly fall<br>
back to the previous behavior if the getsockopt call fails.<br>
<br>
Test case:<br>
 Run BIRD as a non-root user (and no extra capabilities) using passive<br>
 BGP inside a VRF. Before the patch observe the error:<br>
 "<ERR> SOCK: Incoming connection: SO_BINDTODEVICE: Operation not permitted"<br>
<br>
  protocol bgp AS1234_1 {<br>
    [..]<br>
    vrf "VrfTest";<br>
    passive on;<br>
  }<br>
<br>
 After the patch this works as expected.<br>
<br>
Patch is attached to this message but if it falls off it can also be found<br>
at:<br>
<a href="https://github.com/sonix-network/bird/blob/33a0ac4b5af38d3bf75c78ca62472fff1663945e/patches/0001-IO-Avoid-calling-SO_BINDTODEVICE-if-not-needed.patch" rel="noreferrer noreferrer" target="_blank">https://github.com/sonix-network/bird/blob/33a0ac4b5af38d3bf75c78ca62472fff1663945e/patches/0001-IO-Avoid-calling-SO_BINDTODEVICE-if-not-needed.patch</a><br>
<br>
There is also a simple utility to test the behavior of rebinding sockets at:<br>
<a href="https://github.com/sonix-network/bird/blob/33a0ac4b5af38d3bf75c78ca62472fff1663945e/patches/0001-IO-Avoid-calling-SO_BINDTODEVICE-if-not-needed.repro.c" rel="noreferrer noreferrer" target="_blank">https://github.com/sonix-network/bird/blob/33a0ac4b5af38d3bf75c78ca62472fff1663945e/patches/0001-IO-Avoid-calling-SO_BINDTODEVICE-if-not-needed.repro.c</a><br>
<br>
Thanks for your consideration,<br>
</blockquote></div></div></div>