• Simon Kelley's avatar
    Use IP[V6]_UNICAST_IF socket option instead of SO_BINDTODEVICE for DNS. · 9d6918d3
    Simon Kelley authored
    dnsmasq allows to specify a interface for each name server passed with
    the -S option or pushed through D-Bus; when an interface is set,
    queries to the server will be forced via that interface.
    
    Currently dnsmasq uses SO_BINDTODEVICE to enforce that traffic goes
    through the given interface; SO_BINDTODEVICE also guarantees that any
    response coming from other interfaces is ignored.
    
    This can cause problems in some scenarios: consider the case where
    eth0 and eth1 are in the same subnet and eth0 has a name server ns0
    associated.  There is no guarantee that the response to a query sent
    via eth0 to ns0 will be received on eth0 because the local router may
    have in the ARP table the MAC address of eth1 for the IP of eth0. This
    can happen because Linux sends ARP responses for all the IPs of the
    machine through all interfaces. The response packet on the wrong
    interface will be dropped because of SO_BINDTODEVICE and the
    resolution will fail.
    
    To avoid this situation, dnsmasq should only restrict queries, but not
    responses, to the given interface. A way to do this on Linux is with
    the IP_UNICAST_IF and IPV6_UNICAST_IF socket options which were added
    in kernel 3.4 and, respectively, glibc versions 2.16 and 2.26.
    Reported-by: default avatarHector Martin <marcan@marcan.st>
    Signed-off-by: default avatarBeniamino Galvani <bgalvani@redhat.com>
    9d6918d3
CHANGELOG 85.8 KB