Tăng cường hiệu suất mạng: Thiết lập máy chủ DNS cục bộ trên Linux với Dnsmasq

Linux tutorial - IT technology blog
Linux tutorial - IT technology blog

So sánh các phương pháp DNS: Tại sao Dnsmasq nổi bật

Khi nói đến phân giải DNS trong môi trường Linux của bạn, bạn có một số tùy chọn. Mỗi tùy chọn đều có những điểm mạnh và điểm yếu riêng. Hiểu được những khác biệt này sẽ làm nổi bật lý do tại sao một giải pháp nhẹ như Dnsmasq thực sự vượt trội.

Máy chủ DNS truyền thống đầy đủ tính năng: BIND

Đối với các mạng doanh nghiệp phức tạp, một máy chủ DNS mạnh mẽ như BIND (Berkeley Internet Name Domain) thường được coi là tiêu chuẩn công nghiệp. Nó tự hào có các tính năng mở rộng: chuyển vùng (zone transfers), DNSSEC, định tuyến phức tạp và tính sẵn sàng cao. Tuy nhiên, sức mạnh này đi kèm với một sự đánh đổi đáng kể: BIND tốn nhiều tài nguyên và nổi tiếng là phức tạp để cấu hình và bảo trì. Việc cố gắng thiết lập BIND cho một văn phòng nhỏ hoặc phòng lab tại nhà thường giống như dùng búa tạ để đập một hạt dẻ.

Trình phân giải DNS công cộng: Google DNS, Cloudflare DNS

Các trình phân giải DNS công cộng, chẳng hạn như Google DNS (8.8.8.8) hoặc Cloudflare DNS (1.1.1.1), mang lại những lợi thế rõ ràng. Chúng thường cung cấp khả năng phân giải nhanh hơn so với DNS do ISP cung cấp, thường đi kèm với các tính năng bảo mật nâng cao và thường tự hào có độ tin cậy tốt hơn.

Các dịch vụ này rất tuyệt vời để duyệt internet nói chung. Tuy nhiên, hạn chế chính của chúng là hoàn toàn không hỗ trợ phân giải tên miền nội bộ. Nếu bạn chạy các dịch vụ cục bộ hoặc môi trường phát triển dựa vào các tên máy chủ tùy chỉnh (ví dụ: dev.local), các trình phân giải công cộng đơn giản là sẽ không biết cách tìm chúng.

Systemd-Resolved

Nhiều bản phân phối Linux hiện đại, đặc biệt là những bản sử dụng systemd, thường sử dụng systemd-resolved. Dịch vụ này hoạt động như một trình phân giải DNS cục bộ, lưu vào bộ nhớ cache các truy vấn và hỗ trợ nhiều giao thức DNS khác nhau.

Nó thể hiện một sự cải thiện đáng kể so với việc chỉ dựa vào /etc/resolv.conf trực tiếp. Tuy nhiên, mặc dù systemd-resolved có cung cấp một số quản lý máy chủ cục bộ, việc lưu vào bộ nhớ cache của nó đôi khi kém mạnh mẽ hơn. Hơn nữa, việc cấu hình nó cho các tên miền nội bộ tùy chỉnh có thể không linh hoạt hoặc được hiểu rộng rãi như cách tiếp cận đơn giản hơn của Dnsmasq.

Dnsmasq: Nhà vô địch nhẹ nhàng

Dnsmasq thực sự đạt đến một điểm lý tưởng. Nó được xây dựng có mục đích như một bộ chuyển tiếp DNS và máy chủ DHCP nhẹ, dễ cấu hình. Nó đặc biệt nổi bật trong việc lưu vào bộ nhớ cache các truy vấn DNS từ các trình phân giải bên ngoài và cung cấp phân giải DNS cục bộ cho các tài nguyên mạng nội bộ của bạn. Sự đơn giản vốn có của nó có nghĩa là nó tiêu thụ tài nguyên hệ thống tối thiểu, khiến nó trở thành lựa chọn lý tưởng cho mọi thứ, từ một chiếc Raspberry Pi nhỏ bé đến một máy chủ sản xuất mà đơn giản là không yêu cầu sức mạnh lớn của BIND.

Dnsmasq: Cái hay, cái dở và thực tiễn

Sau khi chạy Dnsmasq trong sáu tháng trên máy chủ Ubuntu 22.04 sản xuất của tôi, có 4GB RAM, tôi có thể tự tin nói rằng phương pháp này đã giảm đáng kể thời gian xử lý. Điều này đặc biệt đúng đối với các dịch vụ nội bộ được truy cập thường xuyên và các tra cứu bên ngoài đã được lưu vào bộ nhớ cache. Nó đã chứng tỏ là một công cụ đáng tin cậy. Dưới đây là phân tích chi tiết về những quan sát của tôi:

Ưu điểm khi sử dụng Dnsmasq

  • Sử dụng tài nguyên nhẹ: Dnsmasq tự hào có dấu chân nhỏ, làm cho nó trở nên hoàn hảo cho các hệ thống có tài nguyên hạn chế. Trên thực tế, máy chủ của tôi hầu như không nhận thấy nó đang chạy.
  • Cấu hình dễ dàng: Tệp cấu hình chính, /etc/dnsmasq.conf, được chú thích rất tốt và trực quan. Bạn có thể thiết lập bộ nhớ cache DNS cơ bản và phân giải cục bộ hoạt động chỉ trong vài phút.
  • Lưu vào bộ nhớ cache DNS: Dnsmasq lưu vào bộ nhớ cache các truy vấn DNS một cách hiệu quả, tăng đáng kể tốc độ tra cứu tiếp theo cho các trang web hoặc dịch vụ nội bộ được truy cập thường xuyên. Điều này trực tiếp giúp tải trang nhanh hơn và thực thi lệnh nhanh hơn.
  • Phân giải DNS cục bộ: Nó có thể phân giải liền mạch tên máy chủ trực tiếp từ tệp /etc/hosts cục bộ của bạn hoặc từ các tệp máy chủ bổ sung, cung cấp một cách đơn giản để quản lý các tên miền nội bộ mà không cần sự phức tạp của một máy chủ DNS đầy đủ tính năng.
  • Khả năng máy chủ DHCP: Ngoài các chức năng DNS của nó, Dnsmasq cũng có thể đóng vai trò là máy chủ DHCP, tự động cung cấp địa chỉ IP cho các máy khách mạng. Tính năng này cực kỳ hữu ích cho các mạng nhỏ hơn, nơi một daemon DHCP chuyên dụng sẽ là quá mức cần thiết.
  • Hỗ trợ khởi động PXE: Đối với những người quản lý máy trạm không ổ đĩa hoặc yêu cầu cài đặt tự động, Dnsmasq tạo điều kiện thuận lợi cho việc khởi động PXE.

Nhược điểm khi sử dụng Dnsmasq

  • Không dành cho các doanh nghiệp lớn: Dnsmasq đơn giản là không được thiết kế cho các môi trường doanh nghiệp quy mô lớn, phức tạp yêu cầu các tính năng như ký DNSSEC, chuyển vùng nâng cao hoặc cấu hình tính sẵn sàng cao mạnh mẽ.
  • Tính năng nâng cao hạn chế: Khi so sánh với BIND, Dnsmasq đương nhiên thiếu nhiều tính năng nâng cao cần thiết cho các kịch bản DNS rất cụ thể. Tuy nhiên, đối với phần lớn các thiết lập gia đình và văn phòng nhỏ, các khả năng nâng cao này hiếm khi cần thiết.
  • Xung đột cấu hình với Systemd-Resolved: Trên các hệ thống Linux hiện đại, bạn sẽ cần đặc biệt cẩn thận để đảm bảo Dnsmasq và systemd-resolved không xung đột, nếu không có thể dẫn đến sự phức tạp không cần thiết.

Thiết lập được đề xuất: Khi Dnsmasq là lựa chọn tốt nhất của bạn

Dựa trên kinh nghiệm thực tế của tôi, Dnsmasq chứng tỏ là một lựa chọn tuyệt vời cho một số kịch bản cụ thể:

  • Mạng gia đình: Nó có thể cung cấp phân giải DNS nhanh hơn, đáng tin cậy hơn cho tất cả các thiết bị của bạn, cùng với việc quản lý tên máy chủ nội bộ dễ dàng cho các thiết bị như NAS, máy chủ media hoặc các thiết bị nhà thông minh.
  • Môi trường phát triển: Tăng tốc quy trình làm việc phát triển cục bộ của bạn bằng cách lưu vào bộ nhớ cache các truy vấn DNS bên ngoài và phân giải hiệu quả các tên miền tùy chỉnh cho các máy chủ ảo hoặc vùng chứa của bạn.
  • Mạng văn phòng nhỏ/chi nhánh: Dnsmasq cung cấp một cách đơn giản, tiết kiệm chi phí để quản lý cả DNS và DHCP mà không cần phần cứng chuyên dụng hoặc phần mềm phức tạp, đắt tiền.
  • Tối ưu hóa máy đơn: Ngay cả khi mục tiêu của bạn chỉ là tăng tốc độ phân giải DNS và quản lý một vài tên máy chủ cục bộ trên một máy Linux đơn lẻ, Dnsmasq vẫn là một giải pháp tuyệt vời, nhẹ.

Hướng dẫn triển khai: Thiết lập Dnsmasq trên Linux

Bây giờ, hãy cùng tìm hiểu quy trình cài đặt và cấu hình Dnsmasq trên một hệ thống Linux điển hình. Trọng tâm của tôi sẽ là một thiết lập ưu tiên bộ nhớ cache DNS hiệu quả và phân giải tên máy chủ cục bộ, được thiết kế để cùng tồn tại một cách duyên dáng với systemd-resolved nếu nó đã có mặt trên hệ thống của bạn.

Bước 1: Cài đặt Dnsmasq

Đầu tiên, bạn sẽ cần cài đặt gói dnsmasq. Các lệnh chính xác có thể thay đổi một chút tùy thuộc vào bản phân phối Linux của bạn:

Đối với các hệ thống dựa trên Debian/Ubuntu:


sudo apt update
sudo apt install dnsmasq

Đối với các hệ thống dựa trên RHEL/CentOS/Fedora:


sudo dnf install dnsmasq # Hoặc sudo yum install dnsmasq cho CentOS cũ hơn

Bước 2: Cấu hình Dnsmasq cơ bản

Tệp cấu hình chính cho Dnsmasq nằm tại /etc/dnsmasq.conf. Nó được chú thích rất nhiều, điều này rất hữu ích, nhưng để bắt đầu một cách thực sự sạch sẽ, tôi thường khuyên bạn nên sao lưu tệp gốc và tạo một tệp mới. Hoặc, bạn có thể chỉ cần bỏ ghi chú và sửa đổi các dòng liên quan trong tệp hiện có.

Hãy bắt đầu bằng cách sao lưu tệp gốc:


sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig
sudo touch /etc/dnsmasq.conf
sudo nano /etc/dnsmasq.conf

Đây là cấu hình cơ bản cho phép lưu vào bộ nhớ cache DNS và phân giải tên máy chủ cục bộ. Hãy nhớ điều chỉnh listen-address cho địa chỉ IP cụ thể của máy chủ của bạn. Nếu bạn chỉ định sử dụng Dnsmasq trên máy cục bộ của mình, 127.0.0.1 là hoàn toàn đủ. Tuy nhiên, nếu các thiết bị khác trên mạng của bạn nên sử dụng nó, hãy đảm bảo sử dụng IP mạng LAN của máy chủ của bạn (ví dụ: 192.168.1.10).


# Chỉ định các giao diện hoặc địa chỉ IP mà Dnsmasq sẽ lắng nghe
listen-address=127.0.0.1
# Nếu bạn muốn cho phép các thiết bị khác sử dụng nó, hãy thêm IP mạng LAN của bạn vào đây:
# listen-address=127.0.0.1,192.168.1.10

# Không chuyển tiếp các truy vấn trực tiếp đến /etc/resolv.conf.
# Chúng ta sẽ chỉ định rõ ràng các máy chủ DNS upstream của mình bằng cách sử dụng chỉ thị 'server' bên dưới.
no-resolv

# Chỉ định các máy chủ DNS upstream. Cloudflare và Google là những lựa chọn tuyệt vời, đáng tin cậy.
server=1.1.1.1
server=1.0.0.1
server=8.8.8.8
server=8.8.4.4

# Kích thước bộ nhớ cache: Điều này xác định số lượng mục DNS tối đa mà Dnsmasq sẽ lưu vào bộ nhớ cache. Mặc định là 150.
# Một bộ nhớ cache lớn hơn, chẳng hạn như 1000, rất có lợi cho các hệ thống được sử dụng tích cực.
cache-size=1000

# Đọc các tệp máy chủ bổ sung. Điều này cực kỳ hữu ích để tổ chức các tên miền tùy chỉnh.
# Tạo một thư mục cho các cấu hình tùy chỉnh, nếu bạn chưa có.
conf-dir=/etc/dnsmasq.d,.conf

# Ví dụ: Cấu hình máy chủ DHCP (bỏ ghi chú và điều chỉnh các dòng này nếu bạn cần Dnsmasq hoạt động như một máy chủ DHCP)
# dhcp-range=192.168.1.50,192.168.1.150,12h

# Thêm phân giải tên miền tùy chỉnh. Ví dụ, 'myservice.local' sẽ phân giải thành 192.168.1.20
# address=/myservice.local/192.168.1.20

# Đảm bảo các tên máy chủ nội bộ được định nghĩa trong /etc/hosts được phục vụ.
# Dnsmasq đọc /etc/hosts theo mặc định, nhưng việc ghi rõ ràng ở đây sẽ tăng cường độ rõ ràng.
# Bạn cũng có thể bao gồm các tệp máy chủ bổ sung, như thế này:
# addn-hosts=/etc/dnsmasq.d/my-internal-hosts

Bước 3: Quản lý các tên miền nội bộ

Dnsmasq đọc /etc/hosts một cách thuận tiện theo mặc định, điều này hoạt động hoàn hảo cho các tên máy chủ cục bộ đơn giản. Tuy nhiên, để có một cách tiếp cận có tổ chức hơn đối với các tên miền nội bộ tùy chỉnh, đặc biệt nếu bạn có nhiều, tôi đặc biệt khuyên bạn nên sử dụng các tệp riêng biệt trong thư mục /etc/dnsmasq.d/.

Hãy tạo một tệp mới, ví dụ, có tên /etc/dnsmasq.d/my-internal-hosts:


sudo nano /etc/dnsmasq.d/my-internal-hosts

Sau đó, thêm các mục tùy chỉnh của bạn vào tệp này, như sau:


# Các máy chủ nội bộ của tôi
192.168.1.100   dev-server.local
192.168.1.101   git-repo.local
192.168.1.102   jenkins.local

Điều quan trọng cần lưu ý là chỉ thị conf-dir=/etc/dnsmasq.d,.conf trong tệp dnsmasq.conf của bạn đảm bảo rằng các tệp bổ sung này được đọc tự động.

Bước 4: Tích hợp với Systemd-Resolved (Quan trọng đối với Ubuntu/Debian)

Trên các hệ thống mà systemd-resolved đang hoạt động (như Ubuntu 22.04), bạn phải cấu hình nó để hoạt động chính xác với Dnsmasq. Phương pháp đơn giản nhất liên quan đến việc tắt chức năng DNS tích hợp của systemd-resolved và sau đó trỏ /etc/resolv.conf trực tiếp đến phiên bản Dnsmasq của bạn.

Đầu tiên, dừng và tắt systemd-resolved, và xóa liên kết tượng trưng của nó cho /etc/resolv.conf:


sudo systemctl stop systemd-resolved
sudo systemctl disable systemd-resolved
sudo rm /etc/resolv.conf

Tiếp theo, tạo một tệp /etc/resolv.conf hoàn toàn mới, hướng dẫn hệ thống của bạn sử dụng Dnsmasq (lắng nghe trên 127.0.0.1):


sudo nano /etc/resolv.conf

Thêm nội dung sau:


nameserver 127.0.0.1

Cấu hình này yêu cầu hệ thống của bạn gửi tất cả các truy vấn DNS đến Dnsmasq. Để tăng cường tính ổn định, bạn có thể cân nhắc thêm một máy chủ DNS công cộng phụ. Tuy nhiên, hãy lưu ý rằng điều này đôi khi có thể bỏ qua bộ nhớ cache của Dnsmasq đối với một số truy vấn nhất định:


nameserver 127.0.0.1
nameserver 1.1.1.1

Bước 5: Khởi động và kích hoạt Dnsmasq

Bây giờ, đã đến lúc khởi động dịch vụ Dnsmasq và kích hoạt nó để tự động khởi chạy khi hệ thống khởi động:


sudo systemctl start dnsmasq
sudo systemctl enable dnsmasq
sudo systemctl status dnsmasq

Lệnh status sẽ xác nhận rằng Dnsmasq đang hoạt động và chạy mà không có vấn đề gì.

Bước 6: Kiểm tra và xác minh

Với Dnsmasq đã được cấu hình, điều quan trọng là phải xác nhận rằng mọi thứ đang hoạt động như mong đợi.

Kiểm tra bộ nhớ cache DNS:

Sử dụng lệnh dig (bạn có thể cần cài đặt nó bằng sudo apt install dnsutils trên Debian/Ubuntu hoặc sudo dnf install bind-utils trên các hệ thống RHEL/CentOS/Fedora). Chạy một truy vấn cho một tên miền chung, như google.com, hai lần liên tiếp. Hãy chú ý đến thời gian truy vấn. Truy vấn thứ hai sẽ nhanh hơn đáng kể, cho thấy rõ ràng rằng bộ nhớ cache đang hoạt động.


time dig google.com @127.0.0.1
time dig google.com @127.0.0.1

Tìm dòng Query time: trong kết quả. Lý tưởng nhất, truy vấn thứ hai sẽ hiển thị Query time: 0 msec nếu nó được phục vụ thành công từ bộ nhớ cache của Dnsmasq.

Kiểm tra phân giải tên miền nội bộ:

Tiếp theo, truy vấn một trong các tên miền nội bộ tùy chỉnh của bạn để đảm bảo nó phân giải chính xác:


dig dev-server.local @127.0.0.1

Bạn sẽ thấy địa chỉ IP bạn đã định nghĩa trước đó trong /etc/dnsmasq.d/my-internal-hosts xuất hiện trong ANSWER SECTION của kết quả.

Bằng cách làm theo các bước này, bạn đã thiết lập thành công một máy chủ DNS cục bộ mang lại khả năng phân giải nhanh hơn và quản lý tên máy chủ nội bộ dễ dàng. Thiết lập hợp lý này mang lại sự cải thiện đáng chú ý về khả năng phản hồi mạng mà không có chi phí lớn liên quan đến giải pháp DNS quy mô đầy đủ.

Share: