Рубрики
разное

B.A.T.M.A.N. \ batman \ batmand \ batctl \ mesh

Ссылки:

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.open-mesh.org/projects/batman-adv/wiki/Understand-your-batman-adv-network

https://gist.github.com/IgorKha/78c95c35347ad7e7ff9d36b23a045490

Что?

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. Включаем модуль ядра:

0. Показать модули ядра
lsmod - для просмотра загруженных модулей на вашей системе
lsmod | grep batman

1. Для загрузки модуля при следующей загрузки системы
vim /etc/modules
----------------
batman-adv
----------------

2.  Для загрузки модуля "batman-adv" сейчас
modprobe batman-adv

Опция в ядре linux:

CONFIG_BATMAN_ADV=m

1. Установка «batmand,batctl» на debian 11:

apt install batmand batctl

2. Настроим интерфейс bat0:

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:

vim  /etc/default/batmand
-------------------------
DAEMON_OPTS="-d 0 eth1 eth2"
-------------------------

systemctl enable batmand
systemctl start batmand

Routing — магия batman

Команда «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

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 подробнее:

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 - таблицы перевода -  таблица перехода - локальная таблицы трансляции)

  <тег VLAN>
     <флаги>
        <последнее посещение>
           
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 - Таблица претензий по предотвращению образования петель)

   <идентификатор виртуальной локальной сети>
      <оригинатор, претендующий на этого клиента>
         <клиент заявлен мной>
            <контрольная сумма 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 .

  <мак адрес хоста>
     <идентификатор виртуальной локальной сети>
        <последняя активность ARP>

batman-adv + batctl 2023.3 debian x86_64

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

#!/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

### 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


При создании файла /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