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.

  1. 127.0.0.1 (localhost)

  2. 192.168.0.0/24 (Nama Domain: example.com)

    • 192.168.0.2 - alamat IP komputer pelayan BIND
      Subdomain: pc1   hadoop
      FQDN: pc1.example.com   hadoop.example.com

    • 192.168.0.3 - alamat IP telefon pintar
      Subdomain: mobile
      FQDN: mobile.example.com

    • 192.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.

bash
sudo systemctl restart systemd-resolved && sudo resolvectl flush-caches
  • Tetapan ~. pada entri Domains bermaksud berundur ke DNS global untuk semua domain lain. Tanpanya, sistem mungkin hanya resolve pada example.com sahaja.

  • Jalankan resolvectl status untuk 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.conf
acl 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.

  1. localhost

    /etc/named.conf
    ...
    
    // --- ZON SISTEM (Hanya boleh diakses oleh kumpulan 'trusted' secara lalai) ---
    
    zone "localhost" IN {
        type primary;
        file "localhost.zone";
    };
  2. 127.0.0 (zon songsang)

    /etc/named.conf
    ...
    zone "0.0.127.in-addr.arpa" IN {
        type primary;
        file "127.0.0.zone";
    };
  3. 192.168.0 (zon songsang)

    /etc/named.conf
    ...
    zone "0.168.192.in-addr.arpa" IN {
        type primary;
        file "192.168.0.zone";
    };
  1. 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.1
  2. 127.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.
  3. 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:

  1. logging
  2. SSH
  3. audit rangkaian

Sentiasa semak pengesahan konfigurasi named dan fail zon dengan dua arahan berikut:

bash
named-checkconf
named-checkzone localhost /var/named/localhost.zone   # contoh
  • Sebarang suntingan secara manual pada fail konfigurasi named.conf menuntut admin untuk memuat semula unit systemd named.service (atau jalankan rndc reload jika menggunakan rndc).
  • Manakala, setiap perubahan pada fail zon pula wajib dinaikkan nombor siri pada SOA sebelum 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-confgen generates configuration files for rndc. It can be used as a convenient alternative to writing the rndc.conf file and the corresponding controls and key statements in named.conf by hand. Alternatively, it can be run with the -a option to set up a rndc.key file and avoid the need for arndc.conf file and a controls statement altogether.


Saya ikuti kaedah alternatif yang memudahkan lagi urusan dengan menjalankan arahan di bawah:

bash
sudo rndc-confgen -a

Arahan 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.4

Simbol @ 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

  1. Fail zon yang baru dicipta di atas boleh ditambahkan (diaktifkan) dengan perintah baris berikut:

    bash
    sudo rndc addzone example.com '{ type primary; file "example.com.zone"; };'
  2. Arahan di atas akan menghasilkan fail /var/named/_default.nzd, yang bertindak mendaftar fail zon yang ditambah itu. Kandungan fail tersebut boleh disemak dengan:

    bash
    sudo named-nzd2nzf /var/named/_default.nzd
    zone "example.com" { type primary; file "example.com.zone"; };
    
  3. Muatkan rndc dan semak statusnya:

    bash
    sudo rndc reload
    sudo rndc status 
  4. Cuba ping mana-mana subdomain dalaman itu serta alamat web lain seperti google.com.

Uji sambungan TLS

Untuk menguji sambungan TLS, gunakan dua kaedah ini:

  1. kdig: Pasang pakej knot. Jalankan perintah baris berikut (dengan jangkaan output):

    bash
    kdig @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 ms
  2. openssl:

    bash
    openssl s_client -connect 192.168.0.2:853 -servername example.com -brief 
    Connecting 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
    

Kali terakhir dikemaskini:

Tentang Blog & Penulis

Topik perbincangan dalam blog ini merangkumi Linux dan perisian sumber terbuka, Virtual Machine, serta Typesetting system.
Fokus semasa: Full Stack Development
Minat sampingan: Analisis Data
Bakat tersembunyi hamba (yang patutlah dipendam buat selama-lamanya): Menyanyi dan melukis.

Sumber dari Wallpaper Cave.