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


39

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 đó đượ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" sẽ xảy ra lỗi.

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



1
"Có thể định cấu hình BIND để ghi đè chỉ một số mục của tên miền không?" Không, không phải với BIND. Sử dụng một tên miền phụ.
bortzmeyer

1
Không ràng buộc dường như thực hiện chính xác những gì tôi yêu cầu, vì vậy tôi đặt câu trả lời của Alnitak là câu trả lời được chấp nhận. Nhưng cuối cùng, tôi sẽ làm theo lời khuyên của bortzmeyer và không ghi đè mục nhập tên miền. Cảm ơn vì tất cả những hồi đáp!
Remy Trống

1
Bind bây giờ có thể làm điều đó với vùng chính sách phản hồi. Xem câu trả lời của tôi dưới đây. Các giải pháp khác như Không giới hạn không thể ghi đè CNAME. Với các vùng chính sách trong Bind, bạn không phải thực hiện các tên miền phụ; bạn chỉ có thể ghi đè các hồ sơ cá nhân theo ý muốn.
Florin Andrei

Câu trả lời:


18

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 điều đó, 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à tập tin /etc/bind. Tạo trong đó một tệp được gọi db.rpzvới 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 www.some-website.combằng địa chỉ giả 127.0.0.1, gửi hiệu quả tất cả lưu lượng truy cập cho trang web đó đến địa chỉ loopback
  • nó gửi lưu lượng truy cập www.other-website.comđến một trang web khác đượ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:

Chỉnh sửa named.conf.localvà 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.

Chỉnh sửa named.conf.optionsvà một nơi nào đó trong options { }phần thêm response-policytùy 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 ghi nhật ký truy vấn DNS vào syslog, vì vậy bạn có thể theo dõi quá trình tố tụng, chỉnh sửa named.conf.localvà đảm bảo có một loggingphần bao gồm các tuyên bố 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 đào 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.


1
Xin lưu ý rằng BIND RPZ thực sự không thể (chưa) ghi đè các bản ghi đơn lẻ trên cơ sở QTYPE - nó sẽ ghi đè tất cả các bản ghi cho một tên chủ sở hữu cụ thể. Điều đó có nghĩa là nếu bạn muốn ghi đè bản ghi A cho một tên miền, nhưng không phải là bản ghi MX, bạn không thể. Bạn cũng phải đặt bản ghi MX vào vùng RPZ và giữ nó đồng bộ với vùng thực.
Alnitak

2
Cảm ơn vì đã phá vỡ điều này như bạn đã làm. Rất hữu ích.
sruffell

Có bất kỳ cảnh báo? Tôi đang cố gắng làm điều này trên một pfsense, nhưng tôi không thể "giả" bất kỳ kết quả nào, nó vẫn báo cáo địa chỉ thật. Tôi tin rằng tôi đã làm theo hướng dẫn của bức thư.
Lenne

@Lenne Nó chỉ nên hoạt động. Tôi đã chỉnh sửa bài đăng và thêm một đề xuất để kiểm tra các thay đổi.
Florin Andrei

@Lenne gói pfSense BIND đã tích hợp sẵn vào GUI trong khoảng một năm nay, vì vậy không cần thiết phải chỉnh sửa cấu hình. OP: có thể đáng để đề cập đến một số điều khác bạn có thể làm với RPZ, chẳng hạn như trả lời với NXDOMAIN hoặc chỉ bỏ phản hồi.
miken32

21

Các Unbound máy chủ DNS đệ quy có khả năng ghi đè lên bản ghi tài nguyên cá nhân.

Nhìn vào local-zonelocal-datacài đặt cấu hình trong hướng dẫn , ví dụ:

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

Các transparentthiết lập trên local-zonenói với nó để làm tra cứu đệ quy bình thường đối với bất kỳ tên không được cung cấp với local-data.


1
Có vẻ là chính xác những gì tôi muốn làm, cảm ơn. Tôi sẽ đọc lên trên Unbound tối nay.
Rémy trống

Mặt khác, sự khôn ngoan của nó là khá nghi vấn. Có một tên miền Internal.example.com sẽ rõ ràng hơn.
bortzmeyer

@Bortzmeyer - bạn có thể đúng, nhưng tôi không tưởng tượng Wouter đưa nó vào chỉ để giải trí ;-)
Alnitak

3
@bortzmeyer, đôi khi không có lựa chọn nào khác. Ví dụ: SBS 2008 phải có một IP LAN duy nhất, nhưng nó cần phải được tiếp cận từ bên ngoài bằng một IP bên ngoài mà bộ định tuyến đang chuyển tiếp. Microsoft không cho phép hai card mạng trên SBS, cũng như hai IP được cấu hình trên cùng một card. Nếu các máy chủ cục bộ phân giải tên DNS thành IP bên ngoài, thì bộ định tuyến cần thực hiện cả DNAT và SNAT cho ip LAN, và sau đó nhật ký trên SBS sẽ hiển thị tất cả quyền truy cập từ IP của bộ định tuyến và điều đó là sai. Tôi sẽ cài đặt unboundtrên bộ định tuyến của riêng mình, tôi nghĩ giải pháp tốt hơn nhiều.
Cosmin Prund

Điều này không trả lời câu hỏi, vì câu hỏi dành riêng cho BIND.
bzeaman

4

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 điều chỉnh độ phân giải.


Cảm ơn, mẹo tốt. Quá tệ dnsmasq không thực hiện độ phân giải đệ quy, vì vậy tôi vẫn sẽ phải chạy BIND trên một cổng khác cho điều đó (các máy chủ DNS của ISP của tôi không ổn định).
Remy Trống

4

Thứ bạn đang tìm kiếm là DNS tách, được Webopedia định nghĩa là:

Trong cơ sở hạ tầng DNS phân tách, bạn tạo hai vùng cho cùng một tên 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 "chuyển tiếp" để 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ĩ.


Giữ hai tệp vùng đồng bộ sẽ phức tạp, vì tệp bên ngoài được cập nhật thông qua máy khách DNS động. Tôi sẽ đọc lên các tuyên bố về phía trước, mặc dù. Cảm ơn vì tiền hỗ trợ.
Remy Trống

Không, chuyển tiếp BIND sẽ không hoạt động, nó sẽ chỉ dành cho các tên miền không xác định nhưng máy chủ tên nội bộ sẽ biết về example.com, nó sẽ có thẩm quyền cho nó.
bortzmeyer

1
Nếu tôi đang đọc tài liệu chính xác, câu lệnh "chuyển tiếp trước" trong phần khu vực sẽ yêu cầu BIND đi ra ngoài và tìm câu trả lời tại nhà giao nhận ngay cả đối với tên miền cục bộ có thẩm quyền, sau đó chỉ sử dụng thông tin cục bộ nếu có thể ' t nhận được câu trả lời từ người giao nhận.
Justin Scott

Nếu bạn đặt "chuyển tiếp trước" toàn cầu, nó sẽ gửi các truy vấn tới người chuyển tiếp và nếu không trả lời sẽ cố gắng trả lời truy vấn '(từ tài liệu) nhưng nếu nhận được phản hồi, nó sẽ không tự giải quyết. Sẽ thật tuyệt nếu bạn có thể buộc phải giải quyết nếu phản hồi không có thẩm quyền hoặc ngay cả khi đó là NXDOMAIN, nhưng ràng buộc sẽ không thử nếu nhận được phản hồi từ người chuyển tiếp.
Pablo Martinez

3

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 chính (có thể truy cập được).


2

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 một máy chủ phải có thể truy cập được 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 định 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.


Có, đối với máy chủ lưu trữ "host1.example.com", nó đã hoạt động tốt. Phần khó khăn là xử lý "example.com" cấp cao nhất theo cách tương tự ...
Remy Blank

2

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

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


Quá trình tương tự được thực hiện bởi tôi. vui lòng tìm thông tin chi tiết trong wiki Stealth Name Server của chúng tôi . Nhưng không thể giải quyết dyn.dev.shahed.biztừ World Wide! Bạn vui lòng giúp chúng tôi giải quyết vấn đề này?
Md Shahed Hossain
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.