Skip to contentSkip to conversation

New: IPv6's ipv4-compatibility addresses don't bind

Bugme-new Andrew Morton 2 participants 2 messages Apr 13, 2010 1 message not in the archive

Subsystems (2)
lore
Share & tools
lore

A message that is not in the archive (sent off-list or not yet received): [email protected]/

#1 lore raw

(switched to email. Please respond via emailed reply-to-all, not via the bugzilla web interface).

Quoted 3 lines · On Wed, 7 Apr 2010 23:17:32 GMT [email protected] wrote:

https://bugzilla.kernel.org/show_bug.cgi?id=15720

Summary: IPv6's ipv4-compatibility addresses don't bind

A 2.6.9 -> 2.6.32 regression ;)

Quoted 36 lines
           Product: Networking
           Version: 2.5
    Kernel Version: 2.6.32-2-686-bigmem
          Platform: All
        OS/Version: Linux
              Tree: Mainline
            Status: NEW
          Severity: normal
          Priority: P1
         Component: IPV6
        AssignedTo: [email protected]
        ReportedBy: [email protected]
        Regression: Yes

When attempting to bind to an address using ipv4-compatibility, for example, "::ffff:127.0.0.1", Linux refuses to bind to that address when /proc/sys/net/ipv6/bindv6only is set.

Yes, you could say "but you specifically told ipv6 to not bind to ipv4 addresses!" However, ::ffff:127.0.0.1 is *clearly* an ipv4 address, it's not an alternate representation of an ipv6 address, it's an ipv4 address and only ipv4.

This seems to not have been the case as of linux 2.6.9, although I'm not sure at what version this changed.

It seems to me that the intent of "bindv6only" was to not bind to the ipv4 address when you bind to all addresses (specifically ipv6 address "::"). So when you bind to ::, an ipv4 client connects to you, and it appears to be connecting from ::ffff:192.168.5.5. I don't think its intent was to effectively disable binding to ::ffff:x.x.x.x addresses - just breaking that feature makes no sense.

The Linux 2.6.9 approach seems to match MacOS's (and I'm pretty sure Solaris's, too).

#2 lore raw
Quoted 3 lines · Andrew Morton
Quoted 3 lines

When attempting to bind to an address using ipv4-compatibility, for example, "::ffff:127.0.0.1", Linux refuses to bind to that address when /proc/sys/net/ipv6/bindv6only is set.

This is actually not a (deprecated) IPv4-compatible IPv6 address (::127.0.0.1), but an IPv4-mapped IPv6 address.

Quoted 6 lines
Quoted 6 lines

It seems to me that the intent of "bindv6only" was to not bind to the ipv4 address when you bind to all addresses (specifically ipv6 address "::"). So when you bind to ::, an ipv4 client connects to you, and it appears to be connecting from ::ffff:192.168.5.5. I don't think its intent was to effectively disable binding to ::ffff:x.x.x.x addresses - just breaking that feature makes no sense.

It is documented in ip-sysctl.txt:

bindv6only - BOOLEAN
Default value for IPV6_V6ONLY socket option, which restricts use of the IPv6 socket to IPv6 communication only.
TRUE: disable IPv4-mapped address feature
FALSE: enable IPv4-mapped address feature

Default: FALSE (as specified in RFC2553bis)

-Brian