... aby zrekompensować uszkodzenie uszkodzonych serwerów DNS, które są poza naszą kontrolą.
Nasz problem: wdrażamy urządzenia osadzone, które zbierają dane z czujników w różnych witrynach, głównie IPv4. Niektóre witryny mają źle utrzymywane sieci, np. Źle skonfigurowane lub w inny sposób uszkodzone pamięci podręczne DNS i / lub zapory ogniowe, które albo całkowicie ignorują zapytania AAAA, albo odpowiadają na nie zepsutymi odpowiedziami (np. Błędne IP źródłowe!). Jako zewnętrzny dostawca działu obiektów nie mamy prawie żadnego wpływu na (czasem niechętne) działy IT. Szanse na naprawienie serwerów DNS / zapór ogniowych w najbliższym czasie są znikome.
Wpływ na nasze urządzenie jest taki, że przy każdym gethostbyname () procesy muszą czekać, aż upłynie limit czasu zapytań AAAA, w którym to momencie niektóre procesy już całkowicie przekroczyły limit czasu prób połączenia.
Szukam rozwiązań, które są ...
- w całym systemie. Nie mogę indywidualnie konfigurować dziesiątek aplikacji
- niestałe i konfigurowalne. Musimy (ponownie) włączyć IPv6, gdzie / kiedy zostanie naprawiony / wdrożony. Ponowne uruchomienie jest w porządku.
- Jeśli rozwiązanie wymaga zastąpienia biblioteki podstawowej, takiej jak glibc, pakiet biblioteki zastępczej powinien być dostępny z dobrze znanego repozytorium (np. Debian Testing, Ubuntu Universe, EPEL). Samodzielne budowanie nie jest opcją z tak wielu powodów, że nawet nie wiem od czego zacząć, więc po prostu ich nie wymieniam ...
Najbardziej oczywistym rozwiązaniem byłoby skonfigurowanie biblioteki resolvera, np. Przez / etc / { resolv , nsswitch , gai } .conf, aby nie wyszukiwała rekordów AAAA. no-inet6
Sugerowana tutaj opcja resolv.conf byłaby dokładnie tym , czego szukam. Niestety nie jest zaimplementowany, przynajmniej nie w naszych systemach (libc6-2.13-38 + deb7u4 w Debian 7; libc6-2.19-0ubuntu6.3 w Ubuntu 14.04)
Jak więc? Można znaleźć następujące metody sugerowane na SF i gdzie indziej, ale żadna z nich nie działa:
- Całkowite wyłączenie IPv6, np. Przez umieszczenie na czarnej liście LKM ipv6 w /etc/modprobe.d/ lub
sysctl -w net.ipv6.conf.all.disable_ipv6=1
. ( Z ciekawości: Dlaczego resolver prosi o AAAA, gdy IPv6 jest wyłączony? ) - Usuwanie
options inet6
z /etc/resolv.conf. Po pierwsze, nie było go, obecnieinet6
jest po prostu domyślnie włączone. - Ustawienie
options single-request
w /etc/resolv.conf. Zapewnia to tylko, że zapytania A i AAAA są wykonywane sekwencyjnie, a nie równolegle - Zmiana
precedence
w /etc/gai.conf. Nie wpływa to na zapytania DNS, a jedynie na sposób przetwarzania wielu odpowiedzi. - Korzystanie z zewnętrznych programów tłumaczących (lub uruchamianie lokalnego demona tłumaczącego, który omija uszkodzone serwery DNS) pomógłby, ale zwykle jest to zabronione przez zasady zapory firmy. I może uniemożliwić dostęp do zasobów wewnętrznych.
Alternatywne brzydkie pomysły:
- Uruchom pamięć podręczną DNS na localhost. Skonfiguruj go, aby przekazywał wszystkie zapytania inne niż AAAA, ale odpowiadał na zapytania AAAA za pomocą NOERROR lub NXDOMAIN (w zależności od wyniku odpowiedniego zapytania A). Nie znam jednak pamięci podręcznej DNS, która mogłaby to zrobić.
- Użyj sprytnego dopasowania u32 iptables lub modułu DNS iptables Ondreja Caletki, aby dopasować zapytania AAAA, w celu ich odrzucenia przez icmp (jak zareaguje na to biblioteka tłumacząca?) Lub przekierowania ich na lokalny serwer DNS, który odpowiada na wszystko z pustym NOERROR.
Zauważ, że podobne pytania dotyczą SE. Moje pytanie różni się tym, że opisuje rzeczywisty problem, który próbuję rozwiązać, ponieważ zawiera wyraźne wymagania, ponieważ zawiera listę często sugerowanych niedziałających rozwiązań i nie jest specyficzny dla pojedynczej aplikacji. Po tej dyskusji opublikowałem swoje pytanie.