Buộc chuyển tiếp yêu cầu DNS sang chế độ TCP


9

Tôi đã thiết lập máy chủ DNS trên SLES10 (hiện đang liên kết 9.6) trên máy chủ đa homed. Máy chủ này có thể được truy vấn từ tất cả các mạng nội bộ và đưa ra câu trả lời cho tất cả các mạng nội bộ. Chúng tôi có hai vùng "chính" DNS riêng biệt. Mỗi khu vực này đang được phục vụ bởi một số máy chủ Windows-DNS có thẩm quyền.

Bây giờ máy chủ linux của tôi là máy chủ DNS thứ cấp cho một trong những vùng này (vùng bên trong riêng) và đóng vai trò là người chuyển tiếp cho vùng khác (vùng bên trong công cộng).

Cho đến gần đây thiết lập này hoạt động mà không có vấn đề. Bây giờ tôi nhận được - khi truy vấn vùng bên trong công cộng (ví dụ: bằng hostlệnh trên máy khách linux) thông báo lỗi

;; Cắt ngắn, thử lại trong chế độ TCP

một wireshark-dump đã tiết lộ nguyên nhân của việc này: Truy vấn đầu tiên xuất hiện ở chế độ UDP, câu trả lời không phù hợp với UDP (do danh sách dài của NS có thẩm quyền), sau đó nó được thử lại trong chế độ TCP, đưa ra câu trả lời đúng.

Bây giờ câu hỏi: Tôi có thể định cấu hình liên kết của mình để truy vấn các bộ chuyển tiếp trong chế độ TCP mà không cần thử UDP trước không?

Cập nhật: Thử sức với ASCII-art ...

+--------------+   +--------------+   +-----------------+
| W2K8R2 DNS   |   | SLES 10 DNS  |   | W2K8R2 DNS      |
| Zone private +---+ All internal +---+ Zone public     |
| internal 2x  |   |   Zones      |   | internal 30+ x  |
+--------------+   +-+----------+-+   +-----------------+
                     |          |
                  +--+---+   +--+---+
                  |Client|   |Client|
                  +------+   +------+

một sơ đồ nhỏ về điều này sẽ hữu ích - Tôi đang vật lộn để tìm ra máy chủ nào từ mô tả của bạn.
Alnitak

tốt hơn một chút, mặc dù vẫn chưa rõ chính xác máy chủ nào bạn đang chạy hostlệnh này và truy vấn nào đang được gửi.
Alnitak

Các khách hàng yêu cầu thông qua SLES10 các mục từ khu vực công cộng nội bộ. Khu vực riêng tư nội bộ không bị ảnh hưởng - vì chỉ có 2 mục NS ở đó.
Nils

và khách hàng chỉ là người giải quyết sơ khai?
Alnitak

đề nghị bạn thêm minimal-responses: yesvào cấu hình BIND trên SLES 10 - nó có thể làm giảm kích thước phản hồi. Trong mọi trường hợp, hầu hết các truy vấn bình thường sẽ không vượt quá giới hạn 512 byte.
Alnitak

Câu trả lời:


8

Đầu tiên, tôi sẽ không gọi đó là một lỗi, chỉ là một tin nhắn thông tin.

Thứ hai, các máy chủ DNS sẽ luôn trả lời các truy vấn UDP (ít nhất là BIND, tôi không thể tìm thấy các tùy chọn để vô hiệu hóa UDP) và các máy khách sẽ luôn luôn cố gắng gửi một truy vấn UDP trước tiên (ví dụ: không có tùy chọn nào trong phân giải để thay đổi điều đó cũng không phải trong JVM) - nếu chúng phù hợp với gói UDP (yêu cầu thường làm)

Nếu bạn có trường hợp sử dụng cụ thể, bạn có thể chỉ định sử dụng TCP, ví dụ: trong tập lệnh shell sử dụng 'dig + tcp' hoặc 'host -T' để giải quyết và bạn có thể sử dụng các cuộc gọi hệ thống 'sethostent / gethostbyname / endhostent' (xem man trang) để buộc TCP trong các trường hợp khác.

Nếu bạn thực sự muốn thử và chặn UDP, tùy chọn duy nhất tôi có thể thấy là với quy tắc không thể xóa được, nhưng tôi không chắc chắn rằng thiết lập đó sẽ hoạt động. Tôi hy vọng rằng độ phân giải DNS sẽ không thành công.


trên danh nghĩa có một lợi ích hiệu suất từ ​​việc biết một tiên nghiệm rằng truy vấn UDP sẽ thất bại và thử qua TCP trước. Xem RFC 5966 cho một số thảo luận về điều đó.
Alnitak

@Alnitak và tôi muốn nhận được lợi ích đó.
Nils

1
@ Vì vậy, chúng ta cần tìm hiểu tại sao EDNS dường như không hoạt động ...
Alnitak

Tôi không có trường hợp sử dụng đặc biệt - khách hàng sẽ sử dụng thư viện trình phân giải của họ - nhưng mỗi yêu cầu và mỗi câu trả lời sẽ đi qua mạng hai lần - tôi không thích điều đó.
Nils

@Nils, vấn đề là máy khách quyết định UDP / TCP, nhưng máy chủ biết kích thước của câu trả lời.
Dan Andreatta

4

Máy chủ BIND của bạn nên sử dụng EDNS (xem RFC 2671) để cho phép các gói UDP dài hơn 512 byte.

options {
    edns-udp-size 4096;
    max-udp-size 4096;
};

Điều này sẽ cho phép bộ NS lớn của bạn được truy xuất qua UDP, mà không yêu cầu chi phí kết nối TCP cho các truy vấn nhỏ khác.

Tuy nhiên, lưu ý rằng đây thực sự là các giá trị mặc định. Nếu EDNS không được sử dụng, có thứ gì đó đang chặn hoặc máy chủ nhận các tùy chọn EDNS không hỗ trợ.

Ngoài ra, lưu ý rằng hostkhông hỗ trợ EDNS. Hoàn toàn có thể là người chuyển tiếp của bạn -> truy vấn máy chủ đã sử dụng EDNS và bạn không thể thấy điều đó khi bạn thử với máy khách cục bộ của mình.

Hãy thử dig +bufsize=4096 @server hostname Athay vì sử dụng host.


Ai nên sử dụng cái này? Có thể cả máy chủ và giao nhận của tôi từ khu vực "nội bộ công cộng"?
Nils

Ý nghĩa của việc gửi danh sách đầy đủ của NS trong câu trả lời là gì?
Nils

@Nils giao thức DNS yêu cầu bộ hoàn chỉnh khớp với cùng một bộ dữ liệu (QNAME, QTYPE và QCLASS) không thể chia tách (còn gọi là "RRset")
Alnitak

bạn có thể vui lòng chỉ cho tôi đến RFC liên quan đến RRset này không?
Nils

1
Máy chủ Actaully sử dụng thư viện trình phân giải tiêu chuẩn và trên máy trạm của tôi, nó hỗ trợ EDNS0. Để kiểm tra xem các yêu cầu có chỉ định EDNS0 hay không, hãy chạy 'tcpdump -x port 53' và kết xuất hex phải chứa (về cuối, trong phần bổ sung) chuỗi 0029 1000 0000 8000 0000, là biểu diễn nhị phân của OPT RR.
Dan Andreatta
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.