Mengganti beberapa entri DNS di BIND untuk jaringan internal

39

Saya memiliki jaringan internal dengan server DNS yang menjalankan BIND, terhubung ke internet melalui gateway tunggal. Domain saya "example.com" dikelola oleh penyedia DNS eksternal. Beberapa entri dalam domain itu, katakan "host1.example.com" dan "host2.example.com", serta entri tingkat atas "example.com", arahkan ke alamat IP publik gateway.

Saya ingin host yang berada di jaringan internal untuk menyelesaikan "host1.example.com", "host2.example.com" dan "example.com" ke alamat IP internal alih-alih dari gateway. Host lain seperti "otherhost.example.com" masih harus diselesaikan oleh penyedia DNS eksternal.

Saya telah berhasil melakukan hal itu untuk entri host1 dan host2, dengan mendefinisikan dua zona entri tunggal di BIND untuk "host1.example.com" dan "host2.example.com". Namun, jika saya menambahkan zona untuk "example.com", semua kueri untuk domain tersebut diselesaikan oleh server DNS lokal saya, dan mis. Kueri "otherhost.example.com" menghasilkan kesalahan.

Apakah mungkin untuk mengkonfigurasi BIND untuk menimpa hanya beberapa entri domain, dan untuk menyelesaikan sisanya secara rekursif?

Remy Blank
sumber
Pertanyaan serupa: serverfault.com/questions/8694/…
MikeyB
1
"Apakah mungkin untuk mengkonfigurasi BIND untuk menimpa hanya beberapa entri domain?" Tidak, tidak dengan BIND. Gunakan subdomain.
bortzmeyer
1
Tidak terikat tampaknya melakukan persis apa yang saya minta, jadi saya menetapkan jawaban Alnitak sebagai jawaban yang diterima. Tetapi pada akhirnya, saya akan mengikuti saran bortzmeyer dan tidak menimpa entri domain. Terima kasih atas semua balasan!
Remy Blank
1
Bind sekarang dapat melakukannya dengan zona kebijakan respons. Lihat jawaban saya di bawah ini. Solusi lain seperti Tidak Terikat tidak dapat menimpa CNAME. Dengan zona kebijakan di Bind, Anda tidak perlu melakukan subdomain; Anda bisa menimpa catatan individual sesuka hati.
Florin Andrei

Jawaban:

18

Metode terbaik adalah melalui zona kebijakan respons di Bind 9.8.1 atau lebih baru. Ini memungkinkan Anda untuk menimpa catatan tunggal di zona arbitrer (dan tidak perlu membuat subdomain keseluruhan untuk itu, hanya catatan tunggal yang ingin Anda ubah), memungkinkan Anda untuk menimpa CNAME, dll. Solusi lain seperti Tidak terikat tidak dapat menimpa CNAMEs .

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


EDIT: Mari kita lakukan ini dengan benar. Saya akan mendokumentasikan apa yang telah saya lakukan berdasarkan tutorial yang ditautkan di atas.

OS saya adalah Raspbian 4.4 untuk Raspberry Pi, tetapi teknik ini harus bekerja tanpa perubahan pada Debian dan Ubuntu, atau dengan perubahan minimal pada platform lain.

Pergi ke tempat file konfigurasi Bind Anda disimpan di sistem Anda - ini dia /etc/bind. Buat di sana file yang disebut db.rpzdengan konten berikut:

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

Apa fungsinya?

  • itu mengesampingkan alamat IP untuk www.some-website.comdengan alamat palsu 127.0.0.1, secara efektif mengirim semua lalu lintas untuk situs itu ke alamat loopback
  • mengirimkan lalu lintas ke www.other-website.comke situs lain yang disebutfake-hostname.com

Apa pun yang bisa masuk dalam file Bind zone dapat Anda gunakan di sini.

Untuk mengaktifkan perubahan ini ada beberapa langkah lagi:

Edit named.conf.localdan tambahkan bagian ini:

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

Tutorial yang ditautkan di atas memberitahu Anda untuk menambahkan lebih banyak hal zone "rpz" { }tetapi itu tidak perlu dalam pengaturan sederhana - apa yang saya tunjukkan di sini adalah minimum untuk membuatnya bekerja pada resolver lokal Anda.

Edit named.conf.optionsdan di suatu tempat di options { }bagian tambahkan response-policyopsi:

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

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

Sekarang restart Bind:

service bind9 restart

Itu dia. Server nama harus mulai mengganti catatan itu sekarang.

Jika Anda perlu melakukan perubahan, cukup edit db.rpz, lalu mulai ulang Bind lagi.

Bonus: jika Anda ingin mencatat permintaan DNS ke syslog, sehingga Anda dapat mengawasi prosesnya, edit named.conf.localdan pastikan ada loggingbagian yang menyertakan pernyataan ini:

logging {
    // stuff
    // already
    // there

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

Mulai kembali Bind lagi dan hanya itu.

Uji pada mesin yang menjalankan Bind:

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

Jika Anda menjalankan penggalian pada mesin yang berbeda, cukup gunakan @ the-ip-address-of-Bind-server alih-alih @ 127.0.0.1

Saya telah menggunakan teknik ini dengan sangat sukses untuk mengganti CNAME untuk situs web yang sedang saya kerjakan, mengirimkannya ke penyeimbang beban AWS baru yang baru saja saya uji. Raspberry Pi digunakan untuk menjalankan Bind, dan RPi juga dikonfigurasi untuk berfungsi sebagai router WiFi - jadi dengan menghubungkan perangkat ke SSID yang berjalan pada RPi saya akan mendapatkan penggantian DNS yang saya butuhkan untuk pengujian.

Florin Andrei
sumber
1
Harap perhatikan bahwa BIND RPZ sebenarnya tidak dapat (belum) mengesampingkan catatan tunggal berdasarkan QTYPE - itu akan mengesampingkan semua catatan untuk nama pemilik tertentu. Itu berarti bahwa jika Anda ingin mengganti catatan A untuk domain, tetapi tidak mis. Rekaman MX, Anda tidak bisa. Anda harus meletakkan catatan MX di zona RPZ juga, dan tetap menyinkronkannya dengan zona nyata.
Alnitak
2
Terima kasih telah memecahkan ini seperti yang Anda lakukan. Sangat membantu.
sruffell
Apakah ada peringatan? Saya mencoba melakukan ini dengan pfsense, tetapi saya tidak bisa "memalsukan" hasil apa pun, masih melaporkan alamat asli. Saya yakin saya telah mengikuti instruksi surat itu.
Lenne
@Lenne Seharusnya berhasil. Saya telah mengedit posting dan menambahkan saran untuk menguji perubahan.
Florin Andrei
@Lenne paket pfSense BIND memiliki ini dibangun ke GUI selama sekitar satu tahun sekarang jadi mucking dengan konfigurasi seharusnya tidak perlu. OP: mungkin layak menyebutkan beberapa hal lain yang dapat Anda lakukan dengan RPZ seperti membalas dengan NXDOMAIN atau hanya menjatuhkan respons.
miken32
21

The Unbound DNS Server rekursif memiliki kemampuan untuk mengesampingkan catatan sumber daya individu.

Lihatlah pengaturan local-zonedan local-datakonfigurasi dalam manual , misalnya:

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

The transparentpengaturan pada local-zonemengatakan itu untuk melakukan pencarian rekursif normal untuk setiap nama tidak disertakan dengan local-data.

Alnitak
sumber
1
Sepertinya persis apa yang ingin saya lakukan, terima kasih. Saya akan membaca di Unbound malam ini.
Remy Blank
Di sisi lain, kearifan itu cukup dipertanyakan. Memiliki domain internal.example.com akan lebih jelas.
bortzmeyer
@Bortzmeyer - Anda mungkin benar, tapi saya tidak membayangkan Wouter memasukkannya hanya untuk bersenang-senang ;-)
Alnitak
3
@Bortzmeyer, terkadang tidak ada pilihan. Contoh: SBS 2008 harus memiliki IP LAN tunggal, namun harus dijangkau dari luar menggunakan IP eksternal yang diteruskan router. Microsoft tidak mengizinkan dua kartu jaringan pada SBS, atau dua IP yang dikonfigurasi pada kartu yang sama. Jika server lokal menyelesaikan nama DNS ke IP eksternal, maka router perlu melakukan DNAT dan SNAT untuk LAN IP, dan kemudian log pada SBS akan menunjukkan semua akses berasal dari IP router, dan itu hanya salah. Saya akan menginstal unbounddi router saya sendiri, saya pikir solusinya jauh lebih baik.
Cosmin Prund
Ini tidak menjawab pertanyaan, karena pertanyaan khusus untuk BIND.
bzeaman
4

Anda mungkin ingin melihat ke "dnsmasq", yang memungkinkan Anda melakukan beberapa hal yang cukup pintar dengan resolusi tweaker.

Luke
sumber
Terima kasih, tip yang bagus. Sayang sekali dnsmasq tidak melakukan resolusi rekursif, jadi saya masih harus menjalankan BIND di port lain untuk itu (server DNS ISP saya tidak jelas).
Remy Blank
4

Apa yang Anda cari adalah DNS split, yang didefinisikan oleh Webopedia sebagai:

Dalam infrastruktur DNS terpisah, Anda membuat dua zona untuk domain yang sama, satu untuk digunakan oleh jaringan internal, yang lain digunakan oleh jaringan eksternal. Split DNS mengarahkan host internal ke server nama domain internal untuk resolusi nama dan host eksternal diarahkan ke server nama domain eksternal untuk resolusi nama.

Pada dasarnya, Anda perlu membuat salinan file zona eksternal Anda dan menopangnya di server DNS internal Anda, kemudian mengubah atau menambahkan catatan yang diperlukan khusus untuk jaringan internal Anda. Ini adalah pengaturan yang cukup umum, meskipun mungkin menyusahkan untuk menjaga catatan "eksternal" disinkronkan antara dua server DNS. Jika Anda membuat atau mengubah catatan di server publik, itu juga perlu dibuat atau diubah di server pribadi juga.

Ini dapat diterapkan terlepas dari implementasi server DNS apa yang Anda gunakan. Di sebagian besar penyiapan, Anda akan memiliki satu server DNS yang melayani jaringan eksternal, dan yang berbeda yang melayani jaringan internal. Dengan BIND, sebagai kemungkinan implementasi lainnya, Anda dapat memiliki kedua versi zona di server yang sama melalui penggunaan pernyataan "izinkan-kueri" dalam bagian zona dari file named.conf.

Kemungkinan lain di BIND (dan saya belum pernah mencoba ini) adalah untuk mengatur domain example.com Anda pada server DNS internal dengan hanya catatan yang Anda gunakan secara internal. Kemudian, tetapkan pernyataan "maju" dengan argumen "pertama" (bersama dengan "penerus"). Secara teori, ini akan menanyakan server DNS eksternal (sebagaimana diatur dalam "forwarder" untuk jawaban, yang tidak akan memiliki catatan internal Anda dan mengembalikan respons kegagalan. Kemudian, server internal akan melihat sendiri untuk jawaban. Tidak yakin apakah itu akan berhasil, tapi itu sebuah pemikiran.

Justin Scott
sumber
Menyimpan dua file zona dalam sinkronisasi akan menjadi rumit, karena yang eksternal diperbarui melalui klien DNS dinamis. Saya akan membaca tentang pernyataan ke depan. Terima kasih atas tipnya.
Remy Blank
Tidak, penerusan BIND tidak akan berfungsi, itu hanya untuk domain yang tidak dikenal tetapi server nama internal akan tahu tentang example.com, itu akan menjadi otoritatif untuk itu.
bortzmeyer
1
Jika saya membaca dokumentasi dengan benar, pernyataan "forward first" dalam bagian zona harus memberitahu BIND untuk pergi dan mencari jawaban di forwarder bahkan untuk domain lokal yang otoritatif, kemudian gunakan informasi lokal hanya jika itu bisa ' t mendapat jawaban dari forwarder.
Justin Scott
Jika Anda menempatkan global "maju dulu" 'itu akan mengirimkan pertanyaan ke forwarder dan jika tidak dijawab akan mencoba menjawab pertanyaan' (dari doc) tetapi jika ia menerima tanggapan, itu tidak akan mencoba menyelesaikannya sendiri. Akan lebih bagus jika Anda bisa memaksa untuk menyelesaikan jika responsnya tidak berwibawa atau bahkan jika itu adalah NXDOMAIN, tetapi bind tidak akan mencoba jika mendapat respons dari forwarder.
Pablo Martinez
3

Di BIND saya mendapatkan hasil ini dengan mendefinisikan zona menggunakan nama host yang diinginkan. Pendekatan ini baik-baik saja jika Anda hanya ingin menimpa beberapa host.

Deklarasi zona saya terlihat seperti ini:

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

Definisi zona saya terlihat seperti ini:

$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

Jadi jika saya query example.com pada intranet DNS dan ISP DNS saya mendapatkan IP yang sama tetapi jika saya query override.example.com saya mendapatkan hasil yang berbeda jika intranet DNS (primer) dapat diakses.

srdjan
sumber
2

Anda sudah berada di jalur yang benar.

Pada server DNS internal Anda, Anda harus menentukan zona untuk setiap host pengecualian tepat di bawah "example.com". Untuk meminimalkan pengecualian ini, merupakan praktik umum untuk memberi nama semua mesin internal "hosta.internal.example.com", dengan server DNS mengirim sebagian besar kueri ke server DNS eksternal, tetapi otoritatif untuk zona "internal.example.com". (Setelah Anda melewati operasi kecil, biasanya ada beberapa server DNS yang mengarahkan klien dan DNS otoritatif terpisah yang ditujukan untuk "internal.example.com" server.)

Biasanya, hanya ketika host harus dapat dijangkau baik secara eksternal maupun internal bahwa pengecualian yang Anda uraikan dapat dibuat. Meskipun begitu, Anda mungkin ingin menggunakan "host1.example.com" dari luar dan "host1.internal.example.com" dari dalam. Host internal dikonfigurasikan untuk mencari nama dalam "internal.example.com". Ada situasi di mana apa yang sudah Anda lakukan sesuai, seperti jika sertifikat untuk server mengidentifikasi server sebagai "host1.example.com", dalam hal ini Anda ingin itu menjadi nama yang terhubung dengan klien.


sumber
Ya, untuk host "host1.example.com", ini sudah berfungsi dengan baik. Bagian yang sulit adalah penanganan tingkat atas "example.com" dengan cara yang sama ...
Remy Kosong
2

Gunakan dnsmasq membuatnya sangat mudah. http://www.thekelleys.org.uk/dnsmasq/doc.html Bertindak sebagai server dns tetapi mendapat jawaban dari server dns lokal. Yang menyenangkan adalah Anda dapat mengganti catatan domain tunggal tanpa mengacaukan file zona


sumber
2

Sebenarnya ada cara lain, meskipun mungkin sedikit berbeda, untuk melakukan ini. Saya memiliki situasi yang sama, saya memiliki domain yang digunakan secara eksternal dan internal, dan saya memiliki host statis dan dinamis eksternal. Satu-satunya yang benar-benar menyakitkan adalah yang dinamis eksternal. Solusinya mungkin bukan yang paling elegan, tetapi dapat diterapkan dengan skrip kecil. Sebagian besar saya melakukan skrip DNS dinamis saya sendiri dengan API penyedia DNS dinamis saya, saya menjalankan skrip ini dengan cron, setiap 5 menit:

1) dapatkan IP eksternal saya. apakah sudah berubah? tidak ada jalan keluar.

2) mengubah IP, memanggil API penyedia dyndns, dengan alamat IP baru,

3) sed the db.mydomain.com dengan IP eksternal

4) restart bind.

Bekerja sangat andal untuk jaringan rumah saya

nico
sumber
Proses yang sama dilakukan oleh saya. silakan temukan detailnya di wiki Stealth Name Server kami . Tetapi tidak dapat menyelesaikan dyn.dev.shahed.bizdari World Wide! Maukah Anda membantu kami menyelesaikan masalah ini?
Md Shahed Hossain