Linux: Block IPv6 for certain applications / hostnames

Solution 1:

You can control address selection with /etc/gai.conf. The configuration file is well documented, and already contains the defaults, so you can just begin tweaking.

The interesting defaults here are:

label  ::1/128       0
label  ::/0          1
label  2002::/16     2
label ::/96          3
label ::ffff:0:0/96  4
precedence  ::1/128       50
precedence  ::/0          40
precedence  2002::/16     30
precedence ::/96          20
precedence ::ffff:0:0/96  10

The last line gives the lowest preference to all IPv4 addresses.

If you want to give a higher preference to all IPv4, you could change it to:

precedence ::ffff:0:0/96  100

If you only wanted to give higher preference to specific IPv4 addresses or blocks, you can specify them as well. Remember that you have to use an IPv4-mapped IPv6 in hex.

So, to give preference to 203.0.113.0/24 over all IPv6, you would add:

label ::ffff:cb00:7100/120 5
precedence ::ffff:cb00:7100/120 100

Restart running applications to have them pick up changes you make.


On Debian derived systems, /etc/gai.conf is already present. On Red Hat derived systems, it is absent, but a sample file is located at /usr/share/doc/glibc-common-*/gai.conf; just copy it to /etc.

Solution 2:

OK, here's a completely different answer.

Place the offending hosts with crappy IPv6 connectivity in /etc/hosts with their corresponding IPv4 address.

For example:

199.7.53.74 whois.verisign-grs.com

Remember to remove them when their (in this case) or your IPv6 connectivity improves.