Tổng quan và Nguyên lý DNS
Hệ thống Tên Miền (Domain Name System - DNS) đóng vai trò cốt lõi trong việc định tuyến trên internet, cho phép người dùng truy cập các tài nguyên mạng một cách thuận tiện thông qua các tên miền dễ nhớ thay vì địa chỉ IP phức tạp. DNS hoạt động như một cơ sở dữ liệu phân tán, chịu trách nhiệm chuyển đổi tên miền thành địa chỉ IP (phân giải thuận) và ngược lại, chuyển đổi địa chỉ IP thành tên miền (phân giải ngược). Giao thức DNS sử dụng cả cổng TCP và UDP 53.
Các loại máy chủ DNS chính bao gồm:
- Máy chủ DNS đệ quy (Recursive DNS server): Đây là điểm khởi đầu cho các truy vấn DNS từ người dùng cuối. Nó sẽ chủ động tìm kiếm thông tin từ các máy chủ DNS khác (Root, TLD, Authoritative) cho đến khi tìm thấy địa chỉ IP mong muốn và trả về kết quả duy nhất cho client. Ví dụ: 8.8.8.8 (Google Public DNS), 1.1.1.1 (Cloudflare DNS).
- Máy chủ DNS có thẩm quyền (Authoritative DNS server): Đây là máy chủ lưu trữ bản ghi DNS chính thức cho một hoặc nhiều tên miền cụ thể. Nó cung cấp câu trả lời cuối cùng cho các truy vấn về các miền mà nó quản lý.
- Máy chủ DNS chuyển tiếp (Forwarding DNS server): Một máy chủ DNS được cấu hình để chuyển tiếp tất cả các truy vấn mà nó không thể tự phân giải sang một máy chủ DNS khác.
Quy trình truy vấn DNS
Khi một client muốn truy cập một tên miền, quá trình phân giải DNS thường diễn ra theo các bước sau:
- Client gửi một truy vấn đệ quy đến máy chủ DNS cục bộ (recursive resolver) được cấu hình trong hệ điều hành của nó.
- Nếu máy chủ DNS cục bộ không có thông tin trong bộ nhớ cache, nó sẽ bắt đầu một quá trình truy vấn lặp lại (iterative query) để tìm địa chỉ IP.
- Máy chủ DNS cục bộ gửi truy vấn đến một máy chủ DNS gốc (Root DNS server). Máy chủ gốc không biết địa chỉ IP cụ thể, nhưng nó sẽ trả về danh sách các máy chủ DNS tên miền cấp cao nhất (Top-Level Domain - TLD) chịu trách nhiệm cho phần mở rộng của tên miền (ví dụ: .com, .org, .vn).
- Máy chủ DNS cục bộ sau đó gửi truy vấn đến một trong các máy chủ TLD được trả về. Máy chủ TLD này sẽ trả về địa chỉ IP của máy chủ DNS có thẩm quyền (Authoritative DNS server) quản lý tên miền đầy đủ.
- Cuối cùng, máy chủ DNS cục bộ gửi truy vấn đến máy chủ DNS có thẩm quyền. Máy chủ này sẽ cung cấp địa chỉ IP chính xác của tên miền mà client đang tìm kiếm.
- Máy chủ DNS cục bộ lưu trữ kết quả vào bộ nhớ cache và trả về địa chỉ IP cho client. Client sau đó có thể thiết lập kết nối với tài nguyên đích.
Điểm khác biệt chính giữa truy vấn đệ quy và truy vấn lặp lại là: trong truy vấn đệ quy, máy chủ DNS cục bộ tự mình tìm kiếm và trả về kết quả cuối cùng; còn trong truy vấn lặp lại, máy chủ DNS trả về thông tin về máy chủ tiếp theo cần hỏi, và máy chủ DNS cục bộ tiếp tục quá trình truy vấn.
Các loại bản ghi DNS phổ biến
Các bản ghi DNS (Resource Records) lưu trữ thông tin về một tên miền. Dưới đây là một số loại bản ghi quan trọng:
- SOA (Start of Authority): Bản ghi khởi tạo vùng, chứa các thông tin quản trị quan trọng về vùng DNS như email của người quản lý, số serial của vùng, và các thông số thời gian (TTL, refresh, retry, expire).
- NS (Name Server): Chỉ định máy chủ DNS nào có thẩm quyền cho vùng tên miền này.
- A (Address): Ánh xạ một tên miền thành địa chỉ IPv4.
- AAAA (IPv6 Address): Ánh xạ một tên miền thành địa chỉ IPv6.
- CNAME (Canonical Name): Tạo bí danh (alias) cho một tên miền khác.
- PTR (Pointer): Được sử dụng cho phân giải ngược, ánh xạ địa chỉ IP thành tên miền.
- MX (Mail Exchanger): Chỉ định máy chủ thư điện tử chịu trách nhiệm nhận email cho một tên miền.
- SRV (Service Record): Chỉ định vị trí (hostname và cổng) của các dịch vụ cụ thể được cung cấp bởi một tên miền.
Cấu trúc bản ghi SRV trong một tệp zone:
_service._proto.domain.com. TTL IN SRV PRIORITY WEIGHT PORT TARGET
Ví dụ minh họa một bản ghi SRV:
_webapp._tcp.mydomain.vn. 3600 IN SRV 10 5 8080 webserver1.mydomain.vn.
Giải thích các trường:
_webapp: Tên dịch vụ, thường bắt đầu bằng dấu gạch dưới._tcp: Giao thức truyền tải mà dịch vụ sử dụng (ví dụ: TCP hoặc UDP).mydomain.vn.: Tên miền mà bản ghi này áp dụng. Dấu chấm cuối cùng là bắt buộc để chỉ định tên miền tuyệt đối.3600: TTL (Time To Live), thời gian (giây) mà máy chủ DNS đệ quy có thể lưu trữ bản ghi này trong bộ nhớ cache.IN: Lớp bản ghi, thường là "IN" cho Internet.SRV: Loại bản ghi.10: Priority (độ ưu tiên), giá trị thấp hơn có độ ưu tiên cao hơn.5: Weight (trọng số), cho phép cân bằng tải giữa các máy chủ có cùng độ ưu tiên. Giá trị cao hơn sẽ nhận nhiều lưu lượng hơn.8080: Port (cổng) mà dịch vụ đang lắng nghe.webserver1.mydomain.vn.: Target (mục tiêu), hostname của máy chủ cung cấp dịch vụ. Phải là một FQDN và kết thúc bằng dấu chấm.
Lưu ý: Chỉ các bản ghi A và AAAA mới có thể ánh xạ trực tiếp đến một địa chỉ IP. Các bản ghi khác trỏ đến tên miền hoặc thông tin khác.
Thiết lập máy chủ DNS với BIND
BIND (Berkeley Internet Name Domain) là phần mềm DNS được sử dụng rộng rãi nhất. Dưới đây là hướng dẫn cơ bản để thiết lập một máy chủ DNS có thẩm quyền.
Máy chủ DNS có thẩm quyền
Các bước cấu hình máy chủ DNS có thẩm quyền cho tên miền mydomain.vn:
# Bước 1: Cài đặt gói BIND
[root@server ~]# yum -y install bind bind-utils
# Bước 2: Chỉnh sửa tệp cấu hình chính của BIND
# Mở tệp /etc/named.conf và sửa đổi các dòng sau để cho phép lắng nghe và truy vấn từ bất kỳ địa chỉ nào.
[root@server ~]# vim /etc/named.conf
Tìm và sửa các dòng sau:
options {
listen-on port 53 { any; };
// listen-on-v6 port 53 { ::1; }; // Nếu không dùng IPv6 thì comment hoặc bỏ qua
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
recursing-file "/var/named/data/named.recursing";
secroots-file "/var/named/data/named.secroots";
allow-query { any; }; // Cho phép truy vấn từ bất kỳ máy nào
recursion no; // Tắt tính năng đệ quy nếu chỉ muốn làm authoritative
// Nếu bạn muốn cấu hình forwarder cho các truy vấn không thuộc thẩm quyền của mình
// forwarders { 8.8.8.8; 8.8.4.4; };
dnssec-enable yes;
dnssec-validation yes;
/* Path to ISC DLV key */
bindkeys-file "/etc/named.root.key";
managed-keys-directory "/var/named/dynamic";
pid-file "/run/named/named.pid";
session-keyfile "/run/named/session.key";
};
logging {
channel default_debug {
file "data/named.run";
severity dynamic;
};
};
zone "." IN {
type hint;
file "named.ca";
};
Lưu ý: Đối với máy chủ chỉ đóng vai trò authoritative, nên thiết lập recursion no; để tăng cường bảo mật và hiệu suất.
# Bước 3: Định nghĩa vùng (zone) trong tệp named.rfc1912.zones
# Thêm định nghĩa vùng cho mydomain.vn.
[root@server ~]# vim /etc/named.rfc1912.zones
Thêm đoạn sau vào cuối tệp:
zone "mydomain.vn." IN {
type master;
file "mydomain.vn.zone"; // Tên tệp zone sẽ tạo trong /var/named/
allow-update { none; }; // Không cho phép cập nhật động
};
# Bước 4: Tạo tệp zone cho tên miền mydomain.vn
# Tệp này sẽ chứa các bản ghi DNS thực tế. Đặt tên tệp theo định nghĩa ở trên, ví dụ: mydomain.vn.zone.
[root@server ~]# vim /var/named/mydomain.vn.zone
Nội dung tệp /var/named/mydomain.vn.zone:
$TTL 3600
@ IN SOA ns1.mydomain.vn. admin.mydomain.vn. (
2023112001 ; Serial (YYYYMMDDNN)
1H ; Refresh (1 giờ)
30M ; Retry (30 phút)
1W ; Expire (1 tuần)
1H ) ; Minimum TTL (1 giờ)
@ IN NS ns1.mydomain.vn.
ns1 IN A 192.168.10.100 ; IP của máy chủ DNS này
webapp1 IN A 192.168.10.101
dbserver IN A 192.168.10.102
; Ví dụ bản ghi SRV cho dịch vụ webapp
_webapp._tcp.mydomain.vn. 3600 IN SRV 10 5 8080 webapp1.mydomain.vn.
_webapp._tcp.mydomain.vn. 3600 IN SRV 10 5 8080 dbserver.mydomain.vn.
Lưu ý: Dấu chấm cuối cùng sau mydomain.vn. là rất quan trọng để chỉ định đây là FQDN (Fully Qualified Domain Name) tuyệt đối.
# Bước 5: Đặt quyền sở hữu tệp zone
# Đảm bảo người dùng 'named' có quyền đọc tệp zone.
[root@server ~]# chown named:named /var/named/mydomain.vn.zone
[root@server ~]# restorecon /var/named/mydomain.vn.zone # Nếu có SELinux
# Bước 6: Khởi động và bật dịch vụ BIND
[root@server ~]# systemctl enable named
[root@server ~]# systemctl start named
[root@server ~]# systemctl status named
Sau khi hoàn thành các bước trên, máy chủ DNS có thẩm quyền đã sẵn sàng phục vụ các truy vấn cho mydomain.vn.
Kiểm tra phân giải DNS
Từ một máy client hoặc chính máy chủ DNS, cấu hình DNS resolver để trỏ về IP của máy chủ DNS vừa thiết lập (ví dụ: 192.168.10.100) và sử dụng nslookup hoặc dig để kiểm tra.
# Trên máy client hoặc máy chủ DNS, cấu hình /etc/resolv.conf tạm thời
# nameserver 192.168.10.100
# Kiểm tra bản ghi A
[user@client ~]$ nslookup webapp1.mydomain.vn
Server: 192.168.10.100
Address: 192.168.10.100#53
Name: webapp1.mydomain.vn
Address: 192.168.10.101
# Kiểm tra bản ghi SRV
[user@client ~]$ nslookup
> set type=srv
> _webapp._tcp.mydomain.vn
Server: 192.168.10.100
Address: 192.168.10.100#53
_webapp._tcp.mydomain.vn service = 10 5 8080 webapp1.mydomain.vn.
_webapp._tcp.mydomain.vn service = 10 5 8080 dbserver.mydomain.vn.
> exit
Máy chủ DNS đệ quy
Để một máy chủ BIND hoạt động như một máy chủ DNS đệ quy (chẳng hạn như DNS cục bộ cho mạng nội bộ), nó cần được phép thực hiện truy vấn đệ quy và có thể cần cấu hình để forward các truy vấn nếu không tự phân giải được.
# Trong tệp /etc/named.conf, đảm bảo 'recursion' được đặt là 'yes' và 'allow-query' cho phép các client mong muốn.
[root@server ~]# vim /etc/named.conf
Trong phần options {}:
options {
// ... các cấu hình khác ...
recursion yes; // Bật tính năng đệ quy
allow-query { any; }; // Hoặc { 192.168.10.0/24; }; để giới hạn client
// ...
};
Sau khi thay đổi, khởi động lại dịch vụ named.
Máy chủ DNS chuyển tiếp (Forwarding DNS Server)
Máy chủ DNS chuyển tiếp sẽ gửi tất cả các truy vấn mà nó không thể giải quyết trong các zone cục bộ của mình đến một hoặc nhiều máy chủ DNS khác (forwarders) thay vì tự mình thực hiện truy vấn từ các máy chủ gốc.
# Trong tệp /etc/named.conf, thêm hoặc chỉnh sửa phần 'forward' và 'forwarders'.
[root@server ~]# vim /etc/named.conf
Trong phần options {}:
options {
// ... các cấu hình khác ...
recursion yes;
forward first; // Hoặc 'only'. 'first' thử forwarders trước, sau đó tự truy vấn nếu forwarders không trả lời. 'only' chỉ dùng forwarders.
forwarders {
8.8.8.8; // Ví dụ: Google Public DNS
8.8.4.4; // Ví dụ: Google Public DNS
};
dnssec-validation auto; // Hoặc no, tùy thuộc vào yêu cầu bảo mật.
// ...
};
Luôn nhớ khởi động lại dịch vụ named sau bất kỳ thay đổi cấu hình nào.