Tuyệt chiêu Split Tunneling cho WireGuard: Đừng để VPN làm chậm mạng của bạn

Network tutorial - IT technology blog
Network tutorial - IT technology blog

Tại sao Full Tunnel là “cơn ác mộng” với năng suất làm việc?

Bạn vừa bật VPN để SSH vào server công ty thì ngay lập tức cuộc gọi Google Meet bỗng dưng “đứng hình”. Hay tệ hơn, việc xem một video hướng dẫn trên YouTube cũng trở nên xa xỉ với cái vòng tròn xoay tít. Đây là hậu quả của cấu hình Full Tunnel mặc định. Khi đó, mọi bit dữ liệu từ máy tính đều bị ép đi qua đường ống VPN chật hẹp trước khi ra internet.

Tôi từng quản lý hạ tầng cho một văn phòng 50 nhân sự. Thời điểm mới triển khai WireGuard, tôi để cấu hình mặc định cho tất cả anh em. Chỉ sau 15 phút, cả phòng kỹ thuật kêu trời vì mạng lag. Thực tế, họ chỉ cần VPN để truy cập dải IP 10.0.0.0/24 của datacenter. Tuy nhiên, VPN lại “nuốt” luôn cả traffic đi Facebook và Netflix. Đó là lúc tôi nhận ra mình phải chuyển sang Split Tunneling ngay lập tức.

Split Tunneling giúp bạn phân tách luồng dữ liệu thông minh. Những gì quan trọng và cần bảo mật sẽ đi qua VPN. Những dữ liệu công cộng còn lại sẽ đi thẳng ra internet của nhà mạng (ISP). Cách này giúp giảm tới 80% tải cho VPN Server và đảm bảo độ trễ (latency) khi chơi game hay họp online luôn ở mức thấp nhất.

Khái niệm cốt lõi: AllowedIPs trong WireGuard

Chìa khóa của Split Tunneling nằm ở tham số AllowedIPs. Khác với các giao thức cũ dùng script phức tạp, WireGuard dùng danh sách IP này để làm hai việc. Đầu tiên, nó quyết định gói tin đi đến IP nào thì cần mã hóa để gửi qua tunnel. Thứ hai, nó kiểm tra xem gói tin nhận được từ tunnel có địa chỉ nguồn hợp lệ hay không.

Nếu bạn đặt AllowedIPs = 0.0.0.0/0, bạn đang dùng Full Tunnel. Muốn chuyển sang Split Tunnel, bạn chỉ cần liệt kê chính xác những dải IP nội bộ cần thiết.

Thực hành 1: Định tuyến theo dải IP (CIDR)

Giả sử server văn phòng nằm trong dải 192.168.10.0/24 và các dịch vụ Docker chạy ở 172.16.0.0/16. Bạn muốn chỉ khi truy cập hai dải này mới dùng VPN.

Hãy mở file cấu hình tại /etc/wireguard/wg0.conf:

sudo nano /etc/wireguard/wg0.conf

Chỉnh sửa phần [Peer] như sau:

[Interface]
PrivateKey = <YOUR_PRIVATE_KEY>
Address = 10.0.0.2/24
DNS = 1.1.1.1

[Peer]
PublicKey = <SERVER_PUBLIC_KEY>
Endpoint = vpn.company.com:51820
# Chỉ định tuyến dải IP nội bộ và IP của chính VPN Server
AllowedIPs = 192.168.10.0/24, 172.16.0.0/16, 10.0.0.1/32
PersistentKeepalive = 25

Giải thích nhanh:

  • 192.168.10.0/24: Dành cho máy chủ LAN.
  • 172.16.0.0/16: Dành cho các dịch vụ container nội bộ.
  • 10.0.0.1/32: IP của chính VPN Server để bạn quản trị từ xa.

Sau khi lưu, hãy khởi động lại interface:

sudo wg-quick down wg0 && sudo wg-quick up wg0

Lúc này, lệnh ip route sẽ cho thấy các dải IP trên được trỏ qua wg0. Trong khi đó, traffic mặc định vẫn đi qua router nhà bạn.

Thực hành 2: Định tuyến theo Domain (Tên miền)

WireGuard vốn dĩ không hỗ trợ domain trực tiếp trong AllowedIPs. Nếu bạn nhập tên miền vào đó, nó chỉ phân giải IP một lần duy nhất khi khởi chạy. Nếu server đổi IP, kết nối sẽ bị ngắt. Giải pháp là sử dụng script PostUp kết hợp với lệnh dig.

Cập nhật file wg0.conf như sau:

[Interface]
PrivateKey = <YOUR_PRIVATE_KEY>
Address = 10.0.0.2/24
# Tự động lấy IP của domain và thêm vào bảng route khi bật VPN
PostUp = ip route add $(dig +short internal.corp.com | tail -n1)/32 dev wg0
PostDown = ip route del $(dig +short internal.corp.com | tail -n1)/32 dev wg0

[Peer]
PublicKey = <SERVER_PUBLIC_KEY>
Endpoint = vpn.company.com:51820
AllowedIPs = 10.0.0.0/24

Đừng quên cài đặt dnsutils bằng lệnh sudo apt install dnsutils để có sẵn lệnh dig nhé.

Xử lý triệt để lỗi rò rỉ DNS (DNS Leak)

Nhiều anh em gặp tình trạng đã định tuyến IP đúng nhưng vẫn không vào được web nội bộ. Nguyên nhân thường do máy tính vẫn hỏi DNS server của nhà mạng vốn không biết gì về tên miền riêng của công ty bạn. Nếu bạn dùng Ubuntu 20.04 trở lên, systemd-resolved là cứu cánh tuyệt vời.

Thêm dòng cấu hình thông minh này vào phần [Interface]:

DNS = 10.0.0.1, corp.com

Cấu hình này ép máy tính chỉ hỏi VPN Server (10.0.0.1) khi gặp các domain kết thúc bằng .corp.com. Các truy cập khác như Google hay Facebook vẫn dùng DNS mặc định để đạt tốc độ tối ưu.

Kiểm tra kết quả thực tế

Đừng vội tin là mọi thứ đã chạy. Hãy kiểm chứng bằng 3 bước đơn giản:

  1. Soi bảng định tuyến:ip route show. Bạn phải thấy dải IP nội bộ trỏ về dev wg0.
  2. Check IP công cộng: Chạy curl ifconfig.me. Kết quả phải là IP nhà mạng (Viettel, FPT…), không phải IP VPN.
  3. Ping thử nội bộ: ping 192.168.10.1. Nếu thông suốt, bạn đã thành công.

Lời kết

Làm chủ Split Tunneling giúp WireGuard trở nên tinh tế hơn hẳn. Thay vì bắt cả hệ thống chịu cảnh mạng chậm, bạn chỉ cần 5 phút để lọc ra những gì thực sự cần thiết. Cách tiếp cận này giúp tiết kiệm tài nguyên server và giữ cho trải nghiệm làm việc luôn mượt mà. Chúc các bạn cấu hình thành công!

Share: