it-swarm-vi.tech

Ghi đè một số mục DNS trong BIND cho mạng nội bộ

Tôi có một mạng nội bộ với máy chủ DNS chạy BIND, được kết nối với internet thông qua một cổng duy nhất. Tên miền của tôi "example.com" được quản lý bởi nhà cung cấp DNS bên ngoài. Một số mục trong tên miền đó, nói "Host1.example.com" và "Host2.example.com", cũng như mục nhập cấp cao nhất "example.com", trỏ đến địa chỉ IP công cộng của cổng.

Tôi muốn các máy chủ được đặt trên mạng nội bộ giải quyết "Host1.example.com", "Host2.example.com" và "example.com" thành các địa chỉ IP nội bộ thay vì địa chỉ của cổng. Các máy chủ khác như "otherhost.example.com" vẫn phải được giải quyết bởi nhà cung cấp DNS bên ngoài.

Tôi đã thành công trong việc thực hiện điều đó cho các mục nhập Host1 và Host2, bằng cách xác định hai vùng nhập đơn trong BIND cho "Host1.example.com" và "Host2.example.com". Tuy nhiên, nếu tôi thêm một vùng cho "example.com", tất cả các truy vấn cho tên miền đó sẽ được giải quyết bởi máy chủ DNS cục bộ của tôi và ví dụ: truy vấn "otherhost.example.com" dẫn đến lỗi.

Có thể định cấu hình BIND để ghi đè chỉ một số mục nhập của tên miền và để giải quyết phần còn lại theo cách đệ quy?

41
Remy Blank

Phương pháp tốt nhất là thông qua vùng chính sách phản hồi trong Bind 9.8.1 hoặc mới hơn. Nó cho phép bạn ghi đè các bản ghi đơn lẻ trong các vùng tùy ý (và không cần tạo toàn bộ tên miền phụ cho nó, chỉ bản ghi duy nhất bạn muốn thay đổi), nó cho phép bạn ghi đè CNAME, v.v. .

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


EDIT: Hãy làm điều này đúng cách sau đó. Tôi sẽ ghi lại những gì tôi đã làm dựa trên hướng dẫn được liên kết ở trên.

Hệ điều hành của tôi là Raspbian 4.4 cho Raspberry Pi, nhưng kỹ thuật này sẽ hoạt động mà không có bất kỳ thay đổi nào trên Debian và Ubuntu hoặc với các thay đổi tối thiểu trên các nền tảng khác.

Đi đến nơi lưu tập tin cấu hình Bind của bạn trên hệ thống của bạn - ở đây là trong /etc/bind. Tạo trong đó một tệp có tên db.rpz với các nội dung sau:

$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.

Nó làm gì?

  • nó ghi đè địa chỉ IP cho www.some-website.com với địa chỉ giả 127.0.0.1, có hiệu quả gửi tất cả lưu lượng truy cập cho trang web đó đến địa chỉ loopback
  • nó gửi lưu lượng cho www.other-website.com đến một trang web khác gọi là fake-hostname.com

Bất cứ điều gì có thể đi trong tệp vùng Bind bạn có thể sử dụng ở đây.

Để kích hoạt những thay đổi này, có một vài bước nữa:

Biên tập named.conf.local và thêm phần này:

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

Hướng dẫn được liên kết ở trên cho bạn biết thêm nhiều thứ vào zone "rpz" { } nhưng điều đó không cần thiết trong các thiết lập đơn giản - những gì tôi đã trình bày ở đây là mức tối thiểu để làm cho nó hoạt động trên trình phân giải cục bộ của bạn.

Biên tập named.conf.options và một nơi nào đó trong options { } phần thêm response-policy Lựa chọn:

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

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

Bây giờ khởi động lại Bind:

service bind9 restart

Đó là nó. Máy chủ tên nên bắt đầu ghi đè những hồ sơ đó ngay bây giờ.

Nếu bạn cần thay đổi, chỉ cần chỉnh sửa db.rpz, sau đó khởi động lại Bind một lần nữa.

Phần thưởng: nếu bạn muốn đăng nhập các truy vấn DNS vào syslog, để bạn có thể theo dõi quá trình tố tụng, hãy chỉnh sửa named.conf.local và đảm bảo có phần logging bao gồm các câu lệnh sau:

logging {
    // stuff
    // already
    // there

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

Khởi động lại Bind một lần nữa và đó là nó.

Kiểm tra nó trên máy chạy Bind:

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

Nếu bạn chạy Dig trên một máy khác, chỉ cần sử dụng @ the-ip-address-of-Bind-server thay vì @ 127.0.0.1

Tôi đã sử dụng kỹ thuật này rất thành công để ghi đè CNAME cho trang web tôi đang làm việc, gửi nó đến bộ cân bằng tải AWS mới mà tôi mới thử nghiệm. Một Raspberry Pi đã được sử dụng để chạy Bind và RPi cũng được cấu hình để hoạt động như một bộ định tuyến WiFi - vì vậy bằng cách kết nối các thiết bị với SSID chạy trên RPi, tôi sẽ nhận được DNS ghi đè tôi cần để kiểm tra.

19
Florin Andrei

Máy chủ DNS đệ quy Không ràng buộc có khả năng ghi đè các bản ghi tài nguyên riêng lẻ.

Nhìn vào local-zonelocal-data cài đặt cấu hình trong thủ công , ví dụ:

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

Cài đặt transparent trên local-zone bảo nó thực hiện tra cứu đệ quy bình thường cho bất kỳ tên nào không được cung cấp với local-data.

21
Alnitak

Bạn có thể muốn xem xét "dnsmasq", cho phép bạn thực hiện một số điều khá thông minh với độ phân giải điều chỉnh.

4
Luke

Thứ bạn đang tìm kiếm là DNS phân tách, được xác định bởi Webopedia là:

Trong cơ sở hạ tầng DNS phân tách, bạn tạo hai vùng cho cùng một miền, một vùng được sử dụng bởi mạng bên trong, vùng kia được sử dụng bởi mạng bên ngoài. Split DNS chỉ đạo các máy chủ nội bộ đến một máy chủ tên miền nội bộ để phân giải tên và các máy chủ bên ngoài được hướng đến một máy chủ tên miền bên ngoài để phân giải tên.

Về cơ bản, bạn sẽ cần tạo một bản sao của tệp vùng bên ngoài và sao lưu nó trên máy chủ DNS nội bộ của bạn, sau đó thay đổi hoặc thêm các bản ghi cần thiết cho mạng nội bộ của bạn. Đây là một thiết lập khá phổ biến, mặc dù có thể gây khó khăn khi giữ các bản ghi "bên ngoài" được đồng bộ hóa giữa hai máy chủ DNS. Nếu bạn tạo hoặc thay đổi bản ghi trên máy chủ công cộng, nó cũng sẽ cần được tạo hoặc thay đổi trên máy chủ riêng.

Điều này có thể được thực hiện bất kể bạn sử dụng máy chủ DNS nào. Trong hầu hết các thiết lập, bạn sẽ có một máy chủ DNS phục vụ mạng bên ngoài và một máy chủ khác phục vụ mạng nội bộ. Với BIND, cũng như các triển khai khác, bạn có thể có cả hai phiên bản của vùng trên cùng một máy chủ thông qua việc sử dụng câu lệnh "cho phép truy vấn" trong phần vùng của tệp có tên.

Một khả năng khác trên BIND (và tôi chưa bao giờ thử điều này) sẽ là đặt tên miền example.com của bạn trên máy chủ DNS nội bộ chỉ với các bản ghi bạn sử dụng nội bộ. Sau đó, đặt câu lệnh "chuyển tiếp" với đối số "đầu tiên" (kết hợp với "chuyển tiếp"). Về lý thuyết, điều này sẽ yêu cầu máy chủ DNS bên ngoài (như được đặt trong "giao nhận" để trả lời, sẽ không có hồ sơ nội bộ của bạn và trả về phản hồi thất bại. Sau đó, máy chủ nội bộ sẽ tự xem xét câu trả lời. chắc chắn nếu điều đó sẽ làm việc, nhưng đó là một suy nghĩ.

4
Justin Scott

Trong BIND tôi nhận được kết quả này bằng cách xác định vùng sử dụng tên Máy chủ mong muốn. Cách tiếp cận là tốt nếu bạn chỉ muốn ghi đè một vài máy chủ.

Tuyên bố khu vực của tôi trông như thế này:

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

Định nghĩa vùng của tôi trông như thế này:

$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

Vì vậy, nếu tôi truy vấn example.com trên DNS mạng nội bộ và DNS ISP thì tôi nhận được cùng một IP nhưng nếu tôi truy vấn override.example.com tôi sẽ nhận được các kết quả khác nhau nếu DNS mạng nội bộ (chính) có thể truy cập được.

3
srdjan

Sử dụng dnsmasq làm cho nó thực sự dễ dàng. http://www.thekelleys.org.uk/dnsmasq/doc.html Hoạt động như máy chủ dns nhưng nhận được câu trả lời từ máy chủ dns cục bộ. Điều tuyệt vời là bạn có thể ghi đè các bản ghi tên miền đơn mà không làm hỏng các tệp vùng

2
Dustin

Như một vấn đề của thực tế, có một cách khác, ngay cả khi có lẽ hơi khác, cách để làm điều này. Tôi có cùng một tình huống, tôi có một miền được sử dụng bên ngoài và bên trong, và tôi có các máy chủ tĩnh và động bên ngoài. Những người thực sự đau đớn duy nhất là những người năng động bên ngoài. Giải pháp có thể không phải là thanh lịch nhất, nhưng có thể thực hiện được với một tập lệnh nhỏ. Hầu như tôi đang thực hiện tập lệnh DNS động của riêng mình với API của nhà cung cấp DNS động của tôi, tôi chạy tập lệnh này bằng cron, cứ sau 5 phút:

1) nhận IP bên ngoài của tôi. nó đã thay đổi? không lối thoát.

2) thay đổi IP, gọi API của nhà cung cấp dyndns, với địa chỉ IP mới,

3) quyến rũ db.mydomain.com bằng IP bên ngoài

4) khởi động lại liên kết.

Hoạt động rất đáng tin cậy cho mạng gia đình của tôi

2
nico

Bạn đã đi đúng hướng.

Trên các máy chủ DNS nội bộ của bạn, bạn sẽ cần xác định một vùng cho mọi Máy chủ ngoại lệ ngay bên dưới "example.com". Để giảm thiểu các ngoại lệ này, thông thường đặt tên cho tất cả các máy nội bộ là "hosta.i INTERNal.example.com", với máy chủ DNS gửi hầu hết các truy vấn đến các máy chủ DNS bên ngoài, nhưng có thẩm quyền cho vùng "Internal.example.com". (Khi bạn vượt qua một hoạt động nhỏ, thường có một vài máy chủ DNS mà khách hàng được hướng đến và một DNS có thẩm quyền riêng biệt mà các máy chủ đó được hướng đến cho "Internal.example.com".)

Thông thường, chỉ khi có thể truy cập Máy chủ cả bên ngoài và bên trong thì các ngoại lệ bạn mô tả mới được tạo. Thậm chí sau đó, bạn có thể muốn sử dụng "Host1.example.com" từ bên ngoài và "Host1.i INTERNal.example.com" từ bên trong. Máy chủ nội bộ được cấu hình để tìm tên trong "Internal.example.com". Có những tình huống mà những gì bạn đang làm là phù hợp, chẳng hạn như nếu chứng chỉ cho máy chủ xác định máy chủ là "Host1.example.com", trong trường hợp bạn muốn đó là tên mà máy khách kết nối.

2
Stephen P. Schaefer