Ограниченный доступ к контроллеру по мобильной сети

Всех приветствую!

Столкнулся с проблемой удаленного доступа к контроллеру. Локально подключаюсь все нормально. Нак объекте есть общественная сеть мтс, я подключил свой коммутатор к этой сети, к коммутатору подключен контроллер, панель и ноутбук. Через ноут могу выйти в инет, зайти на какие либо сайты, в том числе wirenboard cloud, но дальше в вэб-интерфейс зайти не могу. могу открыть grafana. Прикладываю файл диагностики и скрин WB cloud. Время у нас МСК+2. В общем-то вопрос: по диагностике понять, в сети ли он и как до него достучаться

Жду от Вас ответа, т.к. удаленно невозможно что-то сделать

приложен диагностический архив, доступен только сотрудникам поддержки
(364,0 КБ)

Добрый день.

Судя по диагностике, контроллер в сети, и с локальным подключением на объекте всё действительно в порядке — эти сессии видны в логах и работают штатно.

Проблема именно с входом через WB Cloud: в диагностике видно, что в моменты ваших попыток соединение агента с облаком постоянно переустанавливалось (совпадает секунда в секунду с неудачными загрузками веб-интерфейса). Веб-интерфейсу для работы нужно постоянное подключение, и он не успевает подняться до следующего разрыва. Grafana устроена проще — обновляется отдельными запросами, поэтому нестабильность туннеля ей не так критична, и она открывается.

Пара вопросов, чтобы разобраться точнее:

  1. Не переставлялась ли на этом контроллере системная платы и не восстанавливались ли настройки из бэкапа на другое железо? В диагностике проскакивает сообщение о несовпадении сертификата и ключа облачного модуля — такое обычно бывает именно после подобной операции.

  2. Какая версия ПО стоит на контроллере (Настройки → Информация о системе)? Часть накопившихся проблем со стабильностью облачного соединения недавно устранили в стабильном релизе — рекомендую выполнить apt update && apt upgrade (или обновление через веб-интерфейс) и понаблюдать.

На момент снятия диагностики соединение уже было стабильным несколько часов — попробуйте, пожалуйста, зайти в веб-интерфейс через облако ещё раз. Если проблема повторится — укажите точное время попытки, это поможет сопоставить с логами.

НеТ. плата не переставлялась, и на другое железо тоже не восстанаваливал конфиг. Что-то я не вижу версию прошивки, где найти, вроде раздел “настройки” весь пересмотрел..
последняя попытка соединения 14-05 (мск+2) соединения нет

Пришлите, пожалуйста, обновленный диагностической архив.

Версию ПО искать не надо, прошу простить, она у меня уже есть в диагностической информации.

приложен диагностический архив, доступен только сотрудникам поддержки
(372,6 КБ)

Контроллер зафиксировал два пропадания линка на порту eth0 (время ваше, МСК+2):

  • 14:39:30 — линк пропал на 96 секунд

  • 14:42:53 — пропал на 3 секунды

Это физический уровень: кабель, порт коммутатора или питание самого коммутатора. Проверьте, пожалуйста: не дёргали ли вы кабели или питание коммутатора около 14:40? Если нет — нужно осмотреть патч-корд контроллер—коммутатор (обжим, фиксация в разъёме) и сам коммутатор, вплоть до замены на время проверки.

Ваша попытка входа в 14:05 видна в логах: контроллер отдал стартовую страницу и часть файлов интерфейса, после чего загрузка не продолжилась — следующего обращения через облако не было почти час.

Что канала не хватает, видно независимо от этого. Контроллер отправляет метрики в облако напрямую, минуя туннель веб-интерфейса, и сам замеряет время каждой отправки. За 11,5 часов сделано 342 отправки: обычно они укладываются в секунду, но 26 заняли от 3 секунд и больше, худшая — 17 секунд, а 5 не завершились вовсе, упёршись в 10-секундный таймаут: в 06:15, 08:55, 09:46, 13:33 и 14:55.

Причина, почему Grafana открывается, а веб-интерфейс нет, в том, как идёт трафик. Графики в облаке строятся из данных, которые контроллер уже отправил ранее, — при их просмотре контроллер не участвует вообще.

Что нужно от вас

Подключитесь к контроллеру по SSH локально (это работает) и пришлите вывод команды:

ip -s link show eth0

Счётчики ошибок покажут, бьются ли пакеты на физическом уровне. Это разделит две причины: плохой кабель либо просто узкий канал.

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
link/ether 00:85:01:02:7d:36 brd ff:ff:ff:ff:ff:ff
RX: bytes packets errors dropped missed mcast
282233982 3464362 0 0 0 0
TX: bytes packets errors dropped carrier collsns
1709925603 5338842 0 0 0 0
root@wirenboard-AUSRVB3H:~#

связь по ethernet пропадала- как вариант - отключение света

По “локальной физике” проблем нет. Сейчас надо проверить канал МТС до облака. Вы сможете запустить нижеприведенный набор команд по ssh? Достаточно просто копи-пасты из браузера в терминал (я проверял на putty).

#!/bin/sh
# Диагностика канала контроллер <-> Wiren Board Cloud
# Работает на bullseye и trixie, интерфейс определяется по маршруту по умолчанию.
# Только читает и измеряет, ничего не меняет.

have() { command -v "$1" >/dev/null 2>&1; }
GW=$(ip route | awk '/^default/{print $3; exit}')
IF=$(ip route | awk '/^default/{for(i=1;i<=NF;i++) if($i=="dev"){print $(i+1); exit}}')
[ -n "$IF" ] || IF=eth0
echo "=== ВРЕМЯ ==="; date '+%F %T %Z (%z)'
echo; echo "=== ЛИНК $IF ==="
if have ethtool; then ethtool "$IF" 2>&1 | grep -E "^[[:space:]]*(Speed|Duplex|Auto-negotiation|Link detected):"; else echo "ethtool не установлен"; cat /sys/class/net/$IF/speed /sys/class/net/$IF/duplex /sys/class/net/$IF/carrier 2>&1; fi
echo; echo "=== СЧЁТЧИКИ $IF ==="; ip -s link show "$IF"
echo "--- переходы линка с момента загрузки ---"
for f in carrier carrier_changes carrier_up_count carrier_down_count; do printf "%-20s " "$f"; cat /sys/class/net/$IF/$f 2>/dev/null || echo "(нет)"; done
echo; echo "=== PING ШЛЮЗ $GW (100 пакетов) ==="; ping -c 100 -i 0.2 -q "$GW" 2>&1 | tail -4
echo; echo "=== PING 8.8.8.8 (100 пакетов) ==="; ping -c 100 -i 0.2 -q 8.8.8.8 2>&1 | tail -4
echo; echo "=== DNS ==="; cat /etc/resolv.conf | grep -v '^#'; getent hosts agent.wirenboard.cloud tunnels.wirenboard.cloud timescale.wirenboard.cloud 2>&1 || echo "имя не разрешается"
echo; echo "=== ТАЙМИНГИ HTTPS ДО ОБЛАКА (3 прогона) ==="
for i in 1 2 3; do
  curl -o /dev/null -sS --max-time 30 \
    -w "прогон$i: dns=%{time_namelookup} tcp=%{time_connect} tls=%{time_appconnect} first_byte=%{time_starttransfer} total=%{time_total} code=%{response_code}\n" \
    https://wirenboard.cloud/ 2>&1
done
echo; echo "=== СКОРОСТЬ КАНАЛА (3 прогона) ==="
. /usr/lib/wb-release 2>/dev/null
ARCH=$(dpkg --print-architecture 2>/dev/null || echo arm64)
URL="https://deb.wirenboard.com/${TARGET}/dists/${SUITE}/main/binary-${ARCH}/Packages.gz"
echo "релиз: ${RELEASE_NAME} ${TARGET} ${SUITE} ${ARCH}"
echo "тестовый файл: $URL"
for i in 1 2 3; do
  curl -L -o /dev/null -sS --max-time 60 \
    -w "прогон$i: speed=%{speed_download} байт/с size=%{size_download} total=%{time_total} c code=%{response_code}\n" \
    "$URL" 2>&1
done
echo; echo "=== АГЕНТ ==="; systemctl is-active wb-cloud-agent@wirenboard.cloud wb-cloud-agent-frpc@wirenboard.cloud wb-cloud-agent-metrics@wirenboard.cloud
echo; echo "=== КОНТРОЛЬНЫЙ ЗАПРОС В ОБЛАКО ==="
curl --connect-timeout 45 --retry 8 --retry-delay 1 --retry-all-errors \
  --cert /var/lib/wb-cloud-agent/device_bundle.crt.pem \
  --engine ateccx08 --key ATECCx08:00:02:C0:00 --key-type ENG \
  -o /dev/null -sS -w 'code=%{response_code} total=%{time_total}\n' \
  https://agent.wirenboard.cloud/api-agent/v1/agent-start-up/ 2>&1
echo; echo "=== ЗАМЕРЫ ОТПРАВКИ МЕТРИК ==="
if [ "$(systemctl is-active wb-cloud-agent-metrics@wirenboard.cloud 2>/dev/null)" != "active" ]; then
  echo "служба отправки метрик не запущена — замеров нет"
else
  journalctl -u wb-cloud-agent-metrics@wirenboard.cloud -n 500 --no-pager 2>/dev/null | grep -oE "metrics send: [0-9.]+s" | sed 's/.*: //; s/s$//' | awk '{v=$1+0; n++; if(v<1)a++; else if(v<3)b++; else e++} END{if(n==0) print "замеров в выборке нет"; else printf "замеров: %d | <1c: %d | 1-3c: %d | >=3c: %d\n",n,a+0,b+0,e+0}'
  journalctl -u wb-cloud-agent-metrics@wirenboard.cloud -n 500 --no-pager 2>/dev/null | grep -E "ERROR" | tail -5
fi
echo; echo "=== ГОТОВО ==="

весь пакет ваш отправляю в коммандную строку ssh ?

Именно так.

p.s. В сообщении в окошке со скриптом есть маленькая кнопка “скопировать”.

root@wirenboard-AUSRVB3H:~# #!/bin/sh

Диагностика канала контроллер ↔ Wiren Board Cloud

Работает на bullseye и trixie, интерфейс определяется по маршруту по умолчанию.

Только читает и измеряет, ничего не меняет.

have() { command -v “$1” >/dev/null 2>&1; }
GW=$(ip route | awk ‘/^default/{print $3; exit}’)
IF=$(ip route | awk ‘/^default/{for(i=1;i<=NF;i++) if($i==“dev”){print $(i+1); exit}}’)
[ -n “$IF” ] || IF=eth0
echo “=== ВРЕМЯ ===”; date ‘+%F %T %Z (%z)’
echo; echo “=== ЛИНК $IF ===”
if have ethtool; then ethtool “$IF” 2>&1 | grep -E “[1]*(Speed|Duplex|Auto-negotiation|Link detected):”; else echo “ethtool не установлен”; cat /sys/class/net/$IF/speed /sys/class/net/$IF/duplex /sys/class/net/$IF/carrier 2>&1; fi
echo; echo “=== СЧЁТЧИКИ $IF ===”; ip -s link show “$IF”
echo “— переходы линка с момента загрузки —”
for f in carrier carrier_changes carrier_up_count carrier_down_count; do printf "%-20s " “$f”; cat /sys/class/net/$IF/$f 2>/dev/null || echo “(нет)”; done
echo; echo “=== PING ШЛЮЗ $GW (100 пакетов) ===”; ping -c 100 -i 0.2 -q “$GW” 2>&1 | tail -4
echo; echo “=== PING 8.8.8.8 (100 пакетов) ===”; ping -c 100 -i 0.2 -q 8.8.8.8 2>&1 | tail -4
echo; echo “=== DNS ===”; cat /etc/resolv.conf | grep -v ‘^#’; getent hosts agent.wirenboard.cloud tunnels.wirenboard.cloud timescale.wirenboard.cloud 2>&1 || echo “имя не разрешается”
echo; echo “=== ТАЙМИНГИ HTTPS ДО ОБЛАКА (3 прогона) ===”
for i in 1 2 3; do
curl -o /dev/null -sS --max-time 30
-w “прогон$i: dns=%{time_namelookup} tcp=%{time_connect} tls=%{time_appconnect} first_byte=%{time_starttransfer} total=%{time_total} code=%{response_code}\n”
https://wirenboard.cloud/ 2>&1
done
echo; echo “=== СКОРОСТЬ КАНАЛА (3 прогона) ===”
. /usr/lib/wb-release 2>/dev/null
ARCH=$(dpkg --print-architecture 2>/dev/null || echo arm64)
URL=“https://deb.wirenboard.com/${TARGET}/dists/${SUITE}/main/binary-${ARCH}/Packages.gz
echo “релиз: ${RELEASE_NAME} ${TARGET} ${SUITE} ${ARCH}”
echo “тестовый файл: $URL”
for i in 1 2 3; do
curl -L -o /dev/null -sS --max-time 60
echo; echo "=== ГОТОВО ===“ent-metrics@wirenboard.cloud -n 500 --no-pager 2>/dev/null | grep -E “ERROR” | tail -5рке нет”; else
=== ВРЕМЯ ===
2026-08-06 16:14:17 +05 (+0500)

=== ЛИНК eth0 ===
Speed: 100Mb/s
Duplex: Full
Auto-negotiation: on
Link detected: yes

=== СЧЁТЧИКИ eth0 ===
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
link/ether 00:85:01:02:7d:36 brd ff:ff:ff:ff:ff:ff
RX: bytes packets errors dropped missed mcast
304868881 3746082 0 0 0 0
TX: bytes packets errors dropped carrier collsns
1794160011 5750977 0 0 0 0
— переходы линка с момента загрузки —
carrier 1
carrier_changes 9
carrier_up_count 5
carrier_down_count 4

=== PING ШЛЮЗ 192.168.0.1 (100 пакетов) ===

— 192.168.0.1 ping statistics —
100 packets transmitted, 100 received, 0% packet loss, time 19976ms
rtt min/avg/max/mdev = 0.474/1.248/2.535/0.633 ms

=== PING 8.8.8.8 (100 пакетов) ===

— 8.8.8.8 ping statistics —
100 packets transmitted, 99 received, 1% packet loss, time 19877ms
rtt min/avg/max/mdev = 55.632/68.689/229.282/17.150 ms, pipe 2

=== DNS ===
nameserver 192.168.0.1
5.35.10.8 wirenboard.cloud agent.wirenboard.cloud
5.35.10.8 wirenboard.cloud tunnels.wirenboard.cloud
5.35.10.8 timescale.wirenboard.cloud

=== ТАЙМИНГИ HTTPS ДО ОБЛАКА (3 прогона) ===
прогон1: dns=0.003451 tcp=0.054496 tls=0.205160 first_byte=0.267599 total=0.272072 code=200
прогон2: dns=0.005949 tcp=0.053412 tls=0.194057 first_byte=0.262217 total=0.265989 code=200
прогон3: dns=0.005786 tcp=0.062228 tls=0.208225 first_byte=0.278162 total=0.291094 code=200

=== СКОРОСТЬ КАНАЛА (3 прогона) ===
релиз: wb-2606 wb8/bullseye stable arm64
тестовый файл: https://deb.wirenboard.com/wb8/bullseye/dists/stable/main/binary-arm64/Packages.gz
прогон1: speed=6918 байт/с size=55619 total=8.039984 c code=200
прогон2: speed=6743 байт/с size=55619 total=8.248832 c code=200
прогон3: speed=6892 байт/с size=55619 total=8.070498 c code=200

=== АГЕНТ ===
active
active
active

=== КОНТРОЛЬНЫЙ ЗАПРОС В ОБЛАКО ===
code=200 total=1.282877

=== ЗАМЕРЫ ОТПРАВКИ МЕТРИК ===
замеров: 35 | <1c: 20 | 1-3c: 12 | >=3c: 3
Aug 06 16:06:39 wirenboard-AUSRVB3H python3[384888]: 2026-08-06 16:06:39,580 ERROR wb-cloud-metrics: Metrics iteration failed: Network error while sending metrics (curl code=6): curl: (6) Could not resolve host: timescale.wirenboard.cloud

=== ГОТОВО ===


  1. [:space:] ↩︎

Основная наша теория — недостаточная скорость канала связи.

Для работы веб-интерфейса через облако нужно передать определённый объём данных — на измеренной у вас скорости, около 6 килобайт в сек, это занимает больше минуты. Браузер столько не ждёт и обрывает попытку по таймауту — отсюда и всё поведение, которое вы наблюдали: страница либо не открывается, либо виснет на загрузке.

Поскольку дело именно в скорости, мы усилили тесты, чтобы измерить канал прямо и с разных сторон:

  • добавили тест скачивания большого файла (5 МБ) — чтобы отличить настоящий потолок канала от коротких задержек на маленьких файлах;

  • добавили тест отдачи (загрузки от вас в сторону интернета) тоже 5 МБ — у сотовых и общественных сетей скорость в обе стороны часто разная, и мы решили проверить оба направления, а не только скачивание.

Судя по всему, узкое место — именно скорость сети МТС на объекте, а не что-то в настройках или оборудовании самого контроллера.

Отдельно, мелочь, но стоит обратить внимание: счётчики контроллера зафиксировали 4 коротких пропадания связи по кабелю за последние 32 часа работы. На основную проблему это не влияет. Возможно, это связано с пропаданием питания, как вы уже говорили ранее.

Прогоните, пожалуйста, обновлённый скрипт диагностики (прикладываю) — в нём теперь и скачивание, и отдача, замеры будут понятнее. Дождитесь строки === ГОТОВО === и пришлите вывод целиком.

#!/bin/sh
# Диагностика канала контроллер <-> Wiren Board Cloud
# Работает на bullseye и trixie, интерфейс определяется по маршруту по умолчанию.
# Только читает и измеряет, кроме одного тестового файла на удалённом WebDAV для проверки отдачи.

have() { command -v "$1" >/dev/null 2>&1; }
GW=$(ip route | awk '/^default/{print $3; exit}')
IF=$(ip route | awk '/^default/{for(i=1;i<=NF;i++) if($i=="dev"){print $(i+1); exit}}')
[ -n "$IF" ] || IF=eth0
echo "=== ВРЕМЯ ==="; date '+%F %T %Z (%z)'
echo; echo "=== ЛИНК $IF ==="
if have ethtool; then ethtool "$IF" 2>&1 | grep -E "^[[:space:]]*(Speed|Duplex|Auto-negotiation|Link detected):"; else echo "ethtool не установлен"; cat /sys/class/net/$IF/speed /sys/class/net/$IF/duplex /sys/class/net/$IF/carrier 2>&1; fi
echo; echo "=== СЧЁТЧИКИ $IF ==="; ip -s link show "$IF"
echo "--- переходы линка с момента загрузки ---"
for f in carrier carrier_changes carrier_up_count carrier_down_count; do printf "%-20s " "$f"; cat /sys/class/net/$IF/$f 2>/dev/null || echo "(нет)"; done
echo; echo "=== PING ШЛЮЗ $GW (100 пакетов) ==="; ping -c 100 -i 0.2 -q "$GW" 2>&1 | tail -4
echo; echo "=== PING 8.8.8.8 (100 пакетов) ==="; ping -c 100 -i 0.2 -q 8.8.8.8 2>&1 | tail -4
echo; echo "=== DNS ==="; cat /etc/resolv.conf | grep -v '^#'; getent hosts agent.wirenboard.cloud tunnels.wirenboard.cloud timescale.wirenboard.cloud 2>&1 || echo "имя не разрешается"
echo; echo "=== ТАЙМИНГИ HTTPS ДО ОБЛАКА (3 прогона) ==="
for i in 1 2 3; do
  curl -o /dev/null -sS --max-time 30 \
    -w "прогон$i: dns=%{time_namelookup} tcp=%{time_connect} tls=%{time_appconnect} first_byte=%{time_starttransfer} total=%{time_total} code=%{response_code}\n" \
    https://wirenboard.cloud/ 2>&1
done
echo; echo "=== СКОРОСТЬ КАНАЛА, малый файл (3 прогона) ==="
. /usr/lib/wb-release 2>/dev/null
ARCH=$(dpkg --print-architecture 2>/dev/null || echo arm64)
URL="https://deb.wirenboard.com/${TARGET}/dists/${SUITE}/main/binary-${ARCH}/Packages.gz"
echo "релиз: ${RELEASE_NAME} ${TARGET} ${SUITE} ${ARCH}"
echo "тестовый файл: $URL"
for i in 1 2 3; do
  curl -L -o /dev/null -sS --max-time 60 \
    -w "прогон$i: speed=%{speed_download} байт/с size=%{size_download} total=%{time_total} c code=%{response_code}\n" \
    "$URL" 2>&1
done
echo; echo "=== СКОРОСТЬ КАНАЛА, фиксированный объём 5 МБ (Range, не зависит от размера файла на сервере) ==="
for i in 1 2; do
  curl -r 0-5242879 -o /dev/null -sS --max-time 120 \
    -w "прогон$i: speed=%{speed_download} байт/с size=%{size_download} code=%{response_code} total=%{time_total}\n" \
    "$URL" 2>&1
done
echo "(ожидаем code=206 size=5242880 — если size меньше или code не 206, сервер Range не поддержал, полагайтесь на малый файл выше)"
echo; echo "=== СКОРОСТЬ ОТДАЧИ (upload) ==="
head -c 5000000 /dev/urandom > /tmp/wb-up-test.bin 2>/dev/null
if [ -s /tmp/wb-up-test.bin ]; then
  curl -T /tmp/wb-up-test.bin -u "6YilW8SLkFBdDMS:" --connect-timeout 15 --max-time 120 \
    -w "speed_upload=%{speed_upload} байт/с size_upload=%{size_upload} total=%{time_total} code=%{response_code}\n" \
    "https://cloud.ek-tmn.ru/public.php/webdav/wb-net-check-$(date +%s).bin"
  rm -f /tmp/wb-up-test.bin
else
  echo "не удалось создать тестовый файл (/dev/urandom недоступен или нет места в /tmp)"
fi
echo; echo "=== АГЕНТ ==="; systemctl is-active wb-cloud-agent@wirenboard.cloud wb-cloud-agent-frpc@wirenboard.cloud wb-cloud-agent-metrics@wirenboard.cloud
echo; echo "=== КОНТРОЛЬНЫЙ ЗАПРОС В ОБЛАКО ==="
curl --connect-timeout 45 --retry 8 --retry-delay 1 --retry-all-errors \
  --cert /var/lib/wb-cloud-agent/device_bundle.crt.pem \
  --engine ateccx08 --key ATECCx08:00:02:C0:00 --key-type ENG \
  -o /dev/null -sS -w 'code=%{response_code} total=%{time_total}\n' \
  https://agent.wirenboard.cloud/api-agent/v1/agent-start-up/ 2>&1
echo; echo "=== ЗАМЕРЫ ОТПРАВКИ МЕТРИК ==="
if [ "$(systemctl is-active wb-cloud-agent-metrics@wirenboard.cloud 2>/dev/null)" != "active" ]; then
  echo "служба отправки метрик не запущена — замеров нет"
else
  journalctl -u wb-cloud-agent-metrics@wirenboard.cloud -n 500 --no-pager 2>/dev/null | grep -oE "metrics send: [0-9.]+s" | sed 's/.*: //; s/s$//' | awk '{v=$1+0; n++; if(v<1)a++; else if(v<3)b++; else e++} END{if(n==0) print "замеров в выборке нет"; else printf "замеров: %d | <1c: %d | 1-3c: %d | >=3c: %d\n",n,a+0,b+0,e+0}'
  journalctl -u wb-cloud-agent-metrics@wirenboard.cloud -n 500 --no-pager 2>/dev/null | grep -E "ERROR" | tail -5
fi
echo; echo "=== ГОТОВО ==="

проверю тест только завтра, уже не на обьекте
С ПК могу проверить и тест скорости в этой же сети ( комп и WB подключены к одному коммутатору)

Хотелось бы в это верить, а не в то, что что-то “сломалось” в сервисе контроллера

кстати по ssh из cloud подключиться могу, правда с некими тормозами, запустить тот же htop получается

Отлично, буду ждать результаты!

-bash: [quote=Alexander_Kuznetsov, post:18, topic:41090, full:true]: command not found
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
14 4882k 0 0 14 704k 0 6007 0:13:52 0:02:00 0:11:52 0
curl: (28) Operation timed out after 120001 milliseconds with 0 bytes received
-bash: ===: command not found
-bash: [/quote]: No such file or directory
root@wirenboard-AUSRVB3H:~#