Skonfigurowałem serwer DNS na SLES10 (obecnie powiązanie 9.6) na serwerze multi-homed. Na ten serwer można wysyłać zapytania ze wszystkich sieci wewnętrznych i zapewnia odpowiedzi dla wszystkich sieci wewnętrznych. Mamy dwie oddzielne strefy „master” DNS. Każda z tych stref obsługiwana jest przez wiele autorytatywnych serwerów Windows-DNS.
Teraz mój serwer linux jest drugorzędnym serwerem DNS dla jednej z tych stref (prywatna strefa wewnętrzna) i działa jako forwarder dla drugiej strefy (publiczna strefa wewnętrzna).
Do niedawna ta konfiguracja działała bez problemów. Teraz dostaję - po zapytaniu publicznej strefy wewnętrznej (np. Przez host
polecenie klienta Linuksa) komunikat o błędzie
;; Obcięty, ponawianie próby w trybie TCP
zrzut wireshark ujawnił przyczynę tego: Pierwsze zapytanie wychodzi w trybie UDP, odpowiedź nie pasuje do UDP (z powodu długiej listy autorytatywnych NS), a następnie jest ponawiana w trybie TCP, dostarczając poprawną odpowiedź.
Teraz pytanie: czy mogę skonfigurować moje wiązanie, aby przeszukiwało forwardery w trybie TCP bez uprzedniej próby UDP?
Aktualizacja: Próbuję swoich sił w ASCII-art ...
+--------------+ +--------------+ +-----------------+
| W2K8R2 DNS | | SLES 10 DNS | | W2K8R2 DNS |
| Zone private +---+ All internal +---+ Zone public |
| internal 2x | | Zones | | internal 30+ x |
+--------------+ +-+----------+-+ +-----------------+
| |
+--+---+ +--+---+
|Client| |Client|
+------+ +------+
host
polecenie, a tym, jakie zapytanie jest wysyłane.minimal-responses: yes
do konfiguracji BIND na SLES 10 - może to zmniejszyć rozmiary odpowiedzi. W każdym razie większość normalnych zapytań nie przekroczy limitu 512 bajtów.Odpowiedzi:
Po pierwsze, nie nazwałbym tego błędem, a jedynie komunikatem informacyjnym.
Po drugie, serwery DNS zawsze odpowiedzą na zapytania UDP (przynajmniej BIND, nie mogę znaleźć opcji wyłączenia UDP), a klienci zawsze (?) Spróbują najpierw wysłać zapytanie UDP (na przykład w resolv.conf nie ma opcji, aby to zmienić ani w JVM) - jeśli mieszczą się w pakiecie UDP (zazwyczaj żądania)
Jeśli masz konkretny przypadek użycia, możesz określić użycie TCP, np. W skrypcie powłoki użyj „dig + tcp” lub „host -T” do rozstrzygania, a także możesz używać wywołań systemowych „sethostent / gethostbyname / endhostent” (patrz man strona), aby wymusić TCP w innych przypadkach.
Jeśli naprawdę chcesz spróbować zablokować UDP, jedyną dostępną opcją jest reguła iptable, ale nie jestem pewien, czy ta konfiguracja zadziałałaby. Spodziewam się, że rozpoznawanie DNS po prostu się nie powiedzie.
źródło
Twój serwer BIND powinien używać EDNS (patrz RFC 2671), aby zezwolić na pakiety UDP dłuższe niż 512 bajtów.
Powinno to pozwolić na odzyskanie dużego zestawu NS przez UDP, bez wymagania narzutu połączenia TCP w przypadku innych mniejszych zapytań.
Należy jednak pamiętać, że w rzeczywistości są to wartości domyślne. Jeśli EDNS nie jest używany, coś go blokuje lub serwery odbierające opcje EDNS nie obsługują tego.
Pamiętaj też, że
host
nie obsługuje EDNS. Jest całkiem możliwe, że twoje zapytania -> zapytania serwera już korzystają z EDNS i po prostu nie widzisz tego, gdy próbujesz z lokalnym klientem.Spróbuj
dig +bufsize=4096 @server hostname A
zamiast używaćhost
.źródło