Loại bỏ phí thuê bao: Xây dựng Captive Portal chuẩn Production với Nodogsplash và Nginx

Networking tutorial - IT technology blog
Networking tutorial - IT technology blog

Sáu tháng vận hành thực tế: Tại sao tôi tự xây dựng Gateway cho riêng mình

Sau khi quản lý mạng khách cho một không gian làm việc chung (co-working space) với hơn 50 người dùng mỗi ngày, tôi đã quyết định cắt bỏ khoản chi phí 600 USD mỗi năm cho bộ điều khiển bản quyền. Việc quản lý Wi-Fi công cộng thường đẩy bạn vào thế khó: hoặc trả tiền cho phần cứng doanh nghiệp đắt đỏ, hoặc để mạng mở hoàn toàn và cầu nguyện mọi thứ ổn thỏa. Tôi chọn con đường thứ ba: một gateway tự lưu trữ (self-hosted) sử dụng Nodogsplash và Nginx trên một chiếc PC Lenovo Tiny cũ.

Thiết lập này không chỉ để tiết kiệm tiền, mà còn là về quyền sở hữu. Bằng cách sử dụng Nodogsplash (NDS) làm bộ chặn lưu lượng và Nginx để vận hành giao diện front-end, bạn có quyền kiểm soát tuyệt đối đối với thương hiệu, dữ liệu người dùng và giới hạn phiên truy cập. Nếu bạn muốn cung cấp dịch vụ mạng chuyên nghiệp mà không bị phụ thuộc vào nhà cung cấp (vendor lock-in), đây là bộ công cụ (stack) bạn cần làm chủ.

Cuộc tranh luận lớn: Bản quyền đóng vs. Mã nguồn mở

Trước khi bắt tay vào xây dựng, tôi đã đánh giá các tiêu chuẩn trong ngành. Dưới đây là sự so sánh giữa phương pháp tự lưu trữ với các phần cứng mà tôi đã từng triển khai trước đây.

1. Giải pháp quản lý sẵn có (Ubiquiti UniFi, MikroTik)

Hầu hết các đơn vị IT thường chọn UniFi Dream Machine. Chúng đáng tin cậy và mang lại trải nghiệm “cắm là chạy”. Tuy nhiên, việc tùy chỉnh trang chào (splash page) thường giống như đang “đánh vật” với phần mềm. Bạn thường bị giới hạn trong những tinh chỉnh CSS cơ bản. Nếu cần tích hợp cơ sở dữ liệu SQL riêng để xác thực thành viên hoặc một API bên thứ ba cụ thể, bạn sẽ vấp phải rào cản ngay lập tức.

2. Bộ công cụ mở (Nodogsplash + Nginx)

Phương pháp này biến một chiếc máy tính Linux tiêu chuẩn—thậm chí là một chiếc Raspberry Pi 4 giá 35 USD—thành một gateway tinh vi. Nodogsplash xử lý các quy tắc iptables cấp thấp để thu giữ lưu lượng truy cập của máy khách. Sau đó, Nginx sẽ hiển thị một trang HTML5 hiện đại, tương thích tốt với thiết bị di động. Nó cực kỳ linh hoạt nhưng yêu cầu bạn phải thành thạo dòng lệnh (terminal) và định tuyến IP cơ bản.

Tại sao thiết lập này vượt trội (và những khó khăn đi kèm)

Ưu điểm

  • Không tốn phí bản quyền: Bạn trả 0 đồng cho mỗi người dùng hoặc mỗi điểm truy cập (AP). Với một khách sạn nhỏ có 20 AP, điều này có thể tiết kiệm hàng ngàn đô la trong ba năm.
  • Tự do thiết kế: Nginx xử lý trang đăng nhập của bạn như bất kỳ website nào khác. Bạn có thể dùng Bootstrap, Tailwind, hoặc thậm chí là React để tạo ra trải nghiệm người dùng cao cấp.
  • Tối ưu tài nguyên: Nodogsplash được viết bằng C. Nó tiêu thụ chưa đến 15MB RAM ngay cả khi có 100 khách hàng đang hoạt động, lý tưởng cho các phần cứng biên (edge hardware).
  • Thu thập dữ liệu: Tôi đã tích hợp một đoạn mã Python đơn giản để ghi lại email của khách cho bản tin marketing. Các nhà cung cấp thương mại thường tính thêm phí cho “tính năng” này.

Thách thức

  • Rào cản học thuật: Bạn cần hiểu cách hoạt động của chuyển tiếp IP (IP forwarding) và các giao diện mạng (network interfaces).
  • Bảo trì: Không có nút “tự động cập nhật” cho toàn bộ hệ thống. Bạn chính là quản trị viên hệ thống (sysadmin) chịu trách nhiệm cho các bản vá bảo mật.

Bản thiết kế: Phần cứng khuyến nghị

Để có một môi trường ổn định, không bị treo khi 20 người cùng xem YouTube đồng thời, hãy sử dụng cấu hình cơ bản sau:

  • Phần cứng: Thiết bị có hai cổng mạng Gigabit (dual Gigabit NICs). Một chiếc Protectli Vault hoặc PC gắn thêm card Ethernet PCIe là lựa chọn tốt nhất.
  • Hệ điều hành: Debian 12 (Bookworm) hoặc Ubuntu 22.04 LTS để có sự ổn định lâu dài.
  • Phần mềm: Nodogsplash cho gateway và Nginx cho máy chủ web.

Triển khai từng bước

1. Biến Linux thành Router

Máy tính Linux của bạn phải chuyển tiếp lưu lượng giữa các máy khách Wi-Fi và internet. Hãy bắt đầu bằng cách kích hoạt IP forwarding trong kernel.

# Chỉnh sửa file /etc/sysctl.conf và bỏ chú thích dòng này:
net.ipv4.ip_forward=1

# Áp dụng thay đổi ngay lập tức
sudo sysctl -p

2. Cài đặt bộ phần mềm

Nginx có sẵn trong mọi kho lưu trữ lớn. Nodogsplash nên được biên dịch từ mã nguồn để đảm bảo bạn có các tính năng và bản vá bảo mật mới nhất.

sudo apt update
sudo apt install nginx git libmicrohttpd-dev build-essential -y

# Clone và biên dịch Nodogsplash
git clone https://github.com/nodogsplash/nodogsplash.git
cd nodogsplash
make
sudo make install

3. Cấu hình Gateway

Mở file /etc/nodogsplash/nodogsplash.conf. Bạn phải chỉ định giao diện nào hướng về phía người dùng (phía LAN). Trong ví dụ này, eth1 là giao diện kết nối với các điểm truy cập Wi-Fi.

# /etc/nodogsplash/nodogsplash.conf
GatewayInterface eth1
GatewayAddress 192.168.10.1
MaxClients 150

# Chuyển hướng người dùng đến trang Nginx tùy chỉnh của chúng ta
# NDS sẽ tự động thêm token 'authaction' vào URL này
RedirectURL http://192.168.10.1:8080/portal/

4. Xây dựng trang chào trên Nginx

Tôi chạy Nginx trên cổng 8080 để dành cổng 80 cho các công cụ quản lý khác. Cấu hình một virtual host đơn giản để phục vụ các file của portal.

# /etc/nginx/sites-available/captive-portal
server {
    listen 8080;
    root /var/www/portal;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}

File index.html của bạn cần một chút JavaScript. Khi NDS chuyển hướng người dùng, nó sẽ gửi một token duy nhất trong URL. Nút “Kết nối” của bạn phải gửi người dùng quay lại token đó để mở khóa quyền truy cập internet.

<!-- /var/www/portal/index.html -->
<!DOCTYPE html>
<html>
<head><title>Wi-Fi Khách Miễn Phí</title></head>
<body>
    <h1>Chào mừng bạn đến với mạng nội bộ</h1>
    <a id="login-link" href="#">Nhấn vào đây để kết nối</a>

    <script>
        const params = new URLSearchParams(window.location.search);
        const target = params.get('authaction');
        if (target) {
            document.getElementById('login-link').href = decodeURIComponent(target);
        }
    </script>
</body>
</html>

Những bài học kinh nghiệm thực tế

Smartphone hiện đại rất "nhạy". Nếu "Captive Network Assistant" (cửa sổ bật lên khi bạn kết nối Wi-Fi) không tải xong trong vòng chưa đầy 3 giây, điện thoại thường sẽ ngắt kết nối và chuyển về 5G. Hãy giữ cho trang chào của bạn thật nhẹ. Tránh sử dụng ảnh nền nặng 5MB hoặc các font chữ bên ngoài yêu cầu quyền truy cập internet mới tải được.

Một thiết lập quan trọng khác là ClientIdleTimeout. Ban đầu tôi để mặc định, nhưng tôi nhận thấy các thiết bị di động "treo" mạng đã làm cạn kiệt dải IP của tôi. Đặt giá trị này thành 60 phút đảm bảo rằng những người đã rời khỏi tòa nhà sẽ bị xóa khỏi hệ thống, giải phóng địa chỉ IP cho khách mới.

Lời kết

Tự xây dựng captive portal là một trải nghiệm đáng giá cho các quản trị viên mạng. Nó đưa bạn từ một người tiêu dùng phần cứng trở thành một kiến trúc sư mạng. Bằng cách kết hợp khả năng lọc gói tin tinh gọn của Nodogsplash với sức mạnh web của Nginx, bạn tạo ra một hệ thống nhanh hơn, rẻ hơn và có khả năng tùy biến cao hơn hầu hết mọi thứ bạn có thể mua sẵn trên thị trường.

Share: