====== IP-туннелирование ====== {{:wiki:photo_2025-09-24_23-10-43.jpg|}} Через Meshtastic можно реализовать IP тунель.
Важно помнить, что в таком режиме работы MTU равен всего лишь 200 и большого профита от подобного тунеля вы не получите. Вариантов реального применения подобного тунелирования нет. Также важно не использовать основным каналом тот, что является общим (в Туле это LogFast). Также делательно сменить частотный слот на отличный от того, что используется сообществом во избежание возрастания нагрузки на сеть.Но раз спортивный интерес имеется - расскажу как это можно реализовать. Данный трюк можно проделать, оперевшись на документацию (а именно, на утилиту python cli meshtastic). Ознакомиться с оригиналом можно тут - [[https://meshtastic.org/docs/software/python/cli/#tunnel-arguments]] ===== Создание тунеля ===== После того, как частотный слот и основной канал изменены можно опробовать функцию IP-туннелирования:
$ sudo meshtastic --tunnel
Connected to radio
INFO file:tunnel.py __init__ line:83 Starting IP to mesh tunnel (you must be root for this *pre-alpha* feature to work). Mesh members:
INFO file:tunnel.py __init__ line:95 Node !5687b499 has IP address None.180.153
INFO file:tunnel.py __init__ line:95 Node !148bfdc5 has IP address None.253.197
sh: line 1: ifconfig: command not found
Aborting due to:
Первый запуск неудачный. На моем компьютере не был установлен ifconfig . ifconfig — это старый инструмент, который раньше использовался для настройки сети. Однако в настоящее время рекомендуется использовать другой инструмент ip.
После установки ifconfig я повторил всю процедуру заново:
$ sudo meshtastic --tunnel
Connected to radio
INFO file:tunnel.py __init__ line:83 Starting IP to mesh tunnel (you must be root for this *pre-alpha* feature to work). Mesh members:
INFO file:tunnel.py __init__ line:95 Node !5687b499 has IP address None.180.153
INFO file:tunnel.py __init__ line:95 Node !148bfdc5 has IP address None.253.197
None.180.153: Unknown host
ifconfig: `--help' gives usage information.
Aborting due to: ifconfig command failed.
По всей видимости, команда ifconfig запрашивает IP-адрес None.180.153. Это происходит из-за ошибки в приложении ([[https://github.com/meshtastic/python/issues/468]]).
Дело в том, что аргумент командной строки используется для указания подсети. Однако, если подсеть не указана, используется аргумент None.
Возможный обходной путь:
$ sudo meshtastic --tunnel --subnet 10.115
После этого можно было запустить интерфейс:
$sudo meshtastic --tunnel --subnet 10.115
Connected to radio
Еще одним препятствием для IP-туннелирования с помощью Meshtastic является небольшой размер MTU в **200 байт**. Это автоматически препятствует работе с IPv6, поскольку для IPv6 требуется MTU не менее **1280 байт**. Однако туннелирование IPv6 возможно через IPv4 (GRE, WireGuard и др.).
При IP-туннелировании **всегда используется основной канал**. В настоящее время никаких изменений не планируется. Однако это означает, что шифрование будет затруднено:
* Если в качестве основного канала указать частный канал со случайным паролем, IP-пакеты будут зашифрованы, но другие узлы больше не будут получать информацию о других узлах, которая также распространяется широковещательно.
* Если вы туннелируете IP-пакеты по общедоступному стандартному каналу, вы по-прежнему обмениваетесь информацией об узле и получаете её, но IP-пакеты не шифруются. Один из способов обойти эту проблему и использовать IPv6 — это использовать туннель WireGuard (или аналогичный).
Ещё одна проблема IP-туннелирования через Meshtastic — высокая задержка и потеря пакетов:
Если в качестве основного канала указать частный канал со случайным паролем, IP-пакеты будут зашифрованы, но другие узлы больше не будут получать информацию о других узлах, которая также распространяется широковещательно.
Если вы туннелируете IP-пакеты по общедоступному стандартному каналу, вы по-прежнему обмениваетесь информацией об узле и получаете её, но IP-пакеты не шифруются.
Один из способов обойти эту проблему и использовать IPv6 — это использовать туннель WireGuard (или аналогичный).
Ещё одна проблема IP-туннелирования через Meshtastic — высокая задержка и потеря пакетов:
$ time ping 10.115.253.197 -c 20 -W 600
PING 10.115.253.197 (10.115.253.197) 56(84) bytes of data.
64 bytes from 10.115.253.197: icmp_seq=1 ttl=64 time=12612 ms
64 bytes from 10.115.253.197: icmp_seq=2 ttl=64 time=15457 ms
64 bytes from 10.115.253.197: icmp_seq=4 ttl=64 time=14536 ms
64 bytes from 10.115.253.197: icmp_seq=5 ttl=64 time=14669 ms
64 bytes from 10.115.253.197: icmp_seq=6 ttl=64 time=14803 ms
64 bytes from 10.115.253.197: icmp_seq=8 ttl=64 time=17756 ms
64 bytes from 10.115.253.197: icmp_seq=9 ttl=64 time=19245 ms
64 bytes from 10.115.253.197: icmp_seq=10 ttl=64 time=19234 ms
64 bytes from 10.115.253.197: icmp_seq=11 ttl=64 time=19280 ms
64 bytes from 10.115.253.197: icmp_seq=12 ttl=64 time=19564 ms
64 bytes from 10.115.253.197: icmp_seq=14 ttl=64 time=21571 ms
64 bytes from 10.115.253.197: icmp_seq=16 ttl=64 time=21286 ms
64 bytes from 10.115.253.197: icmp_seq=17 ttl=64 time=21525 ms
64 bytes from 10.115.253.197: icmp_seq=20 ttl=64 time=29039 ms
--- 10.115.253.197 ping statistics ---
20 packets transmitted, 14 received, 30% packet loss, time 19209ms
rtt min/avg/max/mdev = 12611.611/18612.706/29038.582/4040.933 ms, pipe 16
real 0m50.196s
user 0m0.007s
sys 0m0.068s
Передача данных по протоколу UDP также осуществлялась без каких-либо проблем:
$ ncat --verbose --wait 10m --udp 10.115.180.153 8886
Ncat: Version 7.94 ( https://nmap.org/ncat )
Ncat: Connected to 10.115.180.153:8886.
Hello World!
^C
$ ncat --listen --verbose --udp --source-port 8886
Ncat: Version 7.94 ( https://nmap.org/ncat )
Ncat: Listening on [::]:8886
Ncat: Listening on 0.0.0.0:8886
Ncat: Connection from 10.115.253.197:47920.
Hello World!
^C
Однако установить простое TCP-соединение оказалось невозможно. Тем не менее, должны быть возможны простые чат-приложения, основанные на UDP и допускающие высокие задержки.
$ ncat --verbose --wait 10m 10.115.180.153 8886
Ncat: Version 7.94 ( https://nmap.org/ncat )
Ncat: Connection timed out.
{{:wiki:wireshark-tunnel.png|}}