Xây dựng hạ tầng mạng riêng ảo an toàn với WireGuard và DNS nội bộ trên Ubuntu
Trong môi trường kỹ thuật hiện đại, việc kết nối an toàn từ xa đến các mạng nội bộ không còn chỉ giới hạn ở các giải pháp VPN truyền thống cồng kềnh như OpenVPN. WireGuard đã trở thành lựa chọn hàng đầu cho các kỹ sư hệ thống nhờ kiến trúc đơn giản, hiệu năng vượt trội và cơ chế mã hóa hiện đại. Bài viết này sẽ hướng dẫn chi tiết việc thiết lập một server WireGuard trên hệ điều hành Ubuntu, đồng thời tích hợp với dnsmasq để cung cấp dịch vụ DNS nội bộ, giúp các thiết bị trong mạng riêng (LAN) có thể giao tiếp qua các tên miền thân thiện thay vì địa chỉ IP khó nhớ.
Chuẩn bị môi trường và cài đặt phần mềm nền tảng
Trước khi đi vào cấu hình, chúng ta cần đảm bảo server đã được cập nhật hệ thống và cài đặt các công cụ cần thiết. WireGuard là một module kernel mới hơn so với IPsec hay OpenVPN, nên việc cập nhật kernel và cài đặt gói phần mềm tương thích là bước đầu tiên quan trọng. Chúng ta sẽ sử dụng hệ quản lý gói APT để cài đặt WireGuard và dnsmasq, một bộ máy DNS và DHCP nhẹ nhưng mạnh mẽ phù hợp cho server nhỏ và vừa.
Trước hết, hãy chạy lệnh cập nhật danh sách phần mềm và nâng cấp các gói hiện có để đảm bảo sự ổn định của hệ thống. Sau đó, cài đặt WireGuard và dnsmasq. Việc sử dụng dnsmasq ở đây là để server này không chỉ đóng vai trò là điểm kết nối VPN (Gateway) mà còn là máy chủ DNS cho các client, cho phép chúng giải quyết tên miền nội bộ hoặc truy cập internet nhanh chóng.
sudo apt update && sudo apt upgrade -y
sudo apt install wireguard dnsmasq ufw -y
Sau khi cài đặt xong, hãy khởi động và bật tự động chạy WireGuard và dnsmasq để đảm bảo các dịch vụ này hoạt động ngay cả khi server khởi động lại. Đây là quy tắc vàng trong quản trị hệ thống: đảm bảo dịch vụ luôn sẵn sàng.
sudo systemctl enable --now wg-quick@%I
sudo systemctl enable --now dnsmasq
Cấu hình giao diện mạng và định tuyến cho WireGuard
Cấu hình của WireGuard nằm trong file có đuôi .conf thường được đặt tại thư mục /etc/wireguard/. Chúng ta sẽ tạo một file cấu hình chính cho server, gọi là wg0.conf. Trong file này, chúng ta cần định nghĩa khóa riêng tư (PrivateKey), địa chỉ IP nội bộ của server (Endpoint), và các thông số định tuyến. Một điểm quan trọng là cần chỉ rõ PostUp và PostDown để kích hoạt NAT (Network Address Translation), cho phép các client trong mạng VPN truy cập ra internet thông qua IP công cộng của server.
Để tạo cặp khóa, chúng ta sử dụng lệnh wg genkey. Bạn sẽ lưu khóa riêng tư vào file và khóa công khai để phát cho client. Dưới đây là ví dụ về việc tạo file cấu hình server với mạng nội bộ là 10.10.0.0/24. Server sẽ có địa chỉ 10.10.0.1.
cd /etc/wireguard
wg genkey | tee privatekey | wg pubkey > publickey
Sau khi có khóa, chúng ta tạo file cấu hình wg0.conf. Lưu ý phần PostUp sử dụng iptables để bật chuyển tiếp gói tin và quy tắc NAT để masquerade (giả mạo) các gói tin từ mạng WireGuard ra ngoài. Phần PostDown sẽ gỡ bỏ các quy tắc này khi tunnel tắt đi để đảm bảo sạch sẽ.
Để đơn giản hóa việc viết file, bạn có thể dùng cat để xuất nội dung trực tiếp vào file cấu hình như sau:
cat < /etc/wireguard/wg0.conf
[Interface]
PrivateKey =
Address = 10.10.0.1/24
ListenPort = 51820
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
SaveConfig = true
EOF
Trong đoạn code trên, thay thế <KHOA_RIEN_TU_TUA> bằng nội dung thực tế của file privatekey mà bạn vừa tạo. Hãy lưu ý thay đổi giao diện mạng eth0 thành tên giao diện mạng thực tế của server (có thể là ens33, enp0s3 hoặc khác tùy vào môi trường). Sau khi lưu, kích hoạt giao diện bằng lệnh:
sudo wg-quick up wg0
Tích hợp DNS nội bộ với dnsmasq
Để các client trong mạng WireGuard có thể truy cập các dịch vụ nội bộ bằng tên miền, chúng ta cần cấu hình dnsmasq. Mục tiêu là khi một client trong mạng 10.10.0.0/24 gửi yêu cầu DNS, dnsmasq sẽ trả về địa chỉ IP nội bộ nếu đó là tên miền nội bộ, hoặc chuyển tiếp ra DNS upstream (như 8.8.8.8) nếu đó là tên miền internet.
Bạn cần chỉnh sửa file cấu hình mặc định của dnsmasq hoặc tạo một file cấu hình riêng trong thư mục /etc/dnsmasq.d/ để tránh làm mất cấu hình gốc khi nâng cấp gói. Hãy tạo file wireguard.conf để chỉ định dnsmasq lắng nghe trên giao diện wg0 và định nghĩa các tên miền nội bộ.
cat < /etc/dnsmasq.d/wireguard.conf
interface=wg0
bind-interfaces
server=8.8.8.8
dhcp-range=10.10.0.10,10.10.0.100,255.255.255.0,12h
dhcp-option=6,10.10.0.1
domain=lan.local
EOF
Đoạn cấu hình trên thực hiện các tác vụ sau: Lắng nghe trên giao diện wg0, sử dụng DNS Google 8.8.8.8 cho các truy vấn ngoài mạng, cấp phát địa chỉ IP động trong dải 10.10.0.10 đến 10.10.0.100, và quan trọng nhất là đặt tên miền nội bộ là lan.local. Khi client cấu hình DNS là 10.10.0.1, chúng sẽ tự động được thêm đuôi .lan.local cho các truy vấn nội bộ.
Bạn có thể mở rộng chức năng này bằng cách thêm các bản ghi tĩnh (static hosts) nếu muốn server có một tên miền cố định. Ví dụ, nếu bạn muốn truy cập server bằng tên server.lan.local, hãy thêm dòng sau vào file cấu hình:
echo "address=/server.lan.local/10.10.0.1" >> /etc/dnsmasq.d/wireguard.conf
Sau khi hoàn tất chỉnh sửa, hãy khởi động lại dnsmasq để áp dụng thay đổi. Đồng thời, đảm bảo firewall (ufw) cho phép lưu chuyển DNS (UDP 53) và WireGuard (UDP 51820).
sudo systemctl restart dnsmasq
sudo ufw allow 51820/udp
sudo ufw allow 53/udp
Cấu hình Client và kiểm tra kết nối
Phía client, bạn cần cài đặt WireGuard và tạo file cấu hình tương ứng. Client cần biết khóa riêng tư của chính nó, khóa công khai của server, và địa chỉ IP của server (IP công cộng). Bạn cũng cần chỉ định DNS = 10.10.0.1 để client sử dụng máy chủ DNS nội bộ mà chúng ta vừa cấu hình.
Trên client, tạo cặp khóa và file cấu hình client.conf với nội dung như sau (giả sử IP server công cộng là 203.0.113.10):
cd /etc/wireguard
wg genkey | tee privatekey | wg pubkey > publickey
Nội dung file cấu hình client sẽ bao gồm:
cat < /etc/wireguard/wg0.conf
[Interface]
PrivateKey =
Address = 10.10.0.2/24
DNS = 10.10.0.1
[Peer]
PublicKey =
AllowedIPs = 0.0.0.0/0
Endpoint = 203.0.113.10:51820
PersistentKeepalive = 25
EOF
Thay thế các giá trị <KHOA_RIEN_TU_CLIENT>, <KHOA_CONG_KAI_SERVER> và địa chỉ IP server cho phù hợp. Tham số PersistentKeepalive giúp giữ kết nối tunnel mở ngay cả khi không có dữ liệu, rất hữu ích để xuyên tường lửa NAT của nhà mạng. Sau đó, khởi động tunnel bằng lệnh wg-quick up wg0.
Để kiểm tra hệ thống, bạn có thể thử ping từ client sang server bằng địa chỉ IP nội bộ 10.10.0.1. Nếu ping thành công, hãy thử truy cập bằng tên miền nội bộ mà bạn đã định nghĩa, ví dụ ping server.lan.local. Nếu nhận được phản hồi, chứng tỏ cấu hình DNS nội bộ thông qua dnsmasq đã hoạt động chính xác. Bạn cũng có thể kiểm tra trạng thái các gói tin và handshake bằng lệnh wg show để đảm bảo kết nối ổn định và an toàn.
Việc kết hợp WireGuard với dnsmasq mang lại một giải pháp mạng riêng ảo không chỉ bảo mật cao mà còn linh hoạt trong việc quản lý tên miền nội bộ. Đây là nền tảng tuyệt vời để xây dựng các mạng LAN ảo cho chi nhánh, làm việc từ xa an toàn, hoặc kết nối các dịch vụ nội bộ qua internet mà không cần phơi bày chúng trực tiếp ra công cộng. Hãy nhớ luôn cập nhật phần mềm và quản lý khóa bí mật một cách chặt chẽ để duy trì tính an toàn của hệ thống.