Sunday, January 19, 2025

Triển khai DNS Server 1 node

-

DNS hay Hệ thống tên miền, thường là một thành phần khó thực hiện đúng khi tìm hiểu cách định cấu hình trang web và máy chủ. Mặc dù hầu hết mọi người có thể sẽ chọn sử dụng máy chủ DNS do công ty lưu trữ hoặc công ty đăng ký tên miền của họ cung cấp, nhưng có một số lợi thế khi tạo máy chủ DNS của riêng bạn.

Trong hướng dẫn này, chúng ta sẽ học cách cài đặt và cấu hình máy chủ DNS Bind9 làm máy chủ DNS chuyển tiếp hoặc bộ nhớ cache trên các máy Ubuntu.

Đầu tiên các bạn tạo 1 thư mục chứa các file cấu hình của chúng ta và phân quyền cho nó.

sudo mkdir -p /home/bind
sudo chmod -R 755 /home/bind
cd /home/bind

Tạo file bash và khai báo biến môi trường cho nó, hãy thay đổi thông tin phù hợp với server của bạn.

cat > /home/bind/environment.sh << 'EOF'
export node_dns_server_ipaddr='192.168.13.207'
export reverse_ip_dns='13.168.192'
export root_dns='hoanghd.com'
EOF

Khởi chạy biến môi trường bằng file vừa tạo.

source /home/bind/environment.sh

Bất kể bạn muốn sử dụng lựa chọn cấu hình nào, bước đầu tiên trong việc triển khai máy chủ Bind DNS là cài đặt phần mềm Bind9. Phần mềm Bind có sẵn trong kho lưu trữ mặc định của Ubuntu, vì vậy chúng ta chỉ cần cài đặt phần mềm bằng cách sử dụng apt.

sudo apt-get install bind9 bind9utils bind9-doc -y

Hãy khởi động bind9 và enable tự khởi động cho nó nhé.

sudo systemctl restart bind9
sudo systemctl enable bind9

Nếu máy chủ DNS chuyển tiếp có thể dễ dàng thiết lập máy chủ đó, điều này sẽ được thực hiện trong khối options {}. Đầu tiên, chúng ta tạo một khối bên trong được gọi là forwarders chứa địa chỉ IP của máy chủ DNS mà chúng ta muốn chuyển tiếp yêu cầu tới. Trong ví dụ này mình sử dụng máy chủ DNS của Google (8.8.8.8 và 8.8.4.4), tiến hành sửa file /home/bind/named.conf.options, để nhanh họn bạn hãy chạy lệnh dưới.

echo '''acl goodclients {
        192.168.1.1/32;
        localhost;
        localnets;
};

options {
        directory "/var/cache/bind";

        recursion yes;
        allow-query { goodclients; };

        forwarders {
                8.8.8.8;
                8.8.4.4;
        };
        forward only;
        dnssec-enable yes;
        dnssec-validation no;

        allow-recursion { any; };
        allow-query { any; };
        allow-query-cache { any; };

        auth-nxdomain no;    # conform to RFC1035
        listen-on-v6 { any; };
};''' > /etc/bind/named.conf.options

Giải thích đoạn cấu hình trên:

Khối đầu tiên dùng để định nghĩa ACL “goodclients” cho phép truy cập dịch vụ DNS từ các địa chỉ IP cụ thể là 192.168.1.1, máy chủ BIND9 (localhost), và các địa chỉ IP trong mạng cục bộ của máy chủ BIND9 (localnets). Các máy tính có địa chỉ IP khác không được phép truy cập các dịch vụ DNS theo ACL này.

acl goodclients {
    192.168.1.1/32;
    localhost;
    localnets;
};

Khối tiếp theo chứa các tùy chọn định nghĩa cách máy chủ BIND9 hoạt động và tương tác với các yêu cầu DNS từ client.

options {
        directory "/var/cache/bind";

        recursion yes;
        allow-query { goodclients; };

        forwarders {
                8.8.8.8;
                8.8.4.4;
        };
        forward only;
        dnssec-enable yes;
        dnssec-validation no;

        auth-nxdomain no;    # conform to RFC1035
        listen-on-v6 { any; };
};
  • directory "/var/cache/bind";: Đây là đường dẫn đến thư mục nơi các tệp cache của BIND9 được lưu trữ.
  • recursion yes;: Tùy chọn này cho phép máy chủ BIND9 thực hiện truy vấn đệ quy. Nghĩa là nếu máy chủ không biết câu trả lời cho một truy vấn, nó sẽ tìm kiếm trả lời từ các máy chủ DNS khác mà nó được cấu hình.
  • allow-query { goodclients; };: ACL “goodclients” được sử dụng ở đây để chỉ ra các địa chỉ IP mà BIND9 cho phép truy vấn DNS. Các yêu cầu DNS từ các địa chỉ trong ACL này sẽ được phục vụ.
  • forwarders { 8.8.8.8; 8.8.4.4; };: Đây là danh sách các máy chủ DNS đệ quy công cộng mà BIND9 sẽ sử dụng để tìm kiếm câu trả lời cho các truy vấn nếu nó không thể giải quyết chúng một cách cục bộ. Trong đoạn mã này, BIND9 sử dụng hai máy chủ DNS công cộng của Google (8.8.8.8 và 8.8.4.4) làm máy chủ đệ quy.
  • forward only;: Tùy chọn này cho biết rằng BIND9 chỉ sử dụng các máy chủ DNS đệ quy được chỉ định ở trên để giải quyết các truy vấn. Nó không sử dụng tính năng đệ quy của chính nó để giải quyết truy vấn.
  • dnssec-enable yes;: Tùy chọn này bật tính năng DNSSEC cho máy chủ BIND9. DNSSEC được sử dụng để cải thiện tính bảo mật và đáng tin cậy của hệ thống DNS.
  • dnssec-validation no;: Tùy chọn này vô hiệu hóa việc xác thực DNSSEC cho máy chủ BIND9. Điều này có nghĩa là máy chủ sẽ không xác thực chữ ký DNSSEC trên các truy vấn nó nhận được.
  • auth-nxdomain no;: Tùy chọn này chỉ định rằng máy chủ BIND9 không sử dụng trạng thái NXDOMAIN để xác định tính hợp lệ của một tên miền không tồn tại.
  • listen-on-v6 { any; };: Đây là cách máy chủ BIND9 lắng nghe trên tất cả các giao diện mạng IPv6 của nó (any). Điều này cho phép máy chủ BIND9 lắng nghe các yêu cầu DNS đến từ client qua IPv6.

Bây giờ bạn đã cấu hình máy chủ Bind của mình làm máy chủ DNS. Trước khi bắt đầu và khởi động lại máy chủ Bind trên hệ thống của mình, chúng ta nên sử dụng các công cụ đi kèm của Bind để kiểm tra cú pháp của các file cấu hình.

Chúng ta có thể làm điều này một cách dễ dàng bằng cách gõ.

sudo named-checkconf

Nếu không có lỗi cú pháp nào trong cấu hình của bạn, dấu nhắc shell sẽ quay lại ngay lập tức mà không hiển thị bất kỳ đầu ra nào.

Lưu ý: Một số phiên bản mới sau này đã bỏ tùy chọn dnssec-enable nên bạn có thể gặp thông báo:

$ sudo named-checkconf
/etc/bind/named.conf.options:18: option 'dnssec-enable' is obsolete and should be removed

Lỗi bạn đang gặp là do tùy chọn dnssec-enable đã bị lỗi và đã bị loại bỏ khỏi BIND 9. Bạn cần loại bỏ hoặc comment dòng cấu hình này từ tệp cấu hình của bạn. Để sửa lỗi này bạn hãy bỏ tùy chọn dnssec-enable yes; trong file /etc/bind/named.conf.options là xong.

Nếu bạn có lỗi cú pháp trong các file cấu hình của mình, bạn sẽ được cảnh báo về lỗi và số dòng xảy ra. Nếu điều này xảy ra, hãy quay lại và kiểm tra các file của bạn để tìm lỗi.

Khi bạn đã xác minh rằng các file cấu hình của mình không có bất kỳ lỗi cú pháp nào, hãy khởi động lại Bind để thực hiện các thay đổi của bạn.

sudo systemctl restart bind9
sudo systemctl status bind9

Tạo file /etc/bind/named.conf, chạy lệnh dưới để tạo file nhanh.

echo '''include "/etc/bind/named.conf.options";
include "/etc/bind/named.conf.local";
include "/etc/bind/named.conf.default-zones";''' > /etc/bind/named.conf

Tiếp tục chạy lệnh dưới để tạo file /etc/bind/named.conf.local

echo """zone \"$root_dns\" {
    type master;
    file \"/etc/bind/forward.$root_dns\";
};

zone \"$reverse_ip_dns.in-addr.arpa\" {
    type master;
    file \"/etc/bind/reverse.$root_dns\";
};""" > /etc/bind/named.conf.local

Tiếp tục chạy lệnh dưới để tạo file /etc/bind/forward.hoanghd.com

echo """\$TTL    604800
@       IN      SOA     $root_dns. root.$root_dns. (
                              2         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL
@       IN      NS      $root_dns.
@       IN      A       $node_dns_server_ipaddr
wiki    IN      A       192.168.13.207
resume  IN      A       192.168.13.208""" > /etc/bind/forward.$root_dns

Tiếp tục chạy lệnh dưới để tạo file /etc/bind/reverse.hoanghd.com

echo """\$TTL    604800
@       IN      SOA     $root_dns. root.$root_dns. (
                              1
                         604800
                          86400
                        2419200
                         604800 )
@       IN      NS      $root_dns.
@       IN      A       $node_dns_server_ipaddr
wiki    IN      A       192.168.13.207
resume  IN      A       192.168.13.208
102     IN      PTR     wiki.$root_dns.
103     IN      PTR     resume.$root_dns.""" > /etc/bind/reverse.$root_dns

Cấu hình Permission, Ownership cho máy chủ Bind, hãy chạy lại lần lượt các dòng lệnh.

sudo chmod -R 755 /etc/bind
sudo chown -R bind:bind /etc/bind

Khởi động lại dịch vụ bind9.

sudo systemctl restart bind9
sudo systemctl status bind9

Để chắc chắn rằng file cấu hình hoàn toàn chính xác và chạy được, trước hết chúng ta cần kiểm tra file bằng dòng lệnh, 2 lệnh dưới nếu kết quả không trả về bất cứ gì thì đã cho thấy cấu hình của bạn đã đúng.

sudo named-checkconf /etc/bind/named.conf
sudo named-checkconf /etc/bind/named.conf.local

Kiểm lỗi file Forward Zone.

$ sudo named-checkzone $root_dns /etc/bind/forward.$root_dns
zone hoanghd.com/IN: loaded serial 2
OK

Kiểm lỗi Reserve Zone.

$ sudo named-checkzone $root_dns /etc/bind/reverse.$root_dns
zone hoanghd.com/IN: loaded serial 1
OK

Kiểm tra trên máy host (máy chủ chạy container Bind9)

Trên máy host hãy chỉnh sửa DNS Server của bạn, mình đang sử dụng netplan của Ubuntu nên mình sẽ chỉnh sửa thông tin DNS trong file /etc/netplan/50-cloud-init.yaml

echo """network:
    ethernets:
        ens192:
            addresses:
            - 192.168.13.207/23
            dhcp4: false
            gateway4: 192.168.12.5
            nameservers:
                addresses:
                - $node_dns_server_ipaddr
                search:
                - $root_dns
    version: 2""" > /etc/netplan/50-cloud-init.yaml

Đừng quên apply nó nhé.

netplan apply

Hoặc bạn có thể trỏ trong file /etc/resolv.conf

echo """search $root_dns
nameserver $container_dns_server_ipaddr""" > /etc/resolv.conf 

Hãy kiểm tra kết quả phân giải trên client và bạn sẽ có kết quả như dưới.

$ ifconfig ens192
ens192: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.13.207  netmask 255.255.254.0  broadcast 192.168.13.255
        inet6 fe80::250:56ff:fead:c307  prefixlen 64  scopeid 0x20<link>
        ether 00:50:56:ad:c3:07  txqueuelen 1000  (Ethernet)
        RX packets 66657  bytes 87399926 (87.3 MB)
        RX errors 0  dropped 15  overruns 0  frame 0
        TX packets 21215  bytes 1674565 (1.6 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

$ nslookup hoanghd.com
Server:		127.0.0.53
Address:	127.0.0.53#53

Non-authoritative answer:
Name:	hoanghd.com
Address: 192.168.13.207

$ ping wiki.hoanghd.com
PING wiki.hoanghd.com (192.168.13.207) 56(84) bytes of data.
64 bytes from 192.168.13.207 (192.168.13.207): icmp_seq=1 ttl=64 time=0.044 ms
64 bytes from 192.168.13.207 (192.168.13.207): icmp_seq=2 ttl=64 time=0.079 ms
64 bytes from 192.168.13.207 (192.168.13.207): icmp_seq=3 ttl=64 time=0.079 ms
64 bytes from 192.168.13.207 (192.168.13.207): icmp_seq=4 ttl=64 time=0.087 ms

--- wiki.hoanghd.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3036ms
rtt min/avg/max/mdev = 0.044/0.072/0.087/0.017 ms

Để kiểm tra xem Bind9 đã forwarders ra internet được chưa bằng cách sử dụng lệnh dưới, nếu có kết quả trả về tức là bạn đã cấu hình forwarders thành công.

$ dig @192.168.13.207 www.google.com

; <<>> DiG 9.11.3-1ubuntu1.18-Ubuntu <<>> @192.168.13.207 www.google.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 18076
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: ea05c89990aac9d88f3d21ac63aab6f614be85a7e8443b55 (good)
;; QUESTION SECTION:
;www.google.com.                        IN      A

;; ANSWER SECTION:
www.google.com.         123     IN      A       142.250.204.100

;; Query time: 43 msec
;; SERVER: 192.168.13.207#53(192.168.13.207)
;; WHEN: Tue Dec 27 16:12:22 +07 2022
;; MSG SIZE  rcvd: 87

Như vậy là DNS Server đã có thể sẵn sàng để sử dụng.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

4,956FansLike
256FollowersFollow
223SubscribersSubscribe
spot_img

Related Stories