Xây dựng hạ tầng mạng an toàn với WireGuard và DNS nội bộ trên Linux
Trong bối cảnh làm việc từ xa và nhu cầu kết nối an toàn giữa các địa điểm ngày càng tăng, việc kết hợp giữa một mạng riêng ảo (VPN) hiệu năng cao như WireGuard và hệ thống phân giải tên miền (DNS) nội bộ là giải pháp tối ưu cho các kỹ sư hệ thống. Bài viết này sẽ đi sâu vào quy trình triển khai một server WireGuard trên Linux, đồng thời cấu hình để nó đóng vai trò là điểm trung chuyển (gateway) cho các request DNS nội bộ, giúp đơn giản hóa việc truy cập các dịch vụ trong mạng nội bộ mà không cần nhớ địa chỉ IP.
Cấu hình cơ bản cho Server WireGuard
Bước đầu tiên là chuẩn bị môi trường trên máy chủ Linux. Chúng ta sẽ sử dụng Ubuntu hoặc Debian làm nền tảng. Trước khi cài đặt, hãy đảm bảo đã cập nhật kho phần mềm và cài đặt các gói cần thiết để xử lý mạng. WireGuard yêu cầu mô-đun nhân (kernel module) để hoạt động, do đó việc cài đặt gói phần mềm sẽ tự động tải và kích hoạt mô-đun này. Sau đó, chúng ta cần tạo cặp khóa riêng tư và công khai, đây là cơ sở để xác thực kết nối giữa client và server.
sudo apt update && sudo apt install -y wireguard
wg genkey | sudo tee /etc/wireguard/server-private.key
chmod 600 /etc/wireguard/server-private.key
wg pubkey -i /etc/wireguard/server-private.key | sudo tee /etc/wireguard/server-public.key
Khi đã có cặp khóa, bước tiếp theo là tạo file cấu hình chính cho server tại đường dẫn chuẩn. Trong file này, chúng ta định nghĩa địa chỉ IP của giao diện WireGuard trên server, cổng lắng nghe (thường là 51820/udp) và các dải mạng mà server sẽ định tuyến (allowed IPs). Việc cấu hình đúng allowed IPs là rất quan trọng để đảm bảo server biết cách trả lời traffic cho các client đã kết nối. Sau đó, ta kích hoạt file cấu hình bằng lệnh ip netns hoặc trực tiếp qua systemctl tùy phiên bản, nhưng cách chuẩn nhất là dùng lệnh wg-quick.
sudo nano /etc/wireguard/wg0.conf
Trong file cấu hình đó, nội dung cần bao gồm phần [Interface] để khai báo địa chỉ IP nội bộ của server (ví dụ: 10.200.0.1), cổng lắng nghe và file khóa riêng tư. Tiếp theo là phần [Peer] để khai báo thông tin của các client, bao gồm khóa công khai của client và dải mạng mà client đó được phép truy cập. Lưu ý rằng mỗi client sẽ có một đoạn [Peer] riêng biệt nếu bạn muốn quản lý chi tiết hoặc gộp chung nếu tất cả đều nằm trong cùng một mạng con. Sau khi lưu file, ta cần khởi động giao diện mạng và đảm bảo nó tự động chạy khi khởi động lại máy.
sudo wg-quick up wg0
sudo systemctl enable wg-quick@wg0
Cấu hình định tuyến và chuyển tiếp gói tin
Việc chỉ kích hoạt giao diện WireGuard chưa đủ để các client có thể truy cập ra internet hoặc các dịch vụ khác. Hệ điều hành Linux mặc định sẽ không chuyển tiếp các gói tin từ giao diện này sang giao diện khác nếu chưa được kích tính đặc tính này. Chúng ta cần bật chế độ chuyển tiếp gói tin (IP forwarding) trong nhân Linux để đóng vai trò như một router. Điều này cho phép lưu lượng từ client (mạng WireGuard) được chuyển tiếp ra internet qua giao diện mạng vật lý (eth0 hoặc ens33) của server.
sudo sysctl -w net.ipv4.ip_forward=1
Tuy nhiên, thay đổi tạm thời trên dòng lệnh sẽ mất khi khởi động lại máy. Để cấu hình bền vững, ta cần chỉnh sửa file cấu hình sysctl. Ngoài ra, firewall (ufw hoặc iptables) cần được cấu hình để cho phép lưu lượng NAT (Masquerading) đi qua cổng WireGuard. Điều này đảm bảo rằng các gói tin từ mạng nội bộ đi ra internet sẽ được ghi đè địa chỉ IP nguồn thành địa chỉ IP của server, giúp máy chủ đích phản hồi đúng địa chỉ trả về cho server VPN.
echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf
sudo ufw allow 51820/udp
sudo ufw route --allow in on wg0 out on eth0 to any
Hãy lưu ý rằng tên giao diện mạng vật lý (eth0, ens33, enp1s0) có thể khác nhau tùy thuộc vào phần cứng và hệ điều hành cụ thể, bạn cần kiểm tra bằng lệnh ip link show để xác định đúng tên giao diện trước khi cấu hình quy tắc ufw.
Tích hợp DNS nội bộ để truy cập dịch vụ
Một trong những điểm mạnh nhất của việc tự quản trị hạ tầng VPN là khả năng tùy biến hệ thống DNS. Thay vì bắt người dùng nhớ các địa chỉ IP như 192.168.1.100 để truy cập server web nội bộ, ta có thể cấu hình server WireGuard trở thành một máy chủ DNS. Khi client kết nối, ta sẽ chỉ định DNS của họ trỏ về địa chỉ IP của giao diện WireGuard trên server. Sau đó, ta cài đặt và cấu hình phần mềm dnsmasq trên server để xử lý các request DNS này.
sudo apt install -y dnsmasq
sudo nano /etc/dnsmasq.d/wireguard.conf
Trong file cấu hình dnsmasq, ta sẽ định nghĩa các bản ghi tên miền nội bộ. Ví dụ, nếu bạn có một server web nội bộ với IP là 10.0.0.5, bạn có thể khai báo để tên myapp.internal trỏ về địa chỉ đó. Khi client trong mạng WireGuard gõ myapp.internal vào trình duyệt, dnsmasq sẽ trả về địa chỉ IP đúng. Để cấu hình hoạt động hiệu quả, ta cũng cần chỉ định upstream DNS (như Google 8.8.8.8 hoặc Cloudflare 1.1.1.1) để dnsmasq giải quyết các tên miền công cộng mà nó không biết.
address=/internal/10.0.0.5
server=/internal/10.200.0.1
server=8.8.8.8
interface=wg0
bind-interfaces
Sau khi cấu hình xong, ta cần khởi động lại dịch vụ dnsmasq để áp dụng thay đổi. Quan trọng hơn, trong file cấu hình wg0.conf của server, ta cần thêm dòng AllowedIPs để đảm bảo server có thể định tuyến traffic quay lại cho client nếu cần, và ở phía client, trong file cấu hình của họ, trường DNS phải được điền bằng địa chỉ IP của server WireGuard (ví dụ: 10.200.0.1). Điều này tạo thành một vòng khép kín nơi tất cả các request DNS đều được xử lý bởi server, giúp quản lý tên miền nội bộ cực kỳ đơn giản.
sudo systemctl restart dnsmasq
sudo systemctl restart wg-quick@wg0
Kiểm tra và xác minh kết nối
Sau khi hoàn tất các bước cấu hình, bước cuối cùng là xác minh tính toàn vẹn của hệ thống. Hãy đảm bảo rằng client đã cấu hình đúng và đã kết nối thành công với server. Bạn có thể kiểm tra trạng thái kết nối trên server bằng lệnh hiển thị thông tin peer. Nếu thấy "Transfer" tăng dần và thời gian ping gần đây, chứng tỏ kết nối đang hoạt động ổn định. Ngoài ra, hãy thử thực hiện lệnh ping từ client đến các tên miền nội bộ đã cấu hình trong dnsmasq để chắc chắn rằng hệ thống DNS đang phân giải đúng.
sudo wg show
ping -c 4 10.200.0.1
ping -c 4 myapp.internal
Với kiến trúc này, bạn đã xây dựng được một đường hầm mạng an toàn, mã hóa mạnh mẽ nhờ WireGuard, kết hợp với khả năng quản lý tên miền linh hoạt qua dnsmasq. Giải pháp này không chỉ giúp bảo vệ dữ liệu khi truyền tải trên mạng công cộng mà còn mang lại trải nghiệm người dùng thân thiện, loại bỏ sự phức tạp của việc ghi nhớ địa chỉ IP tĩnh. Đây là nền tảng vững chắc để mở rộng thêm các tính năng như xác thực người dùng, chia nhỏ mạng VLAN, hoặc tích hợp với các hệ thống quản lý tập trung trong tương lai.