Hướng dẫn triển khai mạng riêng ảo WireGuard kết hợp với DNS nội bộ trên Linux
Trong bối cảnh mạng doanh nghiệp và cá nhân ngày càng phức tạp, việc bảo mật đường truyền kết nối từ xa là yếu tố sống còn. Nhiều tổ chức vẫn đang sử dụng các giải pháp VPN cũ như IPSec hoặc OpenVPN với cấu hình cồng kềnh và hiệu năng chưa thực sự tối ưu. WireGuard là một giải pháp thay thế hiện đại, được tích hợp sẵn vào nhân Linux, mang lại tốc độ cao, độ trễ thấp và cấu hình đơn giản hơn nhiều lần. Bài viết này sẽ hướng dẫn bạn cách xây dựng một máy chủ VPN WireGuard từ con số không, đồng thời tích hợp dịch vụ DNS nội bộ để các thiết bị đầu cuối có thể giải quyết tên miền nội bộ (mạng nội bộ) một cách mượt mà mà không cần cấu hình thủ công.
Chuẩn bị môi trường và cài đặt phần mềm
Để bắt đầu, chúng ta cần một máy chủ Linux. Tôi khuyến nghị sử dụng Ubuntu Server hoặc Debian ổn định. Trước hết, hãy cập nhật hệ thống và cài đặt gói tiện ích WireGuard. Vì WireGuard đã nằm trong nhân Linux hiện đại, bạn chỉ cần cài đặt công cụ quản lý cấu hình. Việc này sẽ cho phép bạn tạo khóa, cấu hình giao diện và điều khiển tunnel. Sau khi cài đặt xong, bước quan trọng nhất là tạo cặp khóa công khai và bí mật cho máy chủ. Khóa bí mật phải được giữ tuyệt đối an toàn, còn khóa công khai sẽ được chia sẻ cho các khách hàng kết nối. Bạn có thể sử dụng lệnh tiện ích để thực hiện việc này trực tiếp trong terminal. Việc tạo khóa riêng cho máy chủ là nền tảng của toàn bộ hệ thống bảo mật sau này.
sudo apt update && sudo apt install -y wireguard
wg genkey | tee server_private_key | wg pubkey > server_public_key
Sau khi có khóa của máy chủ, chúng ta cần cấu hình file mạng. File cấu hình chính của WireGuard thường nằm tại thư mục /etc/wireguard/. Chúng ta sẽ đặt tên file là wg0.conf để đại diện cho giao diện mạng ảo đầu tiên. Trong file này, chúng ta cần khai báo địa chỉ IP mà máy chủ sẽ sử dụng trên đường hầm ảo. Địa chỉ này thường nằm trong dải mạng nội bộ riêng, ví dụ như 10.64.0.0/16. Giao diện cần được thiết lập chế độ Listening trên một cổng cụ thể, phổ biến nhất là UDP 51820 để tránh xung đột với các dịch vụ khác.
cat > /etc/wireguard/wg0.conf <
Address = 10.64.0.1/16
ListenPort = 51820
[Peer]
PublicKey =
AllowedIPs = 10.64.0.2/32
EOF
Lưu ý, trong ví dụ trên, phần cần được thay thế bằng nội dung thực tế của file server_private_key mà bạn đã tạo ở bước trước. Phần AllowedIPs chỉ định địa chỉ IP nào được phép truyền qua đường hầm từ peer này. Khi bạn thêm nhiều khách hàng, bạn sẽ thêm nhiều đoạn [Peer] tương ứng vào file này.
Tích hợp DNS nội bộ để giải quyết tên miền LAN
Một vấn đề phổ biến khi sử dụng VPN là khách hàng kết nối vào được nhưng không thể ping hoặc truy cập các tên miền nội bộ như server.lan hay printer.office. Lý do là trình duyệt hoặc hệ điều hành của khách hàng không biết cách phân giải các tên miền này qua đường hầm VPN. Để giải quyết triệt để vấn đề này, chúng ta cần cấu hình máy chủ WireGuard đóng vai trò là DNS Server cho mạng ảo. Trên Linux, gói phần mềm dnsmasq là lựa chọn hoàn hảo vì nó nhẹ, hiệu năng cao và dễ cấu hình. Dnsmasq có thể được cấu hình để lắng nghe trên địa chỉ IP của giao diện WireGuard, từ đó xử lý các yêu cầu DNS của các client.
Cài đặt dnsmasq và cấu hình file config để nó chỉ lắng nghe trên giao diện wg0 là bước then chốt. Chúng ta cần đảm bảo dnsmasq không can thiệp vào DNS của mạng vật lý mà chỉ xử lý các request đến từ mạng ảo 10.64.0.0/16. Trong file cấu hình dnsmasq, bạn khai báo địa chỉ listen và hướng dẫn nó forward các request không nhận diện được đến DNS của nhà cung cấp hoặc Google (8.8.8.8). Điều này giúp client vừa truy cập được nội bộ, vừa ra được internet.
sudo apt install -y dnsmasq
cat > /etc/dnsmasq.d/wireguard.conf <
Sau khi cấu hình xong dnsmasq, bạn cần khởi động lại dịch vụ này để áp dụng thay đổi. Việc khai báo address=/lan/10.64.0.1 trong file trên có nghĩa là bất kỳ ai trong mạng VPN gõ tên server.lan hoặc laptop.lan thì dnsmasq sẽ trả về địa chỉ IP 10.64.0.1 (giả định đây là IP của máy chủ chính). Nếu bạn muốn phân giải nhiều host khác nhau, bạn có thể thêm nhiều dòng address tương ứng hoặc sử dụng file hosts bên trong dnsmasq. Quan trọng hơn, bạn cần cấu hình lại file wg0.conf của máy chủ để chỉ định địa chỉ DNS cho khách hàng. Tham số DNS trong phần [Peer] hoặc [Interface] sẽ tự động đẩy cấu hình DNS này về máy client khi họ kết nối.
sudo systemctl restart dnsmasq
cat >> /etc/wireguard/wg0.conf <
Kích hoạt Firewall và quy tắc định tuyến
Để hệ thống hoạt động ổn định và an toàn, bạn không thể chỉ dừng lại ở việc cài đặt WireGuard và DNS. Bạn cần cấu hình tường lửa để chỉ cho phép lưu lượng từ bên ngoài truy cập vào cổng 51820 của WireGuard, và quan trọng hơn là bật tính năng chuyển tiếp gói tin (IP Forwarding). Nếu không bật IP Forwarding, máy chủ sẽ nhận được gói tin từ client nhưng sẽ không chuyển tiếp nó ra internet hoặc sang các máy khác trong mạng nội bộ. Bạn có thể bật tính năng này vĩnh viễn bằng cách chỉnh sửa file sysctl.conf hoặc dùng lệnh tạm thời để kiểm tra.
echo 1 > /proc/sys/net/ipv4/ip_forward
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
Bên cạnh đó, bạn cần cấu hình iptables hoặc ufw (trên Ubuntu) để chấp nhận lưu lượng NAT (Network Address Translation). Điều này cho phép các thiết bị trong mạng ảo (như client của bạn) truy cập internet như thể chúng đang ở trong mạng nội bộ của máy chủ. Nếu bạn sử dụng ufw, lệnh sẽ giúp mở cổng UDP và cho phép chuyển tiếp gói tin. Việc cấu hình firewall chính xác sẽ đảm bảo chỉ có lưu lượng hợp lệ đi qua, ngăn chặn các cuộc tấn công từ bên ngoài vào máy chủ. Đây là bước cuối cùng nhưng cực kỳ quan trọng để đảm bảo tính bảo mật của hạ tầng bạn vừa xây dựng.
sudo ufw allow 51820/udp
sudo ufw enable
sudo ufw allow --in-interface wg0 --out-interface eth0 --comment "Allow NAT from WG"
Để kiểm tra xem cấu hình có hiệu quả hay không, bạn hãy khởi động giao diện WireGuard. Sau đó, trên một thiết bị client (điện thoại hoặc máy tính khác), bạn cài đặt ứng dụng WireGuard, nhập file cấu hình đã được máy chủ tạo ra cho client (bao gồm cả thông tin DNS), và bật kết nối. Khi kết nối thành công, hãy thử ping tên miền nội bộ như server.lan hoặc laptop.lan. Nếu bạn nhận được đáp trả từ máy chủ và có thể truy cập internet bình thường, đồng thời các tên miền nội bộ được phân giải đúng, thì hệ thống của bạn đã hoạt động hoàn hảo. Đây là một kiến trúc mạng vừa đơn giản, vừa mạnh mẽ và an toàn cho nhu cầu làm việc từ xa hay bảo vệ dữ liệu cá nhân.