Xây dựng hạ tầng mạng an toàn và riêng tư với WireGuard và DNS nội bộ
Trong bối cảnh bảo mật mạng ngày càng phức tạp, việc sử dụng các giao thức VPN cổ điển như IPsec hay OpenVPN đôi khi trở nên cồng kềnh và khó quản lý, đặc biệt là trên các thiết bị di động hay mạng có băng thông thấp. WireGuard đã xuất hiện như một giải pháp thay thế hiện đại, tận dụng các thuật toán mã hóa tiên tiến nhất để đạt được hiệu năng vượt trội. Tuy nhiên, một mạng VPN chỉ thực sự hữu ích khi nó được tích hợp liền mạch với hệ thống DNS nội bộ, cho phép các thiết bị truy cập tài nguyên nội bộ bằng tên miền thân thiện mà không cần nhớ địa chỉ IP. Bài viết này sẽ hướng dẫn các kỹ sư phần mềm và sysadmin cách triển khai một mạng riêng ảo dựa trên WireGuard, kết hợp với máy chủ DNS Pi-hole để lọc quảng cáo và định tuyến lưu lượng truy cập nội bộ an toàn trên hệ điều hành Linux.
Chuẩn bị môi trường và cài đặt WireGuard
Trước khi bắt đầu cấu hình các tham số mạng phức tạp, chúng ta cần chuẩn bị một máy chủ Linux đóng vai trò là Node Gateway. Giả sử chúng ta đang làm việc trên một máy chủ Ubuntu hoặc Debian chạy trên nền tảng cloud hoặc máy chủ vật lý tại nhà. Bước đầu tiên là cập nhật hệ thống và cài đặt các gói phần mềm cần thiết. WireGuard đã được tích hợp sẵn trong nhân Linux từ phiên bản 5.6 trở lên, do đó trên các hệ thống mới, chúng ta chỉ cần cài đặt các công cụ điều khiển từ dòng lệnh.
Để bắt đầu, hãy thực hiện lệnh cập nhật kho dữ liệu và cài đặt gói wire-tools, đây là bộ công cụ chính để quản lý giao diện và cấu hình của WireGuard.
sudo apt update && sudo apt install -y wire-tools
Sau khi cài đặt xong, chúng ta cần tạo một cặp khóa mã hóa (Private Key và Public Key) cho máy chủ. Điều này là bắt buộc để thiết lập kênh bảo mật. Sử dụng lệnh wg genkey, chúng ta sẽ tạo khóa riêng tư và lưu nó vào một file cấu hình, đồng thời sử dụng khóa đó để sinh ra khóa công khai.
mkdir -p /etc/wireguard
wg genkey | tee /etc/wireguard/server私.key | wg pubkey > /etc/wireguard/server_pub.key
Lưu ý rằng trong thực tế, bạn nên đặt tên file rõ ràng để dễ quản lý. Sau khi có cặp khóa, bước tiếp theo là cấu hình file định dạng chính. File cấu hình này sẽ xác định địa chỉ IP của giao diện, cổng truyền dẫn, và danh sách các đồng kết nối (peers) được phép truy cập. Cấu hình này cần được đặt trong thư mục /etc/wireguard/ với đuôi .conf.
Cấu hình định tuyến và quy tắc Firewall để bảo vệ lưu lượng
Một lỗi phổ biến mà nhiều người mới gặp phải khi thiết lập VPN là họ chỉ cấu hình giao diện mạng mà quên cấu hình quy tắc chuyển tiếp gói tin (IP Forwarding) trên máy chủ. Nếu không bật tính năng này, các gói tin từ khách hàng (client) sẽ bị máy chủ nhận nhưng không được phép chuyển tiếp đến mạng LAN nội bộ hoặc ra internet. Để khắc phục, chúng ta cần chỉnh sửa file sysctl để kích hoạt chức năng này ngay lập tức và vĩnh viễn.
Trước tiên, hãy bật tính năng chuyển tiếp gói tin bằng lệnh sysctl.
sudo sysctl -w net.ipv4.ip_forward=1
Tuy nhiên, việc này chỉ có hiệu lực tạm thời cho đến khi khởi động lại hệ thống. Để thiết lập vĩnh viễn, chúng ta cần thêm dòng cấu hình vào file /etc/sysctl.conf.
echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf
Bên cạnh đó, việc bảo mật mạng cũng quan trọng không kém. Chúng ta cần cấu hình firewall (ufw trên Ubuntu) để cho phép lưu lượng UDP đi qua cổng mà WireGuard đang sử dụng (mặc định là 51820) và cho phép chuyển tiếp các gói tin đã đi qua giao diện WireGuard. Điều này đảm bảo chỉ có lưu lượng VPN mới được xử lý, ngăn chặn các cuộc tấn công không mong muốn từ bên ngoài.
sudo ufw allow 51820/udp
sudo ufw allow out on wg0 to any
sudo ufw allow in on wg0 from any
Sau khi kích hoạt ufw, lưu lượng truy cập qua VPN sẽ bắt đầu hoạt động nếu các quy tắc định tuyến đã được cấu hình đúng trong file .conf của WireGuard, cụ thể là phần AllowedIPs cho từng Peer.
Tích hợp Pi-hole để tạo DNS nội bộ và lọc quảng cáo
Với mạng WireGuard đã hoạt động ổn định, bước nâng cao tiếp theo là tích hợp máy chủ DNS. Pi-hole là một lựa chọn tuyệt vời vì nó hoạt động như một bộ lọc quảng cáo trên cấp độ mạng (network-wide), đồng thời có thể đóng vai trò là máy chủ DNS nội bộ. Khi khách hàng kết nối vào VPN, thay vì sử dụng DNS của nhà cung cấp dịch vụ internet (ISP), họ sẽ được chỉ định sử dụng địa chỉ IP của máy chủ Pi-hole.
Để cài đặt Pi-hole, chúng ta có thể sử dụng script tự động do chính tác giả của dự án cung cấp. Script này sẽ xử lý toàn bộ quá trình cài đặt, bao gồm cả cấu hình DNS forwarder và giao diện quản trị.
curl -sSL https://install.pi-hole.net | bash
Trong quá trình cài đặt, hệ thống sẽ yêu cầu xác nhận các thông tin. Một điểm quan trọng cần lưu ý là khi Pi-hole hỏi về việc có muốn cấu hình nó làm DNS cho DHCP server không, hãy chọn Yes nếu bạn muốn tất cả thiết bị trong mạng LAN nội bộ cũng sử dụng DNS này. Tuy nhiên, mục tiêu chính của bài hướng dẫn là VPN, vì vậy chúng ta cần đảm bảo rằng DNS server của WireGuard trỏ về địa chỉ IP của máy chủ Pi-hole.
Sau khi cài đặt Pi-hole, chúng ta cần quay lại file cấu hình WireGuard. Trong phần [Client] của mỗi Peer, chúng ta cần thêm dòng DNS = 10.8.0.1 (giả sử địa chỉ IP của máy chủ WireGuard/Pi-hole là 10.8.0.1). Ngoài ra, để tăng cường bảo mật, chúng ta có thể cấu hình Pi-hole chặn các tên miền độc hại bằng cách tích hợp với các danh sách đen từ cộng đồng. Việc này giúp bảo vệ người dùng khỏi các trang web lừa đảo ngay cả khi họ truy cập từ bên ngoài qua VPN.
Khắc sự cố và tối ưu hóa hiệu năng mạng
Trong quá trình triển khai thực tế, bạn có thể gặp phải các vấn đề như không thể kết nối, tốc độ mạng thấp hoặc không thể truy cập các dịch vụ nội bộ. Một nguyên nhân phổ biến là vấn đề về NAT (Network Address Translation). Nếu máy chủ WireGuard nằm sau một lớp NAT khác (ví dụ: trong mạng công cộng với IP động), bạn cần cấu hình cổng chuyển tiếp (Port Forwarding) trên router để ánh xạ cổng 51820 từ internet vào địa chỉ IP nội bộ của máy chủ. Điều này là bắt buộc để các client bên ngoài có thể tìm thấy và kết nối vào server.
Để kiểm tra xem kết nối WireGuard đã được thiết lập đúng chưa, hãy sử dụng lệnh wg show. Lệnh này sẽ hiển thị trạng thái của các giao diện, bao gồm thời gian truyền nhận gói tin cuối cùng (Latest Handshake) và lượng dữ liệu đã truyền tải. Nếu bạn thấy thời gian handshake là 0 hoặc quá lâu, điều này có nghĩa là kết nối không ổn định hoặc bị chặn bởi tường lửa.
sudo wg show
Một vấn đề khác thường gặp là việc không thể truy cập internet sau khi kết nối VPN. Điều này xảy ra khi cấu hình AllowedIPs của client được đặt thành 0.0.0.0/0, khiến toàn bộ lưu lượng internet bị chuyển hướng qua máy chủ VPN. Nếu máy chủ VPN không có băng thông đủ lớn hoặc cấu hình định tuyến ra internet không chính xác, kết nối internet sẽ bị mất. Để khắc phục, bạn có thể cấu hình AllowedIPs để chỉ định định tuyến các mạng nội bộ (ví dụ: 192.168.1.0/24) qua VPN, trong khi để lại lưu lượng internet khác đi theo đường mặc định của thiết bị client.
Việc tối ưu hóa hiệu năng còn bao gồm việc điều chỉnh các tham số MTU (Maximum Transmission Unit). Nếu MTU quá lớn, các gói tin sẽ bị phân mảnh, gây giảm tốc độ và tăng độ trễ. Bạn có thể thử giảm MTU xuống 1420 hoặc thấp hơn trong file cấu hình WireGuard của client để xem liệu hiệu năng có được cải thiện không.
interface = wg0
mtu = 1420
Tổng kết lại, việc kết hợp WireGuard và Pi-hole mang lại một giải pháp mạng vừa mạnh mẽ về hiệu năng, vừa linh hoạt trong quản lý và bảo mật. Cấu trúc này không chỉ giúp bạn truy cập an toàn vào mạng nội bộ từ bất kỳ đâu mà còn cung cấp một lớp bảo vệ chống quảng cáo và mã độc cho toàn bộ thiết bị. Với các bước hướng dẫn chi tiết trên, hy vọng bạn có thể tự tay xây dựng và vận hành một hạ tầng mạng tiên tiến cho tổ chức hoặc cá nhân của mình.