inheriting fib from an interface
Don Lewis
truckman at FreeBSD.org
Tue Jan 24 01:31:29 UTC 2017
Let's say that I have an application running on a server that is
connected to the Internet via two different ISPs and is using IP
addresses (ISP A:10.0.0.10 and ISP B:192.168.1.10) delegated by those
two ISPs on it's two interfaces. Responses to requests sent to
10.0.0.10 should be sent via ISP A, and responses to requests sent to
192.168.1.10 should be ISB B.
There are a couple of different ways that I can think of to do this:
1) Put the server behind another FreeBSD box that uses policy-based
routing to forward the outbound packets to the desired ISP. My
understanding is that this only works for packet forwarding and not
for locally generated packets.
2) Set net.fibs=2, set separate default routes for the two fibs, modify
the application to create and bind sockets to both IP addresses, and
call setsockopt(..., SO_SETFIB, ...) on each. This is a bit of a
headache because it requires maintaining source code changes for the
application. Also the SO_SETFIB settings in the application need to be
kept synchronized to the system configuration, which looks like it
could be error-prone. Running two instances of the application under
setfib might be undesirable.
FreeBSD can also associate a fib with an interface. From the brief
reading that I've done, it looks like this is only used to tag incoming
packets with the fib of the interface that they are received on and thus
influence the routing decisions made when forwarding them.
It seems like it would be useful for a socket to inherit the fib of the
matching interface when bind() is called on it. Since connect() may
also do a bind, perhaps the fib should be inherited then as well. Also
when a TCP socket listening on INADDR_ANY receives a connection request
and returns a new socket via accept(), perhaps that socket should have
its fib set as well.
Thoughts?
More information about the freebsd-net
mailing list