Làm chủ NetworkManager Dispatcher: Tự động hóa ‘mọi thứ’ khi đổi mạng trên Linux

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

Tại sao phải ngồi gõ lệnh mỗi khi đổi mạng?

Kịch bản quen thuộc: Bạn xách laptop từ nhà lên văn phòng. Ở nhà, bạn dùng dải IP 192.168.1.x đơn giản. Nhưng vừa đến công ty, bạn phải bật VPN WireGuard, cấu hình lại bảng routing để truy cập server nội bộ, rồi tắt bớt các service không cần thiết để bảo mật. Chiều về, bạn lại lặp lại đúng quy trình đó một cách nhàm chán.

Làm thủ công thì cũng được, nhưng rất dễ sai sót. NetworkManager Dispatcher Scripts là giải pháp triệt để cho vấn đề này. Nó hoạt động như một hệ thống hook: cứ thấy trạng thái mạng thay đổi là nó tự kích hoạt các kịch bản (scripts) bạn đã thiết lập sẵn.

Tôi từng mất cả tuần debug lỗi mất gói (packet loss) chỉ vì một con script cũ chạy ngầm cứ 5 phút lại reset interface. Từ đó, tôi rút ra bài học: tự động hóa phải minh bạch. NetworkManager Dispatcher làm rất tốt việc này vì nó chạy theo sự kiện (event-driven), giúp bạn kiểm soát hệ thống chặt chẽ hơn.

So sánh các phương pháp tự động hóa mạng

Trước khi bắt tay vào code, hãy xem tại sao Dispatcher Scripts lại vượt trội hơn các cách làm truyền thống:

  • Cron Job: Cách này khá “xôi thịt”. Cứ mỗi 1-5 phút lại check mạng một lần. Việc này vừa gây trễ (delay) vừa lãng phí tài nguyên CPU không cần thiết.
  • Systemd Service: Chuyên nghiệp hơn nhưng cấu hình rất phức tạp. Việc bắt chính xác thời điểm interface vừa “UP” để chạy lệnh không hề đơn giản với những người mới.
  • NetworkManager Dispatcher: Đây là tính năng native. Nó nằm vùng chờ đợi. Chỉ khi bạn cắm dây LAN hoặc Wi-Fi kết nối thành công, nó mới thực thi. Nhanh, gọn và cực kỳ chính xác.

Ưu và nhược điểm cần lưu ý

Ưu điểm

  • Phản ứng tức thì: Thực thi ngay khi trạng thái mạng thay đổi (mili giây).
  • Ngữ cảnh rõ ràng: Script biết chính xác interface nào đang chạy và hành động cụ thể là gì (up/down/vpn-up).
  • Tiết kiệm tài nguyên: Không chạy ngầm, không tốn RAM.

Nhược điểm

  • Rủi ro bảo mật: Script chạy dưới quyền root. Một sai sót nhỏ trong code có thể mở toang cửa hệ thống.
  • Khó quan sát: Nếu script lỗi, nó sẽ “chết” âm thầm. Bạn buộc phải check log hệ thống mới biết nguyên nhân.

Cơ chế vận hành của Dispatcher Scripts

NetworkManager sẽ quét thư mục /etc/NetworkManager/dispatcher.d/. Nó thực thi các script bên trong theo thứ tự bảng chữ cái mỗi khi có biến động về kết nối.

Khi chạy, NetworkManager đẩy vào 2 tham số đầu vào:

  1. $1: Tên interface (ví dụ: eth0, wlan0, tun0).
  2. $2: Trạng thái hành động (ví dụ: up, down, vpn-up, vpn-down).

Hướng dẫn triển khai thực tế

Bước 1: Tạo script giám sát cơ bản

Đầu tiên, hãy tạo một script để ghi log. Việc này giúp bạn xác nhận hệ thống có nhận diện đúng sự kiện hay không.

sudo nano /etc/NetworkManager/dispatcher.d/99-network-log.sh

Nội dung script:

#!/bin/bash

INTERFACE=$1
ACTION=$2

case "$ACTION" in
    up)
        echo "$(date): Interface $INTERFACE đã kết nối" >> /var/log/network-events.log
        ;;
    down)
        echo "$(date): Interface $INTERFACE đã ngắt" >> /var/log/network-events.log
        ;;
esac

Bước 2: Phân quyền thực thi

NetworkManager rất khó tính về quyền hạn. Nếu bạn để quyền quá lỏng lẻo, nó sẽ lờ script đi để đảm bảo an toàn.

sudo chmod 755 /etc/NetworkManager/dispatcher.d/99-network-log.sh
sudo chown root:root /etc/NetworkManager/dispatcher.d/99-network-log.sh

Bước 3: Tự động cấu hình Route và Firewall theo SSID

Giả sử khi bạn vào Wi-Fi văn phòng có SSID là “Office-Guest”, bạn cần thêm route đến dải IP 10.10.x.x và mở port 8080.

Tận dụng biến môi trường $CONNECTION_ID có sẵn:

#!/bin/bash

if [ "$CONNECTION_ID" == "Office-Guest" ]; then
    case "$2" in
        up)
            # Thêm static route qua gateway 192.168.10.1
            ip route add 10.10.0.0/16 via 192.168.10.1 dev $1
            # Mở port trên Firewall
            ufw allow from 10.10.0.0/16 to any port 8080 proto tcp
            ;;
        down)
            ip route del 10.10.0.0/16 dev $1
            ufw delete allow from 10.10.0.0/16 to any port 8080 proto tcp
            ;;
    esac
fi

Mẹo Debug khi script không hoạt động

Vì script chạy ngầm, bạn sẽ không thấy lỗi hiển thị trên terminal. Hãy sử dụng lệnh sau để soi log thời gian thực:

journalctl -u NetworkManager -f

Nếu muốn chi tiết hơn, hãy thêm set -x vào dòng thứ 2 của script. Lúc này, mọi dòng lệnh được thực thi sẽ hiện rõ trong log, giúp bạn biết script bị kẹt ở đâu.

Kết luận

NetworkManager Dispatcher Scripts là công cụ cực mạnh cho Sysadmin và những người yêu thích Linux. Thay vì tốn 2-3 phút cấu hình tay mỗi lần đổi mạng, hãy để máy tính tự xử lý trong 1 giây. Hãy bắt đầu từ những việc nhỏ như tự động mount ổ đĩa mạng (NFS) hoặc gửi thông báo Telegram khi máy chủ thay đổi IP. Chúc các bạn thành công!

Share: