Failover USB Modem 4G/5G trên Ubuntu Server với ModemManager và NetworkManager

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

Vấn Đề: Khi Đường Cáp Quang Tắt Lúc 2 Giờ Sáng

Ba lần trong vòng sáu tháng, các server chạy dịch vụ quan trọng ngừng hoạt động vì đường cáp quang upstream bị đứt. Không phải lỗi phần cứng — chỉ là sự cố từ phía ISP kéo dài từ 20 phút đến bốn tiếng. Mỗi lần như vậy, tôi nhìn cảnh báo từ hệ thống monitoring cứ đổ về trong khi người dùng không truy cập được gì.

Sau lần cúp mạng thứ ba, tôi cắm vào một USB modem Huawei E3372 với SIM 4G và dành cả cuối tuần để thiết lập failover tự động trên Ubuntu 22.04. Sáu tháng sau, hệ thống đã xử lý thêm bảy lần gián đoạn cáp quang mà không cần một cảnh báo hay thao tác thủ công nào. Đó chính là mục tiêu: bạn sẽ không biết failover đã xảy ra cho đến khi kiểm tra log.

Bài viết này trình bày chính xác những gì tôi đã làm: cấu hình ModemManager và NetworkManager để tự động chuyển sang 4G/5G khi kết nối chính gặp sự cố, rồi chuyển lại sạch sẽ khi kết nối đó phục hồi.

Khái Niệm Cốt Lõi: Cách Stack Failover Hoạt Động

ModemManager — Lớp Trừu Tượng Hóa Modem

ModemManager là một system service D-Bus xử lý các modem USB và WWAN. Nó trừu tượng hóa sự phức tạp của phần cứng mobile broadband — các tập lệnh AT command khác nhau, chế độ USB, trình tự khởi tạo của từng nhà mạng — thành một giao diện sạch sẽ mà NetworkManager có thể giao tiếp.

Không có ModemManager, bạn sẽ phải gửi lệnh AT trực tiếp đến /dev/ttyUSB0 và hy vọng firmware của modem cụ thể đó chịu hợp tác. Với ModemManager, bạn mô tả điều mình muốn và daemon sẽ lo phần cứng. Các modem ở chế độ HiLink thì khác — modem tự xuất hiện như một USB Ethernet adapter, NetworkManager xử lý nó như bất kỳ network interface nào khác và ModemManager không tham gia vào.

NetworkManager — Route Metrics như Logic Failover

NetworkManager dùng route metrics để quyết định interface nào xử lý traffic đi ra. Metric thấp hơn thắng. Toàn bộ cơ chế failover dựa trên điều này:

  • Kết nối cáp quang có metric 100 (chính, thắng khi cả hai cùng hoạt động)
  • Kết nối 4G có metric 600 (dự phòng, chỉ dùng khi kết nối chính mất)

Khi cáp quang hoạt động, traffic chạy qua route có metric thấp hơn. Khi cáp quang đứt, route đó biến mất khỏi bảng định tuyến và traffic tự động chuyển xuống route 4G. Cáp quang phục hồi, route của nó trở lại với metric thấp hơn và tiếp quản. Không cần script. Không cần cron job. Không cần thao tác thủ công.

Chọn Phần Cứng

Không phải tất cả USB modem đều hoạt động tốt như nhau. Ba model tôi đã thử:

  • Huawei E3372 (chế độ HiLink) — Thiết lập đơn giản nhất, dễ kiếm, khoảng $25–35 hàng cũ. Xuất hiện như USB Ethernet, không cần ModemManager.
  • ZTE MF833 — Hoạt động sau khi chuyển chế độ USB với usb_modeswitch, cần thêm một chút cấu hình.
  • Sierra Wireless EM7455 — Hỗ trợ Linux xuất sắc, cấp độ doanh nghiệp, giá đắt hơn đáng kể.

Cái tôi đang chạy trong môi trường production là E3372 ở chế độ HiLink. Bạn mất một số quyền kiểm soát tham số modem, nhưng cho mục đích failover thì hoàn hảo — cắm vào, có interface, đặt metric, xong.

Thực Hành: Cấu Hình Failover 4G Tự Động

Bước 1: Cài Đặt Các Gói Cần Thiết

sudo apt update
sudo apt install -y modemmanager network-manager usb-modeswitch

# Bật và khởi động ModemManager
sudo systemctl enable ModemManager
sudo systemctl start ModemManager

Các cài đặt server tối giản thường không chạy NetworkManager theo mặc định. Xác minh nó đang chạy:

systemctl status NetworkManager

Bước 2: Nhận Diện Modem

Cắm USB modem vào, rồi kiểm tra xem ModemManager có nhận ra nó không:

mmcli -L

Kết quả dự kiến:

/org/freedesktop/ModemManager1/Modem/0 [Huawei Technologies Co., Ltd.] E3372

Các modem ở chế độ HiLink sẽ không hiện ở đây — điều đó bình thường. Thay vào đó kiểm tra nmcli device status và tìm ethernet interface mới. Xác nhận phần cứng được nhận diện bằng:

lsusb | grep -i huawei
ip link show
nmcli device status

Nếu modem xuất hiện như ổ CD-ROM (chế độ lưu trữ), usb_modeswitch sẽ tự động chuyển chế độ khi cắm lại. Thường thì nó tự hoạt động.

Bước 3: Cấu Hình Kết Nối 4G

Đối với modem ở chế độ modem thực sự (không phải HiLink), tạo một kết nối GSM:

nmcli connection add \
  type gsm \
  ifname "*" \
  con-name "4g-failover" \
  apn "your.carrier.apn" \
  -- \
  connection.autoconnect yes \
  connection.autoconnect-priority -100

Thay your.carrier.apn bằng APN thực của bạn. Hầu hết nhà mạng dùng internet hoặc web — nếu không chắc, kiểm tra tài liệu của nhà cung cấp. Nhà mạng Nhật Bản: SoftBank là smile.world, IIJmio là iijmio.jp.

Các modem ở chế độ HiLink xuất hiện như ethernet interface sẽ được NetworkManager tự động tạo kết nối DHCP. Chỉ cần ghi lại tên kết nối:

nmcli connection show

Bước 4: Đặt Route Metrics Cho Ưu Tiên Failover

Đây là nơi logic failover thực sự nằm. Metric cao trên 4G nghĩa là nó chỉ được kích hoạt khi kết nối chính gặp sự cố:

# Đặt metric cao cho kết nối backup 4G
nmcli connection modify "4g-failover" ipv4.route-metric 600
nmcli connection modify "4g-failover" ipv6.route-metric 600

# Đặt metric thấp cho kết nối cáp quang chính
# Thay "Wired connection 1" bằng tên kết nối thực tế của bạn
nmcli connection modify "Wired connection 1" ipv4.route-metric 100
nmcli connection modify "Wired connection 1" ipv6.route-metric 100

Áp dụng thay đổi:

nmcli connection up "4g-failover"
nmcli connection up "Wired connection 1"

Bước 5: Xác Minh Bảng Định Tuyến

ip route show table main | grep default

Khi cả hai kết nối đang hoạt động, bạn sẽ thấy hai default route:

default via 192.168.1.1 dev eth0 proto dhcp metric 100
default via 192.168.8.1 dev eth1 proto dhcp metric 600

Route cáp quang thắng (metric 100). Khi nó biến mất, traffic tự động chuyển sang route 4G (metric 600).

Bước 6: Bật Kiểm Tra Kết Nối

Trạng thái link không thôi chưa đủ. Interface cáp quang của bạn có thể đang hoạt động trong khi định tuyến của ISP đã hỏng hoàn toàn. Connectivity checking sẽ phát hiện điều này:

sudo nano /etc/NetworkManager/conf.d/connectivity.conf
[connectivity]
uri=http://connectivity-check.ubuntu.com/
interval=60
response=NetworkManager is online
sudo systemctl restart NetworkManager

Với cấu hình này, NetworkManager phát hiện mất kết nối internet ngay cả khi link vật lý vẫn còn hoạt động, rồi kích hoạt failover. Trên hệ thống của tôi, điều này giảm thời gian phát hiện failover từ ~45 giây xuống dưới 20 giây.

Bước 7: Kiểm Tra Trước Khi Tin Tưởng

Bắt đầu ping liên tục từ máy khác đến một dịch vụ trên server của bạn, rồi mô phỏng mất cáp quang:

# Trên server — mô phỏng mất kết nối cáp quang
sudo ip link set eth0 down

# Kiểm tra định tuyến ngay lập tức
ip route show table main | grep default
# Lúc này chỉ hiển thị route 4G

# Khôi phục cáp quang
sudo ip link set eth0 up

# Xác nhận route chính đã trở lại
ip route show table main | grep default

Theo dõi ping từ máy từ xa. Kỳ vọng có khoảng gián đoạn 15–45 giây trong quá trình failover — đó là cửa sổ phát hiện và định tuyến lại. Chấp nhận được với hầu hết các workload.

Bước 8: Giám Sát Sự Kiện Failover

Kiểm tra log NetworkManager sau bất kỳ sự kiện nào:

journalctl -u NetworkManager --since "1 hour ago" | grep -E "(up|down|default|route|connectivity)"

Một script cron nhỏ ghi lại interface đang hoạt động mỗi phút, giúp dễ dàng xem lại lịch sử failover:

#!/bin/bash
# /usr/local/bin/check-failover.sh
DEFAULT_IFACE=$(ip route show default | awk 'NR==1{print $5}')
DEFAULT_GW=$(ip route show default | awk 'NR==1{print $3}')
echo "$(date '+%Y-%m-%d %H:%M:%S') - Mặc định: $DEFAULT_IFACE qua $DEFAULT_GW" >> /var/log/failover.log
chmod +x /usr/local/bin/check-failover.sh
echo "* * * * * root /usr/local/bin/check-failover.sh" | sudo tee /etc/cron.d/failover-monitor

Cuối tháng, một lệnh grep eth1 /var/log/failover.log | wc -l cho biết chính xác hệ thống đã dùng 4G bao nhiêu phút. Rất tiện để theo dõi mức dùng data và độ tin cậy của ISP.

Những Gì Sáu Tháng Dùng Thực Tế Dạy Cho Tôi

Một vài điều tôi muốn biết trước khi thiết lập:

  • Thời gian failover là 15–45 giây. Với connectivity checking được bật, thường sẽ rơi vào đầu nhanh hơn. Các kết nối có trạng thái — phiên SSH, kết nối database — sẽ bị ngắt trong cửa sổ này và cần kết nối lại.
  • Failback sạch sẽ và tự động. Khi cáp quang phục hồi, NetworkManager thêm lại route có metric thấp trong vài giây. Không cần thao tác thủ công, không có phiên bị kẹt trên interface sai.
  • Theo dõi lượng data sử dụng. SIM của tôi tích lũy khoảng 800MB trong sáu tháng qua các sự kiện failover. Với gói có giới hạn data, một lần cúp mạng kéo dài có thể tốn data nhanh.
  • Thiết lập cảnh báo khi failover, dù nó tự động. Bạn không cần hành động — nhưng biết điều đó đã xảy ra giúp bạn điều tra nguyên nhân gốc trước khi nó lặp lại. Kết nối thông báo Telegram hoặc email từ script giám sát đó.
  • Chế độ HiLink đơn giản hơn cho failover. Nếu modem hỗ trợ nó, bạn bỏ qua hoàn toàn ModemManager và quản lý hai ethernet interface. Ít cấu hình hơn, ít debug hơn khi có vấn đề.

Cần failover dưới 20 giây? Bạn sẽ phải xem xét BGP multihoming hoặc cân bằng tải active-active — một cấp độ phức tạp hoàn toàn khác. Với hầu hết server nhỏ và home lab, thiết lập dựa trên metric này đạt được sự cân bằng phù hợp: phục hồi tự động, chi phí phần cứng tối thiểu, và không cần bảo trì gì khi đã chạy.

Share: