Przesłanianie niektórych wpisów DNS w BIND dla sieci wewnętrznych

39

Mam sieć wewnętrzną z serwerem DNS z systemem BIND, połączonym z Internetem za pomocą pojedynczej bramy. Moja domena „example.com” jest zarządzana przez zewnętrznego dostawcę DNS. Niektóre wpisy w tej domenie, np. „Host1.przyklad.com” i „host2.przyklad.com”, a także wpis najwyższego poziomu „przyklad.com” wskazują na publiczny adres IP bramy.

Chciałbym, aby hosty znajdujące się w sieci wewnętrznej rozdzieliły „host1.przyklad.com”, „host2.przyklad.com” i „przyklad.com” na wewnętrzne adresy IP zamiast adresu bramy. Inne hosty, takie jak „otherhost.example.com”, powinny być nadal rozwiązywane przez zewnętrznego dostawcę DNS.

Udało mi się to zrobić dla wpisów host1 i host2, definiując dwie strefy pojedynczego wejścia w BIND dla „host1.przyklad.com” i „host2.przyklad.com”. Jeśli jednak dodam strefę dla „example.com”, wszystkie zapytania dotyczące tej domeny są rozwiązywane przez mój lokalny serwer DNS, a np. Zapytanie „otherhost.example.com” powoduje błąd.

Czy można skonfigurować BIND w taki sposób, aby przesłonił tylko niektóre wpisy domeny, a resztę rozwiązać rekurencyjnie?

Remy Blank
źródło
Podobne pytanie: serverfault.com/questions/8694/…
MikeyB
1
„Czy można skonfigurować BIND, aby zastępował tylko niektóre wpisy domeny?” Nie, nie z BIND. Użyj subdomeny.
bortzmeyer
1
Wydaje się, że niezwiązany robi dokładnie to, o co prosiłem, dlatego ustawiam odpowiedź Alnitaka jako odpowiedź zaakceptowaną. Ale w końcu posłucham rady bortzmeyera i nie zastąpię wpisu domeny. Dzięki za wszystkie odpowiedzi!
Remy Blank,
1
Bind może teraz to zrobić ze strefą polityki odpowiedzi. Zobacz moją odpowiedź poniżej. Inne rozwiązania, takie jak Bez ograniczeń, nie mogą zastąpić CNAME. Dzięki strefom zasad w Bind nie musisz robić subdomen; możesz dowolnie zastępować poszczególne rekordy.
Florin Andrei,

Odpowiedzi:

18

Najlepszą metodą jest strefa polityki odpowiedzi w Powiązaniu 9.8.1 lub nowszym. Pozwala zastąpić pojedyncze rekordy w dowolnych strefach (i nie ma potrzeby tworzenia do tego całej subdomeny, tylko pojedynczy rekord, który chcesz zmienić), pozwala zastąpić CNAME itp. Inne rozwiązania, takie jak Bez ograniczeń, nie mogą zastąpić CNAME .

https://www.redpill-linpro.com/sysadvent/2015/12/08/dns-rpz.html


EDYCJA: Zróbmy to odpowiednio. Udokumentuję to, co zrobiłem na podstawie samouczka połączonego powyżej.

Mój system operacyjny to Raspbian 4.4 dla Raspberry Pi, ale technika ta powinna działać bez żadnych zmian w Debianie i Ubuntu lub z minimalnymi zmianami na innych platformach.

Przejdź do miejsca, w którym przechowywane są pliki konfiguracyjne Bind w systemie - tutaj /etc/bind. Utwórz tam plik db.rpzo następującej treści:

$TTL 60
@            IN    SOA  localhost. root.localhost.  (
                          2015112501   ; serial
                          1h           ; refresh
                          30m          ; retry
                          1w           ; expiry
                          30m)         ; minimum
                   IN     NS    localhost.

localhost       A   127.0.0.1

www.some-website.com    A        127.0.0.1

www.other-website.com   CNAME    fake-hostname.com.

Co to robi?

  • zastępuje adres IP www.some-website.comfałszywym adresem 127.0.0.1, skutecznie wysyłając cały ruch dla tej witryny na adres pętli zwrotnej
  • wysyła ruch www.other-website.comdo innej witryny o nazwiefake-hostname.com

Wszystko, co może znaleźć się w pliku strefy Bind, możesz użyć tutaj.

Aby aktywować te zmiany, musisz wykonać jeszcze kilka czynności:

Edytuj named.conf.locali dodaj tę sekcję:

zone "rpz" {
  type master;
  file "/etc/bind/db.rpz";
};

Powyższy samouczek mówi o dodawaniu kolejnych elementów, zone "rpz" { }ale nie jest to konieczne w prostych konfiguracjach - to, co pokazałem tutaj, jest minimum, aby działało na lokalnym tłumaczu.

Edytuj named.conf.optionsi gdzieś w options { }sekcji dodaj response-policyopcję:

options {
  // bunch
  // of
  // stuff
  // please
  // ignore

  response-policy { zone "rpz"; };
}

Teraz uruchom ponownie Powiązanie:

service bind9 restart

Otóż ​​to. Serwer nazw powinien teraz zacząć zastępować te rekordy.

Jeśli chcesz wprowadzić zmiany, po prostu edytuj db.rpz, a następnie ponownie uruchom Powiązanie.

Bonus: jeśli chcesz zalogować zapytania DNS do syslog, abyś mógł obserwować przebieg postępowania, edytować named.conf.locali upewnić się, że jest loggingsekcja zawierająca te instrukcje:

logging {
    // stuff
    // already
    // there

    channel my_syslog {
        syslog daemon;
        severity info;
    };
    category queries { my_syslog; };
};

Uruchom ponownie Bind ponownie i to wszystko.

Przetestuj na maszynie z uruchomionym programem Bind:

dig @127.0.0.1 www.other-website.com. any

Jeśli uruchomisz kopanie na innym komputerze, po prostu użyj @ the-ip-address-of-Bind-server zamiast @ 127.0.0.1

Z powodzeniem zastosowałem tę technikę, aby zastąpić CNAME dla witryny, nad którą pracowałem, wysyłając ją do nowego modułu równoważenia obciążenia AWS, który właśnie testowałem. Do uruchomienia Binda wykorzystano Raspberry Pi, a RPi skonfigurowano również do działania jako router Wi-Fi - więc podłączając urządzenia do SSID działającego na RPi, otrzymałem przesłonięcia DNS potrzebne do testowania.

Florin Andrei
źródło
1
Należy pamiętać, że BIND RPZ nie może (jeszcze) nadpisać pojedynczych rekordów na podstawie QTYPE - zastąpi wszystkie rekordy dla konkretnej nazwy właściciela. Oznacza to, że jeśli chcesz zastąpić rekord A dla domeny, ale nie np. Rekord MX, nie możesz. Musisz także umieścić rekord MX w strefie RPZ i zsynchronizować go z rzeczywistą strefą.
Alnitak,
2
Dzięki za załamanie tego jak ty. Bardzo pomocny.
sruffell,
Czy są jakieś zastrzeżenia? Próbuję to zrobić na pfsense, ale nie mogę „sfałszować” żadnych wyników, nadal podaje prawdziwy adres. Wydaje mi się, że postępowałem zgodnie z instrukcjami zawartymi w liście.
Lenne,
@ Lenne To powinno po prostu działać. Zredagowałem post i dodałem propozycję przetestowania zmian.
Florin Andrei
@ Lenne Pakiet pfSense BIND ma to wbudowane w GUI od około roku, więc tłumienie konfiguracji nie powinno być konieczne. OP: warto wspomnieć o innych rzeczach, które możesz zrobić z RPZ, takich jak odpowiadanie za pomocą NXDOMAIN lub po prostu rezygnacja z odpowiedzi.
miken32
21

Ograniczeń rekurencyjne serwer DNS ma możliwości pominięcia indywidualnych rekordów zasobów.

Sprawdź ustawienia local-zonei local-datakonfigurację w instrukcji , np .:

local-zone: "example.com." transparent
local-data: "foo.example.com. IN A 192.168.1.1"

transparentUstawienie na local-zonepowiada to zrobić normalne wyszukiwań rekurencyjnych żadnych nazw nie zasilanych local-data.

Alnitak
źródło
1
Wygląda na to, co chcę robić, dzięki. Przeczytam dziś w Unbound.
Remy Blank
Z drugiej strony jego mądrość jest dość wątpliwa. Posiadanie domeny internal.example.com byłoby bardziej przejrzyste.
bortzmeyer
@Bortzmeyer - możesz mieć rację, ale nie sądzę, aby Wouter wprowadził to dla zabawy ;-)
Alnitak
3
@bortzmeyer, czasami nie ma wyboru. Przykład: SBS 2008 musi mieć pojedynczy adres IP sieci LAN, ale musi być dostępny z zewnątrz za pomocą zewnętrznego adresu IP, który router przekazuje. Microsoft nie zezwala na dwie karty sieciowe w SBS, ani dwa IP skonfigurowane na tej samej karcie. Jeśli lokalne serwery rozpoznają nazwę DNS na zewnętrzny adres IP, router musi wykonać zarówno DNAT, jak i SNAT dla adresów IP LAN, a następnie dzienniki w SBS pokażą cały dostęp z adresu IP routera, i to po prostu źle. Zainstaluję unboundna własnym routerze, myślę, że rozwiązanie jest znacznie lepsze.
Cosmin Prund
To nie odpowiada na pytanie, ponieważ pytanie jest specyficzne dla BIND.
bzeaman
4

Możesz zajrzeć do „dnsmasq”, który pozwala ci robić całkiem sprytne rzeczy z ulepszaniem rozdzielczości.

Łukasz
źródło
Dzięki, dobra wskazówka. Szkoda, że ​​dnsmasq nie rozwiązuje problemu rekurencyjnie, więc nadal będę musiał uruchamiać BIND na innym porcie (serwery DNS mojego ISP są płatne).
Remy Blank
4

To, czego szukasz, to podzielony DNS, który jest zdefiniowany przez Webopedia jako:

W podzielonej infrastrukturze DNS tworzysz dwie strefy dla tej samej domeny, z których jedna ma być używana przez sieć wewnętrzną, a druga przez sieć zewnętrzną. Split DNS kieruje hosty wewnętrzne do wewnętrznego serwera nazw domenowych w celu rozpoznawania nazw, a hosty zewnętrzne są kierowane do zewnętrznego serwera nazw domenowych w celu rozpoznawania nazw.

Zasadniczo musisz wykonać kopię pliku strefy zewnętrznej i podprzeć go na wewnętrznym serwerze DNS, a następnie zmienić lub dodać rekordy potrzebne specjalnie dla sieci wewnętrznej. Jest to dość powszechna konfiguracja, chociaż synchronizacja „zewnętrznych” rekordów między dwoma serwerami DNS może być utrudniona. Jeśli utworzysz lub zmienisz rekord na serwerze publicznym, należy go również utworzyć lub zmienić na serwerze prywatnym.

Można to zaimplementować niezależnie od używanej implementacji serwera DNS. W większości konfiguracji będziesz mieć jeden serwer DNS, który obsługuje sieć zewnętrzną, i inny, który obsługuje sieć wewnętrzną. Dzięki BIND, podobnie jak innym implementacjom, możesz mieć obie wersje strefy na tym samym serwerze, korzystając z instrukcji „allow-query” w sekcji strefy pliku named.conf.

Inną możliwością na BIND (i nigdy tego nie próbowałem) byłoby ustawienie domeny example.com na wewnętrznym serwerze DNS przy użyciu tylko tych rekordów, których używasz wewnętrznie. Następnie ustaw instrukcję „forward” za pomocą argumentu „first” (w połączeniu z „forwarders”). Teoretycznie poprosiłoby to zewnętrzny serwer DNS (zgodnie z ustawieniami „forwarderów” o odpowiedź, która nie miałaby twoich wewnętrznych rekordów i nie zwróciłaby odpowiedzi na błąd. Następnie serwer wewnętrzny szukałby odpowiedzi. Nie pewnie, czy to zadziała, ale to myśl.

Justin Scott
źródło
Synchronizacja dwóch plików strefy będzie skomplikowana, ponieważ plik zewnętrzny jest aktualizowany za pomocą dynamicznego klienta DNS. Przeczytam jednak oświadczenie forward. Dzięki za wskazówkę.
Remy Blank
Nie, przekazywanie BIND nie będzie działać, będzie dotyczyło tylko nieznanych domen, ale wewnętrzny serwer nazw będzie wiedział o example.com, będzie dla niego autorytatywny.
bortzmeyer
1
Jeśli poprawnie czytam dokumentację, instrukcja „najpierw przekaż dalej” w sekcji strefy powinna poinformować BIND, aby wyszedł i szukał odpowiedzi w forwarderze nawet dla autorytatywnej domeny lokalnej, a następnie użyj informacji lokalnych tylko wtedy, gdy może „ uzyskać odpowiedź od spedytora.
Justin Scott
Jeśli umieścisz globalne „najpierw na przód”, wyśle ​​zapytania do usługi przesyłania dalej, a jeśli nie otrzyma odpowiedzi, spróbuje odpowiedzieć na zapytanie (z dokumentu), ale jeśli otrzyma odpowiedź, nie spróbuje się rozwiązać. Byłoby wspaniale, gdybyś mógł wymusić rozstrzygnięcie, jeśli odpowiedź nie jest autorytatywna lub nawet jeśli jest to NXDOMAIN, ale bind nie spróbuje, jeśli otrzyma odpowiedź od usługi przesyłania dalej.
Pablo Martinez
3

W BIND dochodzę do tych wyników, definiując strefę przy użyciu żądanej nazwy hosta. Podejście jest w porządku, jeśli chcesz zastąpić tylko kilka hostów.

Moja deklaracja strefy wygląda następująco:

zone "override.example.com" {
        type master;
        notify no;
        file "zone-config/override.example.com";
};

Moja definicja strefy wygląda następująco:

$TTL 4H
@       IN      SOA     ns.override.example.com.    root.override.example.com. (
                        2009072215      ; Serial
                        3600            ; Refresh
                        600             ; Retry
                        604800          ; Expire
                        3600    )       ; Minimum
;
                NS      ns
        IN      NS      ns.override.example.com.
        IN      A       192.168.1.100
ns      IN      A       192.168.1.100

Jeśli więc zapytam example.com w intranetowym DNS i ISP DNS, otrzymam ten sam adres IP, ale jeśli zapytam override.example.com, otrzymam różne wyniki, jeśli intranetowy DNS (podstawowy) jest dostępny.

srdjan
źródło
2

Jesteś już na dobrej drodze.

Na wewnętrznych serwerach DNS musisz zdefiniować strefę dla każdego hosta wyjątku znajdującego się bezpośrednio pod „example.com”. Aby zminimalizować te wyjątki, powszechną praktyką jest nazywanie wszystkich komputerów wewnętrznych „hosta.internal.example.com”, przy czym serwer DNS wysyła większość zapytań do zewnętrznych serwerów DNS, ale autorytatywny dla strefy „internal.example.com”. (Po przejściu drobnych operacji zwykle jest kilka serwerów DNS, do których kierowani są klienci, i osobny autorytatywny DNS, do którego kierowane są te serwery dla „internal.example.com”).

Zwykle tworzone są wyjątki, które opisujesz, tylko wtedy, gdy host musi być osiągalny zarówno zewnętrznie, jak i wewnętrznie. Nawet wtedy możesz użyć „host1.example.com” z zewnątrz i „host1.internal.example.com” od wewnątrz. Hosty wewnętrzne są konfigurowane w taki sposób, aby wyszukiwały nazwy w „internal.example.com”. Są sytuacje, w których to, co już robisz, jest odpowiednie, na przykład jeśli certyfikat serwera identyfikuje serwer jako „host1.przyklad.com”, w którym to przypadku chcesz, aby była to nazwa, z którą łączą się klienci.


źródło
Tak, w przypadku hostów „host1.przyklad.com” już działa dobrze. Trudna część polega na obsłudze „przykład.com” najwyższego poziomu w ten sam sposób ...
Remy Blank
2

Korzystanie z dnsmasq sprawia, że ​​jest to naprawdę łatwe. http://www.thekelleys.org.uk/dnsmasq/doc.html Działa jak serwer dns, ale otrzymuje odpowiedzi z lokalnego serwera dns. Fajną rzeczą jest to, że możesz zastąpić rekordy jednej domeny bez bałagania przy użyciu plików strefy


źródło
2

W rzeczywistości istnieje inny, choć może nieco inny sposób, aby to zrobić. Mam tę samą sytuację, mam domenę, która jest używana zewnętrznie i wewnętrznie, i mam zewnętrzne hosty statyczne i dynamiczne. Jedynymi naprawdę bolesnymi są zewnętrzne dynamiczne. Rozwiązanie może nie jest najbardziej eleganckie, ale możliwe do wdrożenia za pomocą małego skryptu. Przeważnie robię własny skrypt dynamicznego DNS z interfejsem API mojego dynamicznego dostawcy DNS, uruchamiam ten skrypt cron, co 5 minut:

1) Uzyskaj mój zewnętrzny adres IP. czy to się zmieniło? brak wyjścia.

2) zmieniono adres IP, wywołano interfejs API dostawcy dyndns, z nowym adresem IP,

3) sed db.mydomain.com z zewnętrznym adresem IP

4) uruchom ponownie wiązanie.

Działa bardzo niezawodnie w mojej sieci domowej

Nico
źródło
Ten sam proces został przeze mnie wykonany. szczegółowe informacje znajdują się na naszej wiki Stealth Name Server . Ale nie można rozwiązać dyn.dev.shahed.bizz całego świata! Czy mógłbyś pomóc nam rozwiązać ten problem?
Md Shahed Hossain