This article was updated, and the issue seems solved. Please look at the last paragraph before adding comments.
Exim has the habit of trying to find out about its host names and IP addresses when it starts up. This has, in the past, been an issue for the Debian packages, since a Debian system might be on a dial-on-demand modem line with expensive costs and thus should not do unnecessary DNS lookup when the MTA is started.
This article tries to describe the issue and which countermeasures debian took, and asks for tips how to solve this in the case of IPv6, where our past measures unfortunately do not directly apply.
I'd like to solicit opinions from people who are more experienced than me with Unix, the local resolver library including /etc/hosts and /etc/nsswitch.conf, DNS, and - especially - the customs that apply on a system running IPv6.
To avoid the extra DNS lookups, the Exim packages have a Debconf option to configure exim for "minimal DNS usage", which hardcodes the hostname into Exim's configuration at package configuration time. This was necessary since - without this option - exim looks up its own host name in the DNS even when a completely local operation is invoked.
In some cases, exim still looks up its IP address when a listening daemon starts up. This is why the Debian installer configures 127.0.1.1 (_not_ 127.0.0.1) for the local hostname on installation, yielding /etc/hosts files like
127.0.0.1 localhost 127.0.1.1 myfoo.localdomain myfoo # The following lines are desirable for IPv6 capable hosts ::1 ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters ff02::3 ip6-allhosts
However, in the last few weeks I have heard a few cases where exim does IPv6 AAAA lookups when a listening daemon starts up. An strace shows a gethostbyname2 call for AF_INET6, and if we want to continue the line we went in the past, we'd need an IPv6 address for myfoo.localdomain in /etc/hosts as well.
I am now wondering how this could be implemented. In IPv4, we have 127.0.0.0/8 available for the local host and could arbitrarily choose 127.0.1.1 to configure the local host name on. In IPv6, there is only ::1, which is a single address. Would it be possible to choose an arbitrary "link local" address on lo, the loopback interface? Or is there any better way?
This being said, I consider the entire 127.0.1.1 business a horrible hack which is one of the most ugly things I have ever seen. Do we have a chance to implement this in a more cleaner way, or is it still the way to go for the distribution, where we don't know zilch about the environment where an installed system is going to be used?
This issue leads to people adding their local host name to ::1 in /etc/hosts, which might re-introduce other issues that we experienced in a phase when we did the same for 127.0.0.1, eventually ending up with 127.0.1.1, or to disabling IPv6 altogether, which is a bad thing in a time where IPv6 should be enabled, not disabled. So I'd like to find a clean solution which could then be implemented in whatever part of Debian might be responsible.
I tried asking this question in other places, including Usenet, before pestering my Blog to ask the Lazyweb, but obviously the people I asked before do not care for the special environment that a Linux distribution has to take care of. The only answers I got were like "that would be the local administrator's task to fix" and "this should be taken care of in the local DNS server/setup (maybe even on the local box being installed)". A quite frustrating experience.
The issue seems solved. To avoid the extra DNS lookups, the Debian Exim packages have a Debconf option to configure exim for "minimal DNS usage", which hardcodes the hostname into Exim's configuration at package configuration time. This - silently - doesn't happen if hostname --fqdn does not return a fully qualified name (#476249).
I am inclined to solve this issue by having update-exim4.conf print a warning if hostname --fqdn does only return a single-component name and leave the rest to the local admin.