Khi bạn truy cập một trang web bằng tên miền của trang web đó, hệ thống của bạn sẽ gửi yêu cầu đến máy chủ DNS để lấy địa chỉ IP cho domain đó. Cặp địa chỉ IP-domain này được lưu trong cache DNS để sử dụng sau này, do đó bạn không phải gửi yêu cầu đến máy chủ DNS mỗi lần để tạo kết nối.
Nhưng đôi khi, cache DNS cục bộ bị hỏng và gây ra lỗi HTTP. May mắn thay, việc xóa và xây dựng lại cache DNS trên máy tính Linux rất đơn giản. Sau đây là cách thực hiện.
Tại sao phải xóa cache DNS trên Linux?
Có một số lý do khiến bạn có thể muốn build lại cache DNS được lưu trữ trên hệ thống của mình. Có thể bạn có bản ghi DNS lỗi thời cho một trang web và muốn lấy lại từ máy chủ DNS. Hoặc có thể hệ thống của bạn đã bị xâm phạm và bạn muốn đảm bảo rằng cache DNS không bị can thiệp, còn được gọi là giả mạo DNS.
Khi bạn xóa cache DNS, hệ thống phải ping lại máy chủ DNS và lấy bản ghi địa chỉ IP-domain mới từ đó, xóa mọi dữ liệu lỗi thời hoặc bị xâm phạm trong quá trình này.
Cách xem cache DNS cục bộ trên Linux
Trước systemd, hầu hết các bản phân phối Linux đều không có cache DNS trên toàn hệ thống, trừ khi một chương trình như dnsmasq hoặc nscd được thiết lập thủ công. systemd đi kèm với systemd-resolved, một service phân giải tên miền thành địa chỉ IP và lưu cache các mục nhập DNS.
Các phần sau sẽ hướng dẫn bạn cách xem nội dung cache DNS do systemd-resolved, nscd và dnsmasq tạo ra, để bạn có thể hiểu dữ liệu được lưu trữ trước khi quyết định xóa dữ liệu đó.
Xem cache DNS cho systemd-resolved
Để xem các bản ghi cache systemd-resolved, trước tiên bạn cần tạm thời tắt service, sau đó xuất nhật ký của service đó sang file.
Bắt đầu bằng cách gửi tín hiệu SIGUSR1 để tắt service systemd-resolved:
sudo killall -USR1 systemd-resolved
Sử dụng lệnh journalctl và toán tử đầu ra chuẩn để lưu đầu ra vào file văn bản:
sudo journalctl -u systemd-resolved > ~/cache.txt
Sau đó, bạn có thể xem nội dung của file bằng trình soạn thảo văn bản như Vim:
vim ~/cache.txt
Trong file, hãy tìm kiếm "CACHE:" bằng cách nhấn Escape, nhập "/CACHE:" và nhấn Enter. Tất cả các bản ghi DNS được liệt kê trong CACHE: Đều là một phần của cache DNS cục bộ. Nhấn n để chuyển đến tập hợp mục nhập DNS tiếp theo nếu bạn đang sử dụng Vim.
Xem cache DNS cục bộ cho nscd
Để xem cache cục bộ do nscd tạo ra, bạn cần đọc nội dung của cơ sở dữ liệu máy chủ nscd bằng lệnh strings.
Trên các bản phân phối dựa trên Debian và Ubuntu, file này nằm tại /var/cache/nscd/hosts. Chạy lệnh sau để xem file:
sudo strings /var/cache/nscd/hosts | uniq
Để xem số liệu thống kê chung về cache DNS nscd, hãy sử dụng flag -g:
sudo nscd -g
Hiển thị cache DNS do dnsmasq tạo ra
dnsmasq lưu cache DNS trong bộ nhớ nên không dễ để có được các bản ghi chính xác. Nhưng bạn có thể gửi tín hiệu kill đến dnsmasq và ghi lại đầu ra của nó để biết số lượng truy vấn DNS được xử lý.
Để thực hiện, trước tiên, hãy đảm bảo dnsmasq đang hoạt động bằng cách sử dụng lệnh systemctl:
sudo systemctl status dnsmasq
Nếu trạng thái hiển thị Active, hãy chạy lệnh sau để tắt service:
sudo pkill -USR1 dnsmasq
Sử dụng lệnh journalctl, trích xuất nhật ký dnsmasq và lưu chúng vào file văn bản:
sudo journalctl -u dnsmasq > ~/cache.txt
Cuối cùng, hãy xem nội dung của file bằng tiện ích xem file như cat hoặc less:
cat ~/cache.txt
Cách xóa cache DNS trên Linux
Xóa cache DNS có nghĩa là xóa các bản ghi DNS được lưu trong cache khỏi máy tính. Điều này buộc nó phải gửi yêu cầu đến máy chủ DNS để truy xuất các mục DNS mới.
Đây là cách bạn có thể xóa cache DNS trên Linux:
Sử dụng giải pháp systemd
Bạn có thể sử dụng lệnh Resolvectl để xóa cache DNS được lưu trữ bởi systemd-resolved:
sudo resolvectl flush-caches
Nếu bạn đang chạy Ubuntu 17.04 hoặc 18.04, hãy sử dụng lệnh systemd-resolved để xóa cache:
sudo systemd-resolved --flush-caches
Xóa cache DNS nscd trên Linux
Cách thuận tiện nhất để xóa cache DNS cho nscd là khởi động lại service. Bạn có thể làm như vậy bằng cách chạy:
sudo /etc/init.d/nscd restart
Nếu cách đó không hiệu quả, trước tiên, hãy kiểm tra xem cache cục bộ được lưu trên PC có liên tục hay không. Bạn có thể sử dụng flag -g để xác minh nó:
sudo nscd -g
Nếu đúng như vậy, hãy sử dụng flag -i với lệnh nscd để xóa các bản ghi (i là viết tắt của invalidate):
sudo nscd -i hosts
Xóa cache DNS dnsmasq
Việc xóa cache DNS do dnsmasq tạo ra rất đơn giản. Vì cache được lưu trong bộ nhớ nên việc khởi động lại service sẽ xóa tất cả các mục được lưu trữ.
Để khởi động lại dnsmasq, hãy chạy lệnh systemctl sau:
sudo systemctl restart dnsmasq
Hoặc, đưa ra lệnh sau:
service dnsmasq restart
Nhập mật khẩu admin nếu được nhắc. dnsmasq bây giờ sẽ khởi động lại và tất cả các mục DNS hiện có sẽ bị xóa khỏi cache.
Sau khi xóa cache DNS, tốt nhất bạn nên xem các mục trong cache cục bộ và xác minh xem dữ liệu đã được xóa thành công hay chưa. Bạn có thể sử dụng dig, một trong nhiều lệnh Linux khắc phục sự cố mạng và kiểm tra giá trị thời gian truy vấn ở đầu ra. Nếu lớn hơn 0 mili giây thì cache đã được xóa thành công (0 mili giây có nghĩa là bản ghi domain vẫn còn trong cache).
dig google.com