... per compensare i server DNS rotti che sono al di fuori del nostro controllo.
Il nostro problema: implementiamo dispositivi incorporati che raccolgono dati dei sensori in vari siti, principalmente solo IPv4. Alcuni siti hanno reti scarsamente gestite, ad esempio cache DNS e / o firewall non configurati correttamente o altrimenti non funzionanti che ignorano del tutto le query AAAA o rispondono con risposte errate (ad es. IP sorgente errato!). Come fornitore esterno del dipartimento delle strutture, non abbiamo quasi alcuna influenza sui dipartimenti IT (a volte riluttanti). Le possibilità che correggano i loro server DNS / firewall in qualsiasi momento presto sono minuscole.
L'effetto sul nostro dispositivo è che con ogni gethostbyname (), i processi devono attendere fino al timeout delle query AAAA, a quel punto alcuni processi hanno già scaduto del tutto i loro tentativi di connessione.
Sto cercando soluzioni che siano ...
- a livello di sistema. Non riesco a riconfigurare decine di applicazioni individualmente
- non permanente e configurabile. Dobbiamo (ri) abilitare IPv6 dove / quando viene riparato / implementato. Il riavvio è OK.
- Se una soluzione richiede la sostituzione di una libreria principale come glibc, il pacchetto della libreria sostitutiva dovrebbe essere disponibile da un repository ben noto (ad esempio Debian Testing, Ubuntu universe, EPEL). L'auto-costruzione non è un'opzione per così tanti motivi che non so nemmeno da dove cominciare, quindi non li elenco affatto ...
La soluzione più ovvia sarebbe quella di configurare la libreria del resolver, ad esempio tramite / etc / { resolv , nsswitch , gai } .conf per non interrogare i record AAAA. Un'opzione resolv.conf no-inet6
come suggerito qui sarebbe esattamente quello che sto cercando. Purtroppo non è implementato, almeno non sui nostri sistemi (libc6-2.13-38 + deb7u4 su Debian 7; libc6-2.19-0ubuntu6.3 su Ubuntu 14.04)
Allora come? Si trovano i seguenti metodi suggeriti su SF e altrove, ma non di loro funzionano:
- Disabilitare del tutto IPv6, ad esempio inserendo nella blacklist ipv6 LKM in /etc/modprobe.d/, oppure
sysctl -w net.ipv6.conf.all.disable_ipv6=1
. ( Per curiosità: perché il risolutore chiede AAAA in cui IPv6 è disabilitato? ) - Rimozione
options inet6
da /etc/resolv.conf. In primo luogo non era lì,inet6
è semplicemente abilitato per impostazione predefinita in questi giorni. - Impostazione
options single-request
in /etc/resolv.conf. Ciò garantisce solo che le query A e AAAA vengano eseguite in sequenza anziché in parallelo - Modifica
precedence
in /etc/gai.conf. Ciò non influisce sulle query DNS, ma solo sul modo in cui vengono elaborate più risposte. - L'uso di resolver esterni (o l'esecuzione di un demone resolver locale che elude i server DNS rotti) sarebbe di aiuto, ma di solito non è consentito dalle politiche del firewall dell'azienda. E può rendere inaccessibili le risorse interne.
Idee brutte alternative:
- Esegui una cache DNS su localhost. Configuralo per inoltrare tutte le query non AAAA, ma per rispondere alle query AAAA con NOERROR o NXDOMAIN (a seconda del risultato della query A corrispondente). Non sono a conoscenza di una cache DNS in grado di farlo però.
- Usa una corrispondenza ip32 intelligente u32 o il modulo DNS iptables di Ondrej Caletka per abbinare le query AAAA, al fine di rifiutarle icmp (come reagirebbe la lib risolutore a quella?) O reindirizzarle a un server DNS locale che risponde a tutto con un NOERROR vuoto.
Si noti che ci sono domande simili e correlate su SE. La mia domanda differisce in quanto elabora il problema reale che sto cercando di risolvere, in quanto elenca i requisiti espliciti, in quanto elenca alcune soluzioni non funzionanti spesso suggerite e poiché non è specifico per una singola applicazione. A seguito di questa discussione , ho pubblicato la mia domanda.