... Để bù đắp cho các máy chủ DNS bị hỏng nằm ngoài tầm kiểm soát của chúng tôi.
Vấn đề của chúng tôi: Chúng tôi triển khai các thiết bị nhúng thu thập dữ liệu cảm biến tại các trang web khác nhau, chủ yếu là IPv4. Một số trang web có mạng được bảo trì kém, ví dụ như bộ nhớ cache DNS bị hỏng hoặc / hoặc tường lửa bị hỏng hoàn toàn bỏ qua các truy vấn AAAA hoặc trả lời chúng với các phản hồi bị hỏng (ví dụ IP sai nguồn!). Là một nhà cung cấp bên ngoài cho bộ phận cơ sở, chúng tôi không có ảnh hưởng gì đến các bộ phận CNTT (đôi khi miễn cưỡng). Cơ hội để họ sửa chữa máy chủ / tường lửa DNS của họ bất cứ lúc nào sớm là rất nhỏ.
Ảnh hưởng trên thiết bị của chúng tôi là với mỗi gethostbyname (), các quy trình phải đợi cho đến khi hết thời gian truy vấn AAAA, tại thời điểm đó, một số quy trình đã hết thời gian thử kết nối của chúng.
Tôi đang tìm giải pháp ...
- toàn hệ thống. Tôi không thể cấu hình lại hàng tá ứng dụng riêng lẻ
- không cố định và cấu hình. Chúng tôi cần (bật lại) bật IPv6 trong đó / khi nó được sửa / triển khai. Khởi động lại là OK.
- Nếu một giải pháp yêu cầu một thư viện lõi như glibc phải được thay thế, gói thư viện thay thế sẽ có sẵn từ một kho lưu trữ được bảo trì tốt (ví dụ: Thử nghiệm Debian, vũ trụ Ubuntu, EPEL). Tự xây dựng không phải là một lựa chọn vì rất nhiều lý do mà tôi thậm chí không biết bắt đầu từ đâu, vì vậy tôi hoàn toàn không liệt kê chúng ...
Giải pháp rõ ràng nhất sẽ là cấu hình thư viện trình phân giải, ví dụ: via / etc / { decv , nsswitch , gai } .conf để không truy vấn các bản ghi AAAA. Một tùy chọn độ phân giải no-inet6
như được đề xuất ở đây sẽ chính xác là những gì tôi đang tìm kiếm. Thật không may, nó không được triển khai, ít nhất là không phải trên các hệ thống của chúng tôi (libc6-2.13-38 + deb7u4 trên Debian 7; libc6-2.19-0ubfox6.3 trên Ubuntu 14.04)
Vậy thì thế nào? Người ta tìm thấy các phương pháp sau được đề xuất trên SF và các nơi khác, nhưng không phải phương pháp nào cũng hoạt động:
- Vô hiệu hóa IPv6 hoàn toàn, ví dụ: bằng cách liệt kê danh sách đen ipv6 LKM trong /etc/modprobe.d/ hoặc
sysctl -w net.ipv6.conf.all.disable_ipv6=1
. ( Vì tò mò: Tại sao trình giải quyết yêu cầu AAAA nơi IPv6 bị vô hiệu hóa? ) - Xóa
options inet6
khỏi /etc/resolv.conf. Nó không ở đó ngay từ đầu,inet6
chỉ đơn giản là được bật theo mặc định những ngày này. - Đặt
options single-request
trong /etc/resolv.conf. Điều này chỉ đảm bảo rằng các truy vấn A và AAAA được thực hiện tuần tự chứ không phải song song - Thay đổi
precedence
trong /etc/gai.conf. Điều đó không ảnh hưởng đến các truy vấn DNS, chỉ cách xử lý nhiều câu trả lời. - Sử dụng các trình phân giải bên ngoài (hoặc chạy trình nền trình phân giải cục bộ phá vỡ các máy chủ DNS bị hỏng) sẽ giúp ích, nhưng thường không được phép bởi các chính sách tường lửa của công ty. Và nó có thể làm cho tài nguyên nội bộ không thể truy cập.
Ý tưởng xấu xí khác:
- Chạy bộ đệm DNS trên localhost. Định cấu hình nó để chuyển tiếp tất cả các truy vấn không phải AAAA, nhưng để trả lời các truy vấn AAAA bằng NOERROR hoặc NXDOMAIN (tùy thuộc vào kết quả của truy vấn A tương ứng). Tôi không biết bộ đệm DNS có thể làm điều này mặc dù.
- Sử dụng một số kết hợp iptables u32 thông minh hoặc mô-đun DNS iptables của Ondrej Caletka để khớp với các truy vấn AAAA, để từ chối icmp (cách trình phân giải lib phản ứng với điều đó?) Hoặc chuyển hướng chúng đến máy chủ DNS cục bộ phản hồi tất cả mọi thứ với một NOERROR trống.
Lưu ý rằng có những câu hỏi tương tự, liên quan đến SE. Câu hỏi của tôi khác nhau khi nó giải quyết vấn đề thực tế mà tôi đang cố gắng giải quyết, vì nó liệt kê các yêu cầu rõ ràng, vì nó liệt kê một số giải pháp không hoạt động thường được đề xuất và vì nó không dành riêng cho một ứng dụng. Sau cuộc thảo luận này , tôi đã đăng câu hỏi của mình.