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: Tên interface (ví dụ: eth0, wlan0, tun0).
- $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!

