AAAA aramaları nasıl devre dışı bırakılır?


35

... kontrolümüz dışındaki kırık DNS sunucularını telafi etmek için.

Sorunumuz: Sensör verilerini toplayan yerleşik cihazları, çoğunlukla IPv4'e özgü çeşitli sitelerde kullanıyoruz. Bazı siteler, hatalı yapılandırılmış veya başka türlü AAAA sorgularını tamamen görmezden gelen veya bunlara bozuk yanıtlarla cevap veren DNS önbellekleri ve / veya güvenlik duvarları gibi zayıf bakım ağlarına sahiptir (örneğin hatalı kaynak IP!). Tesisler departmanına harici bir tedarikçi olarak, (bazen isteksiz) BT departmanları üzerinde hiçbir etkimiz yoktur. DNS sunucularını / güvenlik duvarlarını yakın zamanda tamir etme şansları çok azdır.

Cihazımızdaki etki, her gethostbyname () işlevinde, AAAA'nın zaman aşımına uğraması için bazı süreçlerin tamamen bağlantı kurma girişimlerini zaman aşımına uğratması için süreçlerin beklemesi gerektiğidir.

Çözümler arıyorum ...

  • geniş sistem. Düzinelerce uygulamayı tek tek yeniden yapılandıramıyorum
  • kalıcı değildir ve yapılandırılabilir. IPv6'yı nerede / ne zaman sabitlenir / çıkarılırsa (yeniden) etkinleştirmemiz gerekir. Yeniden başlatma tamam.
  • Bir çözümün değiştirilmesi için glibc gibi bir çekirdek kitaplık gerekiyorsa, yeni kitaplık paketi iyi bilinen bir depodan (örneğin Debian Testing, Ubuntu universe, EPEL) temin edilebilir olmalıdır. Kendi kendini inşa etmek, nereden başlayacağımı bile bilmediğim birçok nedenden ötürü bir seçenek değildir, bu yüzden onları hiç listelemiyorum ...

En belirgin çözüm, çözücü kütüphanesini örneğin / etc / { resolv , nsswitch , gai } .conf aracılığıyla AAAA kayıtlarını sorgulamayacak şekilde yapılandırmak olacaktır . Bir resolv.conf seçeneği no-inet6önerildiği gibi burada olacağını tam olarak ben ne arıyorum. Ne yazık ki uygulanmadı, en azından bizim sistemimizde değil (libian-6-2.13-38 + Debian 7'deki deb7u4; libc6-2.19-0ubuntu6.3 - Ubuntu 14.04)

Nasıl o zaman? Biri SF ve başka yerlerde önerilen aşağıdaki yöntemleri bulur, ancak bunların hiçbiri işe yaramaz:

  • /Etc/modprobe.d/ içinde IPv6 LKM kara listeye alarak, tamamen örneğin IPv6 devre dışı bırakılması veya sysctl -w net.ipv6.conf.all.disable_ipv6=1. ( Merak etme: Çözücü neden IPv6'nın devre dışı bırakıldığı AAAA'yı istiyor? )
  • /Etc/resolv.conf options inet6dosyasından kaldırılıyor . İlk etapta yoktu, inet6bugünlerde varsayılan olarak etkindir.
  • options single-request/Etc/resolv.conf dosyasında ayarlama . Bu, yalnızca A ve AAAA sorgularının paralel değil sırayla yapılmasını sağlar
  • Değişen precedence/etc/gai.conf hedefine içinde. Bu, DNS sorgularını etkilemez, yalnızca birden fazla yanıtın nasıl işlendiğini gösterir.
  • Dış çözümleyicileri kullanmak (veya bozuk DNS sunucularını çevreleyen yerel bir çözümleyici arka plan programı çalıştırmak) yardımcı olacaktır, ancak genellikle şirketin güvenlik duvarı ilkeleri tarafından engellenir. Ve iç kaynaklara erişilemez hale getirebilir.

Alternatif çirkin fikirler:

  • Localhost'ta bir DNS önbelleği çalıştırın. AAAA olmayan tüm sorguları iletmek için yapılandırın, ancak NOERROR veya NXDOMAIN ile AAAA sorgularına yanıt verecek şekilde (ilgili A-sorgusunun sonucuna bağlı olarak) yapılandırın. Ancak bunu yapabilen bir DNS önbelleğinin farkında değilim.
  • İc32 ile reddetmek (ya da çözümleyici libu buna nasıl tepki verir?) Ya da bunları yanıtlayan yerel bir DNS sunucusuna yönlendirmek için AAAA sorgularıyla eşleştirmek için bazı akıllı iptables u32 eşleşmesini ya da Ondrej Caletka'nın iptables DNS modülünü kullanın. boş bir NOERROR olan her şey.

SE ile ilgili benzer soruların olduğunu unutmayın. Benim sorunum, çözülmesi gereken asıl problemi ayrıntılandırdığı sürece, açıkça öne sürülen gereklilikleri listelediğinden, sıklıkla önerilmeyen çalışma dışı çözümleri kara listeye aldığından ve tek bir uygulamaya özgü olmadığı için farklıdır. Bu tartışmanın ardından sorumu yayınladım.


13
Not: Buradaki SF hakkındaki popüler inancın aksine, DNS'nin çalıştığı yerlerde bile, yalnızca IPv4 ağındaki bir makinedeki IPv6 / AAAA'yı devre dışı bırakmak için bazı iyi nedenler vardır: Yayın yükünü azaltın; DNS çözücülerindeki yükü neredeyse% 50 azaltın; Bağlantı başlatma zamanlarını azaltın (önemli ölçüde DNS önbelleklerinin geciktiği yerlerde); Güvenliği ve kararlılığı artırmak için işlevsel olmayan özellikleri devre dışı bırakmak için en iyi uygulamaları izleyin. Kuşkusuz, IPv6'yı kullanıma sunulduktan sonra yeniden etkinleştirmeyi unutursam, sistemim IPv6 piyasaya sürülmesini engelleyen IPv4 eski balastı olur. Listelenen artıları bu konuyla karşılaştırabilmeli.
Nils Toedtmann

Localhost'ta tam bir çözümleyici çalıştırmamanın bir nedeni var mı? Bu şekilde, diğer kişilerin (görünüşte) güvenilmez DNS çözücülerine olan bağımlılığı tamamen ortadan kaldırırsınız.
Sander Steffann

@SanderSteffann Şirket güvenlik duvarı politikaları genellikle buna izin vermez. Ama başka bir yerde bu bir seçenek. Soruma daha sonra ekleyeceğim.
Nils Toedtmann

3
@joeqwerty IPv6'nın sitede desteklenip desteklenmediğine dair herhangi bir varsayımda bulunmuyoruz. Varsayım, DNS sunucularının standart uyumlu olmasına rağmen yapıyoruz. Ayrıca, bazı BT departmanları maalesef bunu düzgün bir altyapıyı yapılandırmak için beceri eksikliği. Bu konuda künt olduğum için üzgünüm.
Nils Toedtmann

4
Ne dediğini anlıyorum. Kutunuzu ağ üzerinden başka bir yerde değil, ağda çalıştırmanız gerekir. BT alanındaki müşterilerimizi suçladığımızda ve onlara saygı göstermediğimde biraz kafam karışıyor. Onlar bizim ekmek ve tereyağımız. İyi ya da kötü için buna saygı duymalı ve onlara saygı duymalıyız. Müşterilerimiz işimize engel değil, işimizin sebebi.
joeqwerty

Yanıtlar:


9

Kullanmayı kes gethostbyname(). Onun getaddrinfo()yerine kullanıyor olmalısın ve yıllardır olmalıydı. Man sayfa bile sizi bu konuda uyarır.

Gethostbyname * (), gethostbyaddr * (), herror () ve hstrerror () işlevleri eskidir. Uygulamalar bunun yerine getaddrinfo (3), getnameinfo (3) ve gai_strerror (3) kullanmalıdır.

İşte C'de bir isim için sadece A kayıtlarını ve sadece A kayıt aramalarının ağ üzerinden geçtiğini gösteren bir Wireshark yakalamasını gösteren hızlı bir örnek program .

Özellikle, sete ihtiyaç ai_familyiçin AF_INETsadece yapılan bir kayıt aramalarını istiyorum. Bu örnek program yalnızca döndürülen IP adreslerini yazdırır. getaddrinfo()Giden bağlantıların nasıl yapıldığına dair daha ayrıntılı bir örnek için kılavuz sayfasına bakın .

In Wireshark yakalama , 172.25.50.3 yerel DNS çözümleyici olduğu; yakalama orada yapıldı, bu yüzden onun giden sorgularını ve yanıtlarını da görüyorsunuz. O Not sadece bir A kaydı talep edildi. AAAA araması hiç yapılmadı.

#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <stdlib.h>
#include <netdb.h>
#include <stdio.h>

int main(void) {
    struct addrinfo hints;
    struct addrinfo *result, *rp;
    int s;
    char host[256];

    memset(&hints, 0, sizeof(struct addrinfo));
    hints.ai_family = AF_INET;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_protocol = 0;

    s = getaddrinfo("www.facebook.com", NULL, &hints, &result);
    if (s != 0) {
        fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(s));
        exit(EXIT_FAILURE);
    }

    for (rp = result; rp != NULL; rp = rp->ai_next) {
        getnameinfo(rp->ai_addr, rp->ai_addrlen, host, sizeof(host), NULL, 0, NI_NUMERICHOST);
        printf("%s\n", host);
    }
    freeaddrinfo(result);
}

İlginç! Hangi uygulamaların AAAA isteklerini tetiklediğini araştıracağım. Eğer sadece bizimse, önerinizi devlerimize iletirim. Ancak Debian / Ubuntu paketlenmiş birçok yazılımın bundan muzdarip olduğu ve bunlara yama yapmayacağımıza dair güçlü bir fikrim var.
Nils Toedtmann

Başvurunuz muhtemelen en önemlisidir. Her şeyi düzeltemezseniz bile, durumu iyileştirebilir.
Michael Hampton

4

Şüphe durumunda, kaynak koduna geçin! Öyleyse görelim ... gethostbyname () ilginç görünüyor; Bu, tam olarak ne gördüğümüzü açıklar: önce IPv6'yı deneyin, sonra istediğiniz bir yanıt alamazsanız IPv4'e geri dönün. Bu RES_USE_INET6bayrak ne ? Geri izleme, res_setoptions () ' dan geliyor . Burası resolv.confokunduğu yer.

Ve .... bu benim fikrim dışı. İçinde RES_USE_INET6değilse, nasıl ayarlandığını tamamen belirsizim resolv.conf.


RES_USE_INET6 edebilir aracılığıyla set olmak options inet6içinde resolv.conf. Benim sorun olamaz sanırım unset tüm büyük dağıtımlar bu günlerde öyle görünüyor ki, derleme zamanında ortaya çıkmasını takiben (doğru?). Bu nedenle bunun için özellik isteği options no_inet6yukarıda belirtilen.
Nils Toedtmann

1
Ne yazık ki, koddan görebileceğiniz gibi, içinde bir no_inet6seçenek görünmüyor res_setoptions(). Ancak, (no) 'dan görebileceğiniz gibi ip6-dotint, eklemek kolay bir değişiklik. Sizin dağıtımın kullandığı varsayılan olarak set davranıyor bu teoriyi test etmek için, ben paket kaynak dosyalarını kapmak istiyorum ve eklemek sonra (paket davranışı çoğaltır onaylayın) "bakire" bir kez derlemek ve: { STRnLEN ("no-inet6"), 1, ~RES_USE_INET6 },için options[]dizinin ve görmek Bu seçeneği ayarladığınızda sorun gider resolv.conf.
BMDan

1
Son olarak: Neye mal olursa olsun, bunu localhost'ta bir DNS önbelleği çalıştırarak çözerdim (referans olarak yukarıda). Kendinize ait bir hack edilmiş DNS vekil / önbelleğini korumak, bir çekirdek sistem kütüphanesinin hacklenmiş bir versiyonunu korumaktan daha kolay olacaktır.
BMDan

3

BIND'yi yerel bir çözücü olarak kullanabilirsiniz, AAAA'yı filtrelemek için bir seçeneği vardır:

https://kb.isc.org/article/AA-00576/0/Filter-AAAA-option-in-BIND-9-.html


2
Gömülü bir cihaz için oldukça ağır.
Michael Hampton

Teşekkürler, Bind'in AAAA filtresinden haberdar değildim. Michael'ın belirttiği gibi, muhtemelen Bind'in geniş ayak izi nedeniyle bizim için bir çözüm değildir. Ancak diğer senaryolarda AAAA yanıtlarını filtrelemek isteyenler için uygun bir yol olabilir. Ubuntu aslında en azından 14.04 tarihinde "--enable-filter-aaaa" ile bağ kurar. Debian hakkında emin değilim. - Ayrıca bakınız ipamworldwide.blogspot.co.uk/2011/09/…
Nils Toedtmann

1
Ben 14.04 yaşıyorum ve bu filtreleme seçeneği kullanılabilir görünmüyor.
Zitrax

0

PDNS-recursor ayarını yapmayı denediniz, /etc/resolv.conf'nize yerleştirip "AAAA" aramalarını reddetmeyi denediniz mi? Gibi bir şey kullanarakquery-local-address6=


1
query-local-address6=farklı bir şey yapar (hangi IPv6 adresinin sorgu gönderileceğini - IPv6 devre dışı olsa bile, AAAA isteklerinin IPv4 aracılığıyla çözüleceğini unutmayın). Ayrıca AAAA sorgularını filtreleyecek başka bir ayar tanımlayamıyorum ( doc.powerdns.com/html/built-in-recursor.html ). Bu bilgiler olmadan, cevabınız çok yardımcı olmuyor :(
Nils Toedtmann
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.