bind & connect

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/OpenBSC@lists.osmocom.org/.

Harald Welte laforge at gnumonks.org
Sun Oct 16 22:13:19 UTC 2016


On Sun, Oct 16, 2016 at 11:55:33PM +0200, Neels Hofmeyr wrote:

> So normally when I send something, the routing table (ip r show) determines
> which local interface the remote side sees as sender.

Yes.  Please note 'ip r show' will only show you 'table main'.  Since
Linux 2.2.x (yes, ages ago) Linux supports and uses multiple routin
tables.  See 'ip route show table all' to see all routes that exist in
the stack.

If you didn't bind a socket and send a packet, it works more or less
like this:

* The kernel performs a route lookup and finds an outbound route for the
  destination. If the route contains the src parameter, the kernel
  selects this IP address for the outbound packet.

* If no 'src' parameter is in the route, the kernel will choose the
  first address configured on the interface which falls in the same
  network as the destination address or the nexthop router.

See http://linux-ip.net/html/routing-saddr-selection.html

> If I connect() and bind() at the same time, would that bypass the routing table
> and the bind() address would be the sender?

yes, if you explicitly bind before using the socket, you will bypass the
regular automatic source address selection of the kernel.

> And that's why we don't really need it, because it doesn't make sense to send
> from a different interface than indicated by the routing table?

well, it sometimes makes sense in more complex scenarios with
multi-homed machines, but I think we can ignore that until somebody
requests it.

Also, in a lot of cases it makes sense to store such configuration in
the routing table itself, rather than inside the applicatin config.
Chances are that other applications/services wanting to reach the same
destination address/network will have to choose the same source address.

So something like 'ip route add 8.8.8.8/32 via 192.168.100.1 src 1.2.3.4'
will teach the routing table to choose the local source address 1.2.3.4
whenever sending packets to 8.8.8.8 and route them via the gateway
192.168.100.1.  This configuration is valid system-wide, for all
applications/sockets.  Please note that 1.2.3.4 must be a valid local
address (i.e. one that has been added using 'ip addr add 1.2.3.4 ...'
before.

Regards,
	Harald
-- 
- Harald Welte <laforge at gnumonks.org>           http://laforge.gnumonks.org/
============================================================================
"Privacy in residential applications is a desirable marketing option."
                                                  (ETSI EN 300 175-7 Ch. A6)



More information about the OpenBSC mailing list