Stefan Bauer schrieb:
> Am 27.02.2010 17:43, Fabian Knittel schrieb:
>> With a few tweaks to /etc/gai.conf I managed to change the order:
>>
>>   $ python -c "import socket; print socket.getaddrinfo(None, 'auth',
>>   0, socket.SOCK_STREAM, 0, socket.AI_PASSIVE)"
>>   [(10, 1, 6, '', ('::', 113, 0, 0)), (2, 1, 6, '', ('0.0.0.0', 113))]
>>                     ^^                                ^^^^^^^
>>                    IPv6                              IPv4
> 
> That's how it is displayed in my case. gai.conf is empty. Right now
> i dont see, where this behavior comes from.

Great, so we've now established the reason for the differences in your
and our tests!

Although we haven't determined _why_ getaddrinfo behaves differently, it
obviously does. oidentd should be able to cope with the difference the
same way it should be able to cope with different values for
/proc/sys/net/ipv6/bindv6only.

The current works / fails matrix as far as I see it:

                          |      bindv6only = 0     | bindv6only = 1
--------------------------+-------------------------+----------------
getaddrinfo -> ipv6 first |         works (*)       |  works
getaddrinfo -> ipv4 first | fails to listen on IPv6 |  works (**)

(*) Although oidentd fails to open the second socket, the failure has no
visible effect as the first socket listens for IPv4 and IPv6 traffic
simultaneously.

(**) This appears to be the default on current squeeze systems with a
2.6.32 Linux kernel.

So my patch only makes a difference for one specific system
configuration (ipv4 first and bindv6only = 0).


> I hope you understand
> that i'm very cautious about patching upstream source as long as we
> dont have eliminated all the doughts, where this problem really relies.

I understand that very well. Too bad we don't have upstream to ease the
process. :)

>> With the tweak in effect, oidentd worked without my patch - using only a
>> single IPv6 socket which accepted both IPv4 and IPv6. (This would break
>> for /proc/sys/net/ipv6/bindv6only=1.)
> 
> I can not confirm this either.

Please disregard that side-comment, it was a mistake, sorry. If my
statement were correct, it would have meant that my proposed patch would
break in the "getaddrinfo -> ipv6 first" case.

The above matrix should correctly reflect the cases where it fails /
succeeds.

> I just enabled bindv6only and tried
> to connect again to oidentd on ipv4 and ipv6:
> 
> Mar  1 09:04:34 black oidentd[18481]: Connection from
> cl-849.dus-01.de.sixxs.net (2a01:198:200:350::2):39062
> Mar  1 09:04:42 black oidentd[18490]: Connection from
> p5B0822FB.dip0.t-ipconnect.de (91.8.34.251):1548
> 
> black:/home/sb# lsof -itcp:113
> COMMAND   PID   USER   FD   TYPE   DEVICE SIZE NODE NAME
> oidentd 18443 oident    6u  IPv6 48082507       TCP *:auth (LISTEN)
> oidentd 18443 oident    7u  IPv4 48082508       TCP *:auth (LISTEN)
> 
> Now it binds two 2 single sockets but that's really no advantage or
> disadvantage at all.

Correct. In the bindv6only=1 case _or_ with my patch, there will always
be two single sockets. In the bindv6only=0 case and without my patch,
there will always only be a single socket. The second socket will
conflict with the first and (silently) fail to open.


I've attached my /etc/gai.conf with all assumed defaults enabled. I
don't know whether that suffices to achieve "getaddrinfo -> ipv4 first"
on your system, but it might be worth a try and works on my system.

Cheers
Fabian
# Configuration for getaddrinfo(3).
#
# So far only configuration for the destination address sorting is needed.
# RFC 3484 governs the sorting.  But the RFC also says that system
# administrators should be able to overwrite the defaults.  This can be
# achieved here.
#
# All lines have an initial identifier specifying the option followed by
# up to two values.  Information specified in this file replaces the
# default information.  Complete absence of data of one kind causes the
# appropriate default information to be used.  The supported commands include:
#
# reload  <yes|no>
#    If set to yes, each getaddrinfo(3) call will check whether this file
#    changed and if necessary reload.  This option should not really be
#    used.  There are possible runtime problems.  The default is no.
#
# label   <mask>   <value>
#    Add another rule to the RFC 3484 label table.  See section 2.1 in
#    RFC 3484.  The default is:
#
label ::1/128       0
label ::/0          1
label 2002::/16     2
label ::/96         3
label ::ffff:0:0/96 4
label fec0::/10     5
label fc00::/7      6
label 2001:0::/32   7
#
#    This default differs from the tables given in RFC 3484 by handling
#    (now obsolete) site-local IPv6 addresses and Unique Local Addresses.
#    The reason for this difference is that these addresses are never
#    NATed while IPv4 site-local addresses most probably are.  Given
#    the precedence of IPv6 over IPv4 (see below) on machines having only
#    site-local IPv4 and IPv6 addresses a lookup for a global address would
#    see the IPv6 be preferred.  The result is a long delay because the
#    site-local IPv6 addresses cannot be used while the IPv4 address is
#    (at least for the foreseeable future) NATed.  We also treat Teredo
#    tunnels special.
#
# precedence  <mask>   <value>
#    Add another rule to the RFC 3484 precedence table.  See section 2.1
#    and 10.3 in RFC 3484.  The default is:
#
precedence  ::1/128       50
precedence  ::/0          40
precedence  2002::/16     30
precedence ::/96          20
precedence ::ffff:0:0/96  10
#
#    For sites which prefer IPv4 connections change the last line to
#
#precedence ::ffff:0:0/96  100

#
# scopev4  <mask>  <value>
#    Add another rule to the RFC 3484 scope table for IPv4 addresses.
#    By default the scope IDs described in section 3.2 in RFC 3484 are
#    used.  Changing these defaults should hardly ever be necessary.
#    The defaults are equivalent to:
#
scopev4 ::ffff:169.254.0.0/112  2
scopev4 ::ffff:127.0.0.0/104    2
scopev4 ::ffff:10.0.0.0/104     5
scopev4 ::ffff:172.16.0.0/108   5
scopev4 ::ffff:192.168.0.0/112  5
scopev4 ::ffff:0.0.0.0/96       14

Reply via email to