Pelayan BIND untuk Rangkaian Rumah
Arch Linux
Saya sudah lama cuba beralih ke pelayan BIND untuk menguruskan domain. Namun, dek pemahaman yang terlalu lemah, semuanya berakhir dengan kegagalan. Setelah lama berputus asa, saya cuba lagi kali ini, dengan mengosongkan fikiran dan berlapang dada, berbekalkan dokumentasi daripada BIND 9 sendiri dan BIND - ArchWiki, bersama bantuan daripada Google Gemini, akhirnya berhasil juga konfigurasinya.
Pemasangan BIND 9
Pasang pakej bind. Menurut dokumentasi BIND 9, pelayan ini disokong secara rasmi dan berfungsi dengan sangat baik dalam pengedaran Arch Linux.
Mulakan dan aktifkan unit systemd named.service.
Contoh struktur IP dalam rangkaian rumah
Berikut adalah contoh struktur IP yang wujud dalam persekitaran rangkaian rumah. Ambil maklum bahawa semua domain adalah contoh, tidak direka untuk resolusi internet sebenar.
127.0.0.1 (localhost)192.168.0.0/24(Nama Domain:example.com)192.168.0.2- alamat IP komputer pelayan BIND
Subdomain:pc1hadoop
FQDN:pc1.example.comhadoop.example.com192.168.0.3- alamat IP telefon pintar
Subdomain:mobile
FQDN:mobile.example.com192.168.0.4- alamat IP pencetak & pengimbas
Subdomain:printer
FQDN:printer.example.com
Sekiranya menggunakan resolver yang disediakan oleh systemd, tambah entri di bawah (IP pelayan dan nama domain) untuk membenarkan akses (ping) kepada rangkaian dalaman dan luaran ke dalam fail berikut.
/etc/systemd/resolved.conf.d/dns_servers.conf[Resolve]
DNS=192.168.0.2
Domains=example.com ~.Mulakan semula unit systemd systemd-resolved.service dan bersihkan cache resolver.
bashsudo systemctl restart systemd-resolved && sudo resolvectl flush-cachesTetapan
~.pada entriDomainsbermaksud berundur ke DNS global untuk semua domain lain. Tanpanya, sistem mungkin hanya resolve padaexample.comsahaja.Jalankan
resolvectl statusuntuk debug antara muka DNS.
Konfigurasi manual - named.conf
ACL
Definisikan siapa yang dipercayai di bahagian paling atas fail dengan blok entri [ acl <string> { } ]. Contoh:
/etc/named.confacl trusted {
127.0.0.1;
192.168.0.0/24;
};TLS
Tambah blok entri [ tls <string> { } ] untuk mengaktifkan TLS pada DNS.
/etc/named.conf...
tls mycert {
cert-file "/var/named/tls/bind.crt";
key-file "/var/named/tls/bind.key";
};Opsyen
Seterusnya, masukkan blok [ options { } ] sebagaimana berikut:
/etc/named.conf...
options {
directory "/var/named";
pid-file "/run/named/named.pid";
session-keyfile "/run/named/session.key";
// ------------------------
// Polisi penghantar
// ------------------------
forward first;
forwarders {
8.8.8.8;
8.8.4.4;
1.1.1.1;
};
// ------------------------
// Kawalan akses
// ------------------------
allow-query { trusted; };
allow-recursion { trusted; };
allow-query-cache { trusted; };
recursion yes;
// ------------------------
// Pendengar rangkaian
// ------------------------
listen-on port 53 { 127.0.0.1; 192.168.0.2; };
listen-on-v6 { none; };
tls-port 853;
listen-on tls mycert { 127.0.0.1; 192.168.0.2; };
// ------------------------
// Zon / kawalan *runtime*
// ------------------------
allow-transfer { none; };
allow-update { none; };
allow-new-zones yes; // untuk rndc
// ---------------------------------
// Tingkah laku DNS / keselamatan
// ---------------------------------
dnssec-validation auto;
version "hidden";
};Opsyen tambahan untuk mengetatkan keselamatan
/etc/named.conf...
options {
...
minimal-responses yes;
auth-nxdomain no;
empty-zones-enable yes;
prefetch 2 9;
rate-limit {
responses-per-second 10;
window 5;
};
edns-udp-size 1232;
};
...Fail Zon
Di bahagian ini, saya akan sertakan sekali fail konfigurasi zon yang disimpan dalam direktori /var/named, yang ditakrifkan dalam fail named.conf.
localhost/etc/named.conf... // --- ZON SISTEM (Hanya boleh diakses oleh kumpulan 'trusted' secara lalai) --- zone "localhost" IN { type primary; file "localhost.zone"; };127.0.0(zon songsang)/etc/named.conf... zone "0.0.127.in-addr.arpa" IN { type primary; file "127.0.0.zone"; };192.168.0(zon songsang)/etc/named.conf... zone "0.168.192.in-addr.arpa" IN { type primary; file "192.168.0.zone"; };
localhost.zone/var/named/localhost.zone$ORIGIN localhost. $TTL 2h @ IN SOA localhost. root.localhost. ( 2026060201 ; serial (yyyymmdd##) 3H ; refresh 15M ; retry 1W ; expiry 1D ) ; minimum ttl IN NS localhost. @ IN A 127.0.0.1127.0.0.zone/var/named/127.0.0.zone$ORIGIN 0.0.127.in-addr.arpa. $TTL 2h @ IN SOA localhost. root.localhost. ( 2026060201 ; serial (yyyymmdd##) 3H ; refresh 15M ; retry 1W ; expiry 1D ) ; minimum ttl IN NS localhost. 1 IN PTR localhost.192.168.0.zone/var/named/192.168.0.zone$ORIGIN 0.168.192.in-addr.arpa. $TTL 2h @ IN SOA pc1.example.com. root.example.com. ( 2026060201 ; serial (yyyymmdd##) 3H ; refresh 15M ; retry 1W ; expiry 1D ) ; minimum ttl @ IN NS pc1.example.com. 2 IN PTR pc1.example.com. 3 IN PTR mobile.example.com. 4 IN PTR printer.example.com.
Logging
/etc/named.conf...
logging {
channel security_log {
file "/var/log/named/security.log" versions 3 size 10m;
severity warning;
print-time yes;
};
category security { security_log; };
};Zon songsang hanya berfungsi untuk PTR lookup. Ia tidak wajib tetapi sangat membantu dalam:
- logging
- SSH
- audit rangkaian
Sentiasa semak pengesahan konfigurasi named dan fail zon dengan dua arahan berikut:
bashnamed-checkconf
named-checkzone localhost /var/named/localhost.zone # contoh- Sebarang suntingan secara manual pada fail konfigurasi
named.confmenuntut admin untuk memuat semula unit systemdnamed.service(atau jalankanrndc reloadjika menggunakanrndc). - Manakala, setiap perubahan pada fail zon pula wajib dinaikkan nombor siri pada
SOAsebelum memuat semula, bagi memastikan BIND mengesan perubahan rekod tersebut.
Pengurusan automatik menggunakan rndc
rndc boleh diaktifkan untuk menguruskan penambahan zon tanpa menyunting fail named.conf secara langsung. Dokumentasi BIND 9 menjelaskan:
rndc-confgengenerates configuration files forrndc. It can be used as a convenient alternative to writing therndc.conffile and the corresponding controls and key statements innamed.confby hand. Alternatively, it can be run with the-aoption to set up arndc.keyfile and avoid the need for arndc.conffile and a controls statement altogether.
Saya ikuti kaedah alternatif yang memudahkan lagi urusan dengan menjalankan arahan di bawah:
bashsudo rndc-confgen -aArahan tersebut menjana fail rndc.key yang bertempat di dalam direktori /etc secara automatik. Terdapat satu lagi fail zon yang belum dibincangkan di sini, iaitu fail zon untuk nama domain utama peranti pelayan, yakni example.com.
Fail zon domain utama
Di bawah ini adalah contoh fail zon domain pelayan:
/var/named/example.com.zone$ORIGIN example.com.
$TTL 2h
@ IN SOA pc1.example.com. root.example.com. (
2026060401 ; serial (yyyymmdd##)
3H ; refresh
15M ; retry
1W ; expiry
1D ) ; minimum ttl
@ IN NS pc1.example.com.
; Pemetaan nama domain utama
@ IN A 192.168.0.2
; Subdomain
pc1 IN A 192.168.0.2
hadoop IN A 192.168.0.2
mobile IN A 192.168.0.3
printer IN A 192.168.0.4Simbol @ dalam fail zon adalah merujuk kepada $ORIGIN semasa (root domain zone). Dalam contoh yang saya berikan:
$ORIGIN example.com.
@ IN A 192.168.0.2
adalah bersamaan dengan:
example.com. IN A 192.168.0.2
Aktifkan fail zon
Fail zon yang baru dicipta di atas boleh ditambahkan (diaktifkan) dengan perintah baris berikut:
bashsudo rndc addzone example.com '{ type primary; file "example.com.zone"; };'Arahan di atas akan menghasilkan fail
/var/named/_default.nzd, yang bertindak mendaftar fail zon yang ditambah itu. Kandungan fail tersebut boleh disemak dengan:bashsudo named-nzd2nzf /var/named/_default.nzdzone "example.com" { type primary; file "example.com.zone"; };Muatkan
rndcdan semak statusnya:bashsudo rndc reload sudo rndc statusCuba ping mana-mana subdomain dalaman itu serta alamat web lain seperti
google.com.
Uji sambungan TLS
Untuk menguji sambungan TLS, gunakan dua kaedah ini:
kdig: Pasang pakejknot. Jalankan perintah baris berikut (dengan jangkaan output):bashkdig @192.168.0.2 +tls pc1.example.com;; TLS session (TLS1.3)-(ECDHE-X25519)-(RSA-PSS-RSAE-SHA256)-(AES-256-GCM) ;; ->>HEADER<<- opcode: QUERY; status: NOERROR; id: 28319 ;; Flags: qr aa rd ra; QUERY: 1; ANSWER: 1; AUTHORITY: 0; ADDITIONAL: 1
;; EDNS PSEUDOSECTION: ;; Version: 0; flags: ; UDP size: 1232 B; ext-rcode: NOERROR
;; QUESTION SECTION: ;; pc1.example.com. IN A
;; ANSWER SECTION: pc1.example.com. 7200 IN A 192.168.0.2
;; Received 65 B ;; Time 2026-06-06 11:57:11 +08 ;; From 192.168.0.2@853(TLS) in 4.3 msopenssl:bashopenssl s_client -connect 192.168.0.2:853 -servername example.com -briefConnecting to 192.168.0.2 CONNECTION ESTABLISHED Protocol version: TLSv1.3 Ciphersuite: TLS_AES_256_GCM_SHA384 Peer certificate: C=MY, ST=<Negeri>, L=<Bandar>, O=Local-Certificates, CN=example.com Hash used: SHA256 Signature type: rsa_pss_rsae_sha256 Verification: OK Negotiated TLS1.3 group: X25519MLKEM768
