Ссылки:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
https://ru.wikipedia.org/wiki/B.A.T.M.A.N. https://www.kernel.org/doc/html/v4.18/networking/batman-adv.html https://www.open-mesh.org/doc/batman-adv/Quick-start-guide.html https://www.open-mesh.org/projects/batman-adv/wiki/Understand-your-batman-adv-network https://www.open-mesh.org/projects/batmand/wiki/BATMAN_Daemon_HowTo https://www.open-mesh.org/projects/open-mesh https://www.open-mesh.org/projects/batman-adv/wiki https://www.open-mesh.org/projects/batman-adv/wiki/Wiki https://www.open-mesh.org/projects/batmand/wiki/DebugOutput https://openwrt.org/docs/guide-user/network/wifi/mesh/batman https://www.open-mesh.org/projects/batman-adv/wiki/Debian_batman-adv_AutoStartup https://www.open-mesh.org/projects/batmand/wiki/RoutingVodoo https://www.youtube.com/watch?v=_ua0nnKZdkc&ab_channel=BrianCluff https://www.youtube.com/watch?v=yE8uE-0tMuM&ab_channel=AdjyLeak https://www.open-mesh.org/projects/batman-adv/wiki/Understand-your-batman-adv-network https://gist.github.com/IgorKha/78c95c35347ad7e7ff9d36b23a045490 |
Что?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
B.A.T.M.A.N. — протокол маршрутизации, разрабатываемый в настоящее время сообществом Freifunk как замена OLSR. Основной особенностью B.A.T.M.A.N. является децентрализация сведений о лучшем маршруте в сети — ни один узел не владеет всеми данными. С использованием этой техники отпадает необходимость в распространении информации об изменениях в сети на все узлы. Каждый узел хранит информацию только о «направлении», из которого поступают данные, и так же их отправляет. Таким образом, узлы передают друг другу пакеты по динамически создаваемым маршрутам. Описание протокола У B.A.T.M.A.N. имеются элементы классических протоколов маршрутизации: он находит другие узлы B.A.T.M.A.N. и определяет наилучший путь до них. Он также информирует соседей о появлении в сети новых узлов. Каждый узел регулярно отправляет широковещательное сообщение, информируя таким образом соседей о своём существовании. Соседи передают это сообщение своим соседям и так далее. Таким образом, каждый узел в сети получает эту информацию. B.A.T.M.A.N. не пытается определить весь маршрут, а только первый шаг пакета в нужном направлении. Данные пересылаются соседу в этом направлении, который использует тот же механизм. Процесс повторяется, пока данные не достигнут цели. B.A.T.M.A.N. может использоваться не только в беспроводных, но и в кабельных сетях, таких как Ethernet. Для работы B.A.T.M.A.N. : 0. Загружаем модуль ядра batman-adv 1. Настраиваем сетевой порт bat0 2. рабочий порт UDP 4305 (batmand) |
0. Включаем модуль ядра:
1 2 3 4 5 6 7 8 9 10 11 12 |
0. Показать модули ядра lsmod - для просмотра загруженных модулей на вашей системе lsmod | grep batman 1. Для загрузки модуля при следующей загрузки системы vim /etc/modules ---------------- batman-adv ---------------- 2. Для загрузки модуля "batman-adv" сейчас modprobe batman-adv |
Опция в ядре linux:
1 |
CONFIG_BATMAN_ADV=m |
1. Установка «batmand,batctl» на debian 11:
1 |
apt install batmand batctl |
2. Настроим интерфейс bat0:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
vim /etc/network/interfaces --------------------------- auto lo iface lo inet loopback auto enp1s0 iface enp1s0 inet dhcp post-up batctl if add enp1s0 auto enp7s0 iface enp7s0 inet static address 10.0.1.25/24 post-up batctl if add enp7s0 auto bat0 iface bat0 inet static address 192.168.100.3/24 --------------------------- |
3. Настройка batmand:
1 2 3 4 5 6 7 |
vim /etc/default/batmand ------------------------- DAEMON_OPTS="-d 0 eth1 eth2" ------------------------- systemctl enable batmand systemctl start batmand |
Routing — магия batman
1 2 3 4 5 6 7 8 9 10 |
Команда «route» обеспечивает доступ к таблице маршрутизации 254. Чтобы просмотреть или изменить записи маршрутизации в других таблицах, вам нужна команда «ip». Чтобы увидеть содержимое таблицы hosts, используйте: ip route ls table 66 ip route ls table 65 ip rule list ip rule show ip rule show table 66 |
Troubleshooting
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
0. Остановка killall batmand - убить batmand pkill batmand - убить batmand systemctl stop batmand.service - убить batmand 1. batmand batmand -i - показать установленные компоненты batmand eth1 - пробуем запустить batmand -b -c -d 1 - проверка что происходит 2. batmand debug batmand -r -d 1 eth1 2. batctl batctl n - показать MAC интерфейса bat0 batctl traceroute MAC_ADDRESS - проверить доступность MAC_ADDRESS batctl if - показать на каких интерфейсах работает batmand-adv batctl o - показать всех Originator 3. Интерфейсы 10Gbit apt search librte-pmd-ixgbe apt install librte-pmd-ixgbe17.11 |
batctl подробнее:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 |
batctl gwl (Таблица шлюза - Gateway table) В таблице шлюзов перечислены все доступные шлюзы batman-adv в этой сети. <символ выбора> <шлюз> <значение TQ (качество передачи) в сторону шлюза> <следующий лучший переход> <исходящее ифейс> <объявленная пропускная способность> batctl gw ( шлюз - назначение шлюза - проверка является этот хост шлюзом batman-adv) batctl n (neighbor table - соседний стол - ближайший сосед ) Список всех обнаруженных им соседей с одним переходом. Решение о том, направляется ли сосед с одним переходом напрямую или через другого соседа с одним переходом, зависит от качества канала. B.A.T.M.A.N. IV: <интерфейс> <соседний узел с одним переходом> <последнее посещение> B.A.T.M.A.N. V: <сосед> <последнее посещение> <пропускная способность> <интерфейс> batctl o (originator table - таблица авторов - сосед ) Каждый узел бэтмена ведет список всех других узлов в сети и запоминает, в каком направлении отправлять пакеты, если данные должны быть переданы. Направление проявляется в виде «лучшего следующего соседа», что по сути является следующим шагом к цели. Вы можете получить внутреннюю таблицу оригинаторов batman, прочитав файл оригинаторов. Печатная таблица начинается со строки заголовка с некоторыми более или менее полезными данными о состоянии, за которыми следует исходная таблица. Каждая строка содержит информацию о конкретном оригинаторе B.A.T.M.A.N. IV: <метка выбора следующего перехода> <создатель> <последнее посещение> <Значение TQ (качество передачи) для отправителя> <следующий лучший переход> <исходящее ифейс> B.A.T.M.A.N. V: <метка выбора следующего перехода> <создатель> <последнее посещение> <пропускная способность к отправителю> <следующий лучший переход> <исходящее ифейс> В Batman 2014.1.0+ была введена концепция таблицы маршрутизации для каждого интерфейса. В результате каждый интерфейс будет предоставлять свою таблицу маршрутизации: batctl meshif ${meshif} o -i ${интерфейс} batctl tl (translation tables - таблицы перевода - таблица перехода - локальная таблицы трансляции) <mac-адрес не сетевого клиента> <тег VLAN> <флаги> <последнее посещение> <CRC> RPNXW — это флаги, которые имеют следующие значения: R/Roaming: этот клиент переместился на другой узел, но по соображениям согласованности он по-прежнему сохраняется до отправки следующего OGM. P/noPurge: этот клиент представляет собой локальный программный интерфейс и никогда не будет удален. N/New: этот клиент недавно был добавлен, но не объявляется в ячеистой сети до тех пор, пока не будет отправлено следующее OGM (по соображениям согласованности). X/delete: этот клиент должен быть удален по какой-то причине, но он по-прежнему сохраняется из соображений согласованности до тех пор, пока не будет отправлено следующее OGM. W/Wireless: этот клиент подключен к узлу через беспроводное устройство. batctl tg (translation tables global - глобальная таблица трансляции) R/Roaming: этот клиент переместился на другой узел, но по соображениям согласованности он по-прежнему сохраняется до отправки следующего OGM. X/delete: этот клиент должен быть удален по какой-то причине, но он по-прежнему сохраняется из соображений согласованности до тех пор, пока не будет отправлено следующее OGM. W/Wireless: этот клиент подключен к узлу через беспроводное устройство. batctl cl (Bridge loop avoidance claim table - Таблица претензий по предотвращению образования петель) <mac-адрес несетевого клиента> <идентификатор виртуальной локальной сети> <оригинатор, претендующий на этого клиента> <клиент заявлен мной> <контрольная сумма CRC всей таблицы заявок> Клиенты, заявленные самим узлом, отмечены знаком «[x]». Если VLAN не найдено, печатается VID '-1'. batctl bbt (Bridge loop avoidance backbone table - Магистральная таблица предотвращения образования петель моста ) Эта таблица является частью кода предотвращения петель моста и содержит все магистральные шлюзы В нашей схеме у нас нет шлюзов внутри сети batman-adv, поэтому таблица будет пуста. batctl dc (Distributed ARP Table - local cache table - Распределенная таблица ARP — таблица локального кэша) Эта таблица является частью кода распределенной таблицы ARP и содержит все локально кэшированные записи ARP (IPv4+MAC-адрес). Если данный IP-адрес появляется в этой таблице, это означает, что batman-adv предотвратит любой запрос ARP, запрашивающий отправку такого адреса через сетку, и немедленно предоставит ответ в локальную сеть самостоятельно. Подмножество записей, принадлежащих этому кешу, также являются записями, которые узел отвечает за обработку в DHT . <IPv4-адрес хоста> <мак адрес хоста> <идентификатор виртуальной локальной сети> <последняя активность ARP> |
batman-adv + batctl 2023.3 debian x86_64
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
cat > install_batman.sh << "EOF" #!/bin/bash cd /opt/ # Install dependencies needed for src compile apt install -y git libnl-3-dev libnl-genl-3-dev libnl-genl-3-dev make pkg-config gcc #linux-headers-amd64-??? # batman-adv git clone https://github.com/open-mesh-mirror/batman-adv.git cd batman-adv git checkout v2023.3 # Enabled debugging/network coding/tracing support sed -i '/export/s/=n/=y/' Makefile make -j4 # Remove old batman-adv module rmmod batman_adv # Install new batman-adv module make install # Add in autoload batman-adv module echo "batman-adv" | tee -a /etc/modules cd /opt/ # batctl git clone https://github.com/open-mesh-mirror/batctl.git && cd batctl/ git checkout v2023.3 make -j`nproc` # Install new batctl make install echo "================================" echo "ATTENTION! reboot needed!" echo "================================" EOF chmod +x install_batman.sh |
batman-adv + batctl 2022.1 rpi arm
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
#!/bin/bash cd /opt/ # Install dependencies needed for src compile apt install -y raspberrypi-kernel-headers git libnl-3-dev libnl-genl-3-dev make # batman-adv git clone https://github.com/open-mesh-mirror/batman-adv.git cd batman-adv git checkout v2022.1 # Enabled debugging/network coding/tracing support sed -i '/export/s/=n/=y/' Makefile make -j4 # Remove old batman-adv module rmmod batman_adv # Install new batman-adv module make install # Add in autoload batman-adv module echo "batman-adv" | tee -a /etc/modules cd /opt/ # batctl git clone https://github.com/open-mesh-mirror/batctl.git && cd batctl/ git checkout v2022.1 make -j4 # Install new batctl make install echo "================================" echo "ATTENTION! reboot needed!" echo "================================" |
interfaces
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
### apt install tcpdump tmux iperf3 htop bridge-utils openvswitch-switch vim auto lo iface lo inet loopback # The primary network interface auto enp2s0 iface enp2s0 inet dhcp auto eno1 iface eno1 inet manual pre-up batctl ra BATMAN_V post-up batctl if add eno1 auto eno2 iface eno2 inet manual post-up batctl if add eno2 auto br0 iface br0 inet static address 10.0.0.2/24 bridge_ports bat0 bridge_stp off bridge_fd 0 bridge_maxwait 0 |
Конфиг /etc/bat-hosts
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
При создании файла /etc/bat-hosts в выводе многих команд batctl MAC-адреса будут заменены символическими именами. Эти имена не обязательно должны совпадать с именем хоста или соответствовать DNS. Используемый MAC-адрес — это адрес «необработанных» интерфейсов, используемых bat0 — в этом примере конфигурации это адреса mesh0 на каждом из узлов. (Ну то есть MAC интерфейса который добавили командой "batctl if add name_interface" ) cat > /etc/bat-hosts << "EOF" 32:b5:c2:aa:aa:aa office.5g c6:6e:1f:bb:bb:bb garage.5g 32:b5:c2:cc:cc:cc front.5g 1a:d6:c7:dd:dd:dd back.5g c6:e9:84:ee:ee:ee devel.5g 0c:d0:51:0e:00:01 n1-e1 0c:d0:51:0e:00:02 n1-e2 0c:a4:32:06:00:01 n2-e1 0c:a4:32:06:00:02 n2-e2 0c:44:b9:13:00:01 n3-e1 0c:44:b9:13:00:02 n3-e2 0c:e2:fb:ea:00:02 n4-e1 0c:e2:fb:ea:00:01 n4-e2 EOF |