24 September 2012

Preferring IPv4 over IPv6.

As more and more hosts are moving over to IPv6, you might encounter DNS A records with IPv6 entries.
That's all fine and dandy and I do realize the need for an extended IP address pool, but if it's starting to affect performance I say fuck IPv6.
Sadly, modern GNU/Linux systems prefer IPv6 addresses over IPv4 when being presented with a choice. I honestly don't see why the fuck IPv6 should be preferred right now as it's bound to be a lot slower on a lot of networks, for the time being at least.
Case in point: Debian's apt-get update over IPv4 and IPv6:

root@box:~# host security.debian.org
security.debian.org has address 195.20.242.89
security.debian.org has address 212.211.132.32
security.debian.org has address 212.211.132.250
security.debian.org has IPv6 address 2001:a78:5:1:216:35ff:fe7f:6ceb
security.debian.org has IPv6 address 2001:8d8:580:400:6564:a62:0:2
security.debian.org has IPv6 address 2001:a78:5:0:216:35ff:fe7f:be4f
security.debian.org mail is handled by 10 chopin.debian.org.

IPv6:
root@box:~# time apt-get update
[...]
real    1m18.222s
user    0m7.472s
sys     0m6.948s
IPv4:
root@box:~# time apt-get update
[...]
real    0m13.481s
user    0m7.728s
sys     0m5.332s
We could just add static ipv4 lines in /etc/hosts, but that's kinda defeating the purpose as we don't want to disable IPv6 altogether.
So, how do we tell the system to prefer IPv4 addresses over IPv6?
It's rather simple, actually: we need to have a look at getaddrinfo(3)'s configuration file; /etc/gai.conf.
Locate this line and uncomment it:
#precedence ::ffff:0:0/96  100
There ya go, IPv4 is preferred now.
This works as that's the special address range to help in the transition from 4 to 6; every IPv4 address can be written as an IPv6 one using that form.
Anyways, the format is ::ffff:0:0/96 which means that the ipv4 ip address 192.168.18.234/32 will be written as 0:0:ffff:192.168.18.234/128 and will match that line in gai.conf.