Sáu Tháng Chạy batman-adv trên Môi Trường Thực Tế: Điều Gì Thực Sự Xảy Ra
Tôi đã thiết lập một mạng mesh batman-adv trên home lab và một triển khai IoT nhỏ vào cuối năm 2024. Ba node Raspberry Pi 4, khoảng 40 thiết bị kết nối, một gateway có dây. Tóm tắt ngắn gọn: nó hoạt động tốt hơn tôi mong đợi. Các node bị ngắt, tự phục hồi, định tuyến lại — tất cả đều không cần can thiệp thủ công. Chỉ điều đó thôi cũng đủ làm cho toàn bộ thử nghiệm xứng đáng.
Bài viết này trình bày những gì tôi đã so sánh trước khi chọn batman-adv, điều gì thực sự hoạt động tốt và điều gì khiến bạn vấp ngã, cấu hình cuối cùng tôi đã chọn, và hướng dẫn từng bước để tái tạo trên bất kỳ hệ thống Debian/Ubuntu nào.
Các Phương Pháp Mạng Mesh: Những Lựa Chọn Hiện Có
Trước khi quyết định dùng batman-adv, tôi đã xem xét ba lựa chọn thực tế cho một cấu hình mesh thuần Linux, mã nguồn mở:
802.11s (Chuẩn Mesh IEEE)
Giao thức 802.11s ở cấp kernel được tích hợp sẵn trong stack không dây của Linux. Nó xử lý lựa chọn đường dẫn ở tầng MAC sử dụng Hybrid Wireless Mesh Protocol (HWMP). Cấu hình thực hiện qua iw và wpa_supplicant. Trên giấy tờ, đây là lựa chọn gọn gàng nhất — hoàn toàn chuẩn hóa, không cần kernel module bổ sung.
Thực tế lại lộn xộn hơn. Tôi có ba card Wi-Fi — ath9k, mt76 và rtl8192eu — chỉ hai trong số đó thiết lập kết nối mesh ổn định. Cái thứ ba kết nối được nhưng không thực sự truyền được traffic. Việc debug cái đó tốn của tôi nhiều thời gian hơn cả việc xây dựng cấu hình batman-adv từ đầu.
batman-adv (B.A.T.M.A.N. Advanced)
batman-adv hoạt động ở Tầng 2 — nó xuất hiện như một interface Ethernet ảo (bat0) bên trên các interface không dây vật lý của bạn. Các quyết định định tuyến xảy ra bên trong kernel module dựa trên chỉ số chất lượng liên kết (Transmit Quality, TQ). Các node phát quảng bá OGM (Originator Messages) để thông báo sự hiện diện và đo chất lượng đường dẫn đến mọi node có thể tiếp cận khác.
Khác với 802.11s, batman-adv không phụ thuộc vào phương tiện truyền tải. Có thể chạy trên Wi-Fi, Ethernet, hoặc cả hai cùng lúc. Sự linh hoạt đó rất quan trọng với cấu hình của tôi, nơi một số node IoT có dây và một số không dây — mesh xử lý tất cả như nhau.
OLSR / Babel
OLSR (Optimized Link State Routing) và Babel là các giao thức định tuyến Tầng 3. Chúng rất xuất sắc cho các triển khai lớn hơn khi bạn cần kiểm soát định tuyến ở cấp IP và tích hợp với BGP hoặc OSPF. Nhưng với home lab hay IoT mesh, nơi mục tiêu là bridging Tầng 2 trong suốt — tất cả thiết bị trên cùng một subnet — đó là độ phức tạp không cần thiết. Thêm nhiều thành phần hơn, kết quả như nhau.
batman-adv: Ưu và Nhược Điểm Thực Tế
Những Điểm Hoạt Động Tốt
- Định tuyến tự phục hồi: Khi một node ngắt, traffic định tuyến lại nhanh — thường 3–8 giây trong các bài kiểm tra của tôi. Tôi đã rút nguồn node giữa chừng khi đang truyền dữ liệu và theo dõi phiên phục hồi bình thường.
- Không phụ thuộc phương tiện truyền: Cùng một interface
bat0hoạt động qua Wi-Fi, Ethernet, hoặc cả hai đồng thời. Các node kết hợp có dây/không dây đều hoạt động được. - Trong suốt ở Tầng 2: Mọi node chia sẻ cùng một broadcast domain. DHCP, mDNS, ARP — tất cả hoạt động bình thường mà không cần cấu hình tunneling hay định tuyến thêm.
- Kernel module trưởng thành: batman-adv đã có trong kernel mainline từ phiên bản 3.9. Trên Ubuntu/Debian hiện đại, chỉ cần một lệnh
modprobelà xong. - Ít tải trên phần cứng nhỏ: Các node Raspberry Pi 3B chạy batman-adv với card Wi-Fi USB sử dụng dưới 8% CPU trong quá trình hoạt động mesh bình thường.
Những Điểm Còn Hạn Chế
- Không có mã hóa mesh WPA3 tích hợp sẵn: batman-adv không tự mã hóa traffic. Cần xử lý mã hóa tầng liên kết riêng — hoặc WPA2 trên interface không dây bên dưới, hoặc một VPN overlay như WireGuard.
- Debug đòi hỏi thời gian học: Công cụ
batctlrất tốt, nhưng để hiểu tại sao một đường dẫn cụ thể được chọn cần đọc các giá trị TQ và bảng OGM. Không trực quan trong những lần đầu tiên. - Overhead broadcast/multicast: Trong các mesh lớn (20+ node), traffic broadcast có thể trở nên ồn ào. Với các cấu hình nhỏ đây không phải vấn đề, nhưng cần theo dõi khi mở rộng.
- Tương thích driver: Không phải card Wi-Fi nào cũng hỗ trợ chế độ monitor/ad-hoc mà batman-adv cần. Driver ath9k và mt76 có hỗ trợ ổn định; nhiều adapter USB giá rẻ thì không.
Cấu Hình Được Khuyến Nghị
Sau vài tuần thử nghiệm và điều chỉnh, đây là những gì tôi đã chọn — nó đã chạy ổn định từ đó đến nay:
- Phần cứng: Các node Raspberry Pi 4 (×3), adapter USB TP-Link TL-WN722N (driver ath9k_htc), một node có uplink có dây đóng vai trò gateway.
- Hệ điều hành: Ubuntu 22.04 LTS (tất cả node dùng image giống nhau)
- Chế độ interface: Ad-hoc (IBSS) trên kênh 5 GHz channel 36, SSID
batman-mesh - Phiên bản batman-adv: 2021.4 (kernel module) + batctl phiên bản tương ứng
- Mã hóa: WireGuard overlay để bảo mật liên node
- DHCP: Một instance dnsmasq duy nhất trên node gateway, phục vụ toàn bộ broadcast domain
bat0
Hướng Dẫn Triển Khai
Bước 1: Cài đặt batman-adv và batctl
# Thực hiện trên mọi node mesh
sudo apt update
sudo apt install batctl bridge-utils wireless-tools wpasupplicant
# Nạp kernel module batman-adv
sudo modprobe batman-adv
# Cấu hình tự động nạp khi khởi động
echo 'batman-adv' | sudo tee -a /etc/modules
Bước 2: Cấu hình Interface Không Dây sang Chế Độ Ad-Hoc
Thay wlan0 bằng tên interface thực tế của bạn. Kiểm tra trước bằng ip link.
# Tắt interface trước khi thay đổi chế độ
sudo ip link set wlan0 down
# Đặt chế độ ad-hoc (IBSS)
sudo iwconfig wlan0 mode ad-hoc
sudo iwconfig wlan0 essid batman-mesh
sudo iwconfig wlan0 ap any
sudo iwconfig wlan0 channel 36
# Bật interface trở lại (không gán IP — batman-adv xử lý địa chỉ qua bat0)
sudo ip link set wlan0 up
Bước 3: Thêm Interface vào batman-adv
# Thêm wlan0 làm interface slave của batman-adv
sudo batctl if add wlan0
# Nếu bạn cũng muốn thêm interface có dây:
sudo batctl if add eth1
# Kiểm tra lại
sudo batctl if
Bước 4: Khởi động Interface bat0
# Bật interface mesh ảo
sudo ip link set bat0 up
# Trên node gateway: gán IP tĩnh
sudo ip addr add 10.10.10.1/24 dev bat0
# Trên tất cả node còn lại: dùng DHCP (sau khi gateway đã chạy dnsmasq)
sudo dhclient bat0
Bước 5: Tự Động Hóa với systemd (Cấu Hình Bền Vững)
Cấu hình thủ công phù hợp để kiểm tra. Với môi trường thực tế, hãy tích hợp với một boot script và một systemd unit. Tạo /etc/systemd/system/batman-mesh.service:
[Unit]
Description=Thiết Lập Mạng Mesh batman-adv
After=network.target
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/local/bin/batman-mesh-up.sh
[Install]
WantedBy=multi-user.target
Sau đó tạo /usr/local/bin/batman-mesh-up.sh:
#!/bin/bash
set -e
INTERFACE=wlan0
MESH_SSID=batman-mesh
CHANNEL=36
modprobe batman-adv
ip link set $INTERFACE down
iwconfig $INTERFACE mode ad-hoc
iwconfig $INTERFACE essid $MESH_SSID
iwconfig $INTERFACE channel $CHANNEL
ip link set $INTERFACE up
batctl if add $INTERFACE
ip link set bat0 up
sudo chmod +x /usr/local/bin/batman-mesh-up.sh
sudo systemctl enable batman-mesh
sudo systemctl start batman-mesh
Bước 6: Giám Sát Trạng Thái Mesh với batctl
batctl cho bạn thấy rõ mesh đang làm gì. Sau khi ít nhất hai node đã hoạt động:
# Liệt kê tất cả node có thể tiếp cận (originator) và điểm TQ của chúng (0-255, cao hơn = tốt hơn)
sudo batctl o
# Hiển thị các interface mesh đang hoạt động
sudo batctl if
# Giám sát TQ theo thời gian thực (làm mới mỗi 1 giây)
sudo batctl o -w 1
# Ping một node theo địa chỉ MAC (ping Tầng 2, không phải IP)
sudo batctl ping aa:bb:cc:dd:ee:ff
# Traceroute xuyên qua mesh
sudo batctl traceroute aa:bb:cc:dd:ee:ff
Kết quả mẫu từ batctl o trên mesh ba node:
[B.A.T.M.A.N. adv 2021.4, MainIF/MAC: wlan0/dc:a6:32:xx:xx:xx, mesh: bat0]
Originator last-seen (#/255) Nexthop [outif]
dc:a6:32:aa:bb:cc 0.132s (218) dc:a6:32:aa:bb:cc [wlan0]
e4:5f:01:11:22:33 0.420s (196) dc:a6:32:aa:bb:cc [wlan0]
e4:5f:01:44:55:66 0.890s (154) dc:a6:32:aa:bb:cc [wlan0]
TQ từ 200 trở lên có nghĩa là kết nối trực tiếp ổn định. Dưới 100, đường dẫn đang đi qua nhiều hop hoặc chất lượng liên kết đã giảm. Đây là con số đầu tiên tôi kiểm tra khi một node có vẻ chậm chạp.
Bước 7: Cấu Hình dnsmasq trên Node Gateway
sudo apt install dnsmasq
# /etc/dnsmasq.d/batman-mesh.conf
interface=bat0
dhcp-range=10.10.10.100,10.10.10.200,12h
dhcp-option=3,10.10.10.1 # Gateway mặc định
dhcp-option=6,1.1.1.1 # DNS
sudo systemctl restart dnsmasq
Một Số Điều Tôi Sẽ Làm Khác Đi Nếu Bắt Đầu Lại
Sau sáu tháng, cấu hình đã ổn định — nhưng có hai điều tôi sẽ thay đổi nếu bắt đầu lại. Thứ nhất: dùng WireGuard giữa các node ngay từ đầu, không phải thêm vào sau. Việc mã hóa overlay mesh rất đơn giản, và viết script trao đổi key với Ansible trên tất cả node chỉ mất chưa đầy một giờ. Thứ hai: dùng 5 GHz ngay từ đầu. Cấu hình 2.4 GHz ban đầu của tôi gặp vấn đề nhiễu sóng, và chúng biến mất ngay khi tôi chuyển sang channel 36.
Còn một điều đáng nói riêng cho IoT. Tính trong suốt Tầng 2 của batman-adv có nghĩa là Zigbee coordinator, MQTT broker và Home Assistant đều tìm thấy nhau qua mDNS trên các node mesh — không cần cấu hình định tuyến thêm gì cả. Để có hành vi tương tự với cách tiếp cận Tầng 3 là phải vật lộn với mDNS proxy hoặc avahi forwarding. Tránh được cái phiền phức đó một mình đã đủ biện minh cho lựa chọn này.

