Как разделить сетевые соединения для внешнего трафика и внутреннего?

Здравствуйте.
Настроил WB7 для отправки уведомлений через телеграм-бота и обнаружилась проблема. Суть.
На контроллере работают два сетевых интерфейса: wb-gsm-sim1 и wb-eth0.
wb-gsm-sim1 – модем с доступом в интернет.
wb-eth0 – LAN, “смотрит” во внутреннюю сеть, доступ в интернет тоже есть, но своеобразный. Поскольку контроллер установлен в школе, то доступ осуществляется через прокси провайдера, который выход на многие ресурсы блочит контент-фильтром. Можно, конечно, и без прокси получить доступ, но для этого нужно авторизоваться в браузере через Госуслуги раз в день, что на WB сделать не получится.
Для отправки ТГ-уведомлений нужен доступ к api.telegram.org, но ресурс заблокирован провайдером.
Попробовал разнести интерфейсы по приоритетам. Вроде, работает, но, периодически, из-за того, что, видимо, “плавает” мобильная связь, контроллер переключается на wb-eth0 и уведомления не доходят.
Подскажите, пожалуйста, можно ли сделать так, чтобы внешний трафик проходил через модем, а внутренний – через проводной интерфейс?

Добрый день!

Попробуйте выполнить настройку следующим образом — возможно, такой вариант поможет решить проблему.
изображение

Получается, что интерфейс с модемом по-умолчанию обращается к localhost, который доступен всегда и на основе этого будут отсутствовать причины для переключения на сетевой интерфейс.
Я правильно понял логику?

Добрый день.
Да, все верно.

К сожалению, контроллер всё равно переключается на проводное соединение. Может, есть какие-то другие пути?

Добрый день!

Попробуйте настроить статический IP-адрес в локальной сети без указания основного шлюза. В таком случае контроллер не будет иметь маршрута по умолчанию и должен перестать маршрутизировать трафик в локальную сеть.

Вариант без шлюза тоже не сработал – всё равно переключается. Решили проблему по другому. Написали заявку провайдеру, чтобы сняли блок на ТГ, прописали прокси в /etc/environment. Пока, вроде, работает.
В любом случае, спасибо за помощь.

1 Like

Проблему, решил, но она не решилась. :smile:
Обнаружилось следующее.
Если пишу в консоли команду

curl -s -X POST https://api.telegram.org/bot123:ABC/sendMessage -d chat_id=-123 -d text="Текст сообщения"

то всё проходит – консоль возвращает результат выполнения команды.
Если в рамках работы правила исполняется такая функция:

function send_message_telegram(text_message){
  var token = "123:ABC";
  var chat_id = -123;
  var command = 'curl -s -X POST https://api.telegram.org/bot{}/sendMessage -d chat_id={} -d text="{}"'.format(token, chat_id, text_message);
  runShellCommand(command);
}

то в логах появляется такая ошибка:

ERROR: command '/bin/sh -c curl -s -X POST https://api.telegram.org/bot123:ABC/sendMessage -d chat_id=-123 -d text="Текст сообщения"' failed with exit status 60

Информации о загадочном статусе 60 у меня найти не получилось. Предположу, что если под root работает, а из правил – нет, значит каких-то прав не хватает, что ли?

В консоли выполняете из bash, в скрипте из sh - ожидаете совершенно одинаковый вывод? А что в stderr и stdout выводится, включите и выведите в лог - интересно.
Ну и, кстати, а почему не использовать готовый и отлаженный бот? Например Телеграм-бот на wb-rules

В консоли выполняете из bash, в скрипте из sh - ожидаете совершенно одинаковый вывод?

Спасибо, не знал про такие нюансы.

Да, пробовал программно перехватывать сообщения вот так:

function send_message_telegram(text_message){
  var token = "123:ABC";
  var chat_id = -123;
  var command = 'curl -s -X POST https://api.telegram.org/bot{}/sendMessage -d chat_id={} -d text="{}"'.format(token, chat_id, text_message);
  runShellCommand(command, {
        captureOutput: true, 
        captureErrorOutput: true,
        exitCallback: function (exitCode, capturedOutput, capturedErrorOutput) 
        {
            log("cmd output: " + capturedOutput);
            log("cmd Erroroutput: " + capturedErrorOutput);
        }
    });
}

После cmd output и cmd Erroroutput – пусто.

Ну и, кстати, а почему не использовать готовый и отлаженный бот?

Пробовал на другом контроллере его запустить и что-то не заладилось у меня с ним, поэтому на текущем контроллере даже не думал про него. Попробую, однако.

Телеграм-бот на wb-rules тоже не работает. Причем, здесь даже трудно понять, что происходит. Ниже, всё, что выводится в лог

Mar 29 20:28:51 wirenboard-AG*** wb-rules[19318]: INFO: [rule info] telegram2wb: Bot initialization
Mar 29 20:28:51 wirenboard-AG*** wb-rules[19318]: INFO: [rule info] telegram2wb: Virtual device is created
Mar 29 20:28:51 wirenboard-AG*** wb-rules[19318]: INFO: [rule info] telegram2wb: Connecting to the server...
Mar 29 20:28:52 wirenboard-AG*** wb-rules[19318]: INFO: reloading file: /etc/wb-rules/telegram2wb-logic.js

Посмотрел код модуля. Там сообщения тоже отправляются через curl, поэтому, видимо, не будет работать по причине того, что исполняется из sh.

Для примера:

function send_message_telegram(text_message){
  var token = "123:ABC";
  var chat_id = -123;
  var command = 'curl -s -X POST https://api.telegram.org/bot{}/sendMessage -d chat_id={} -d text="{}"'.format(token, chat_id, text_message);
  runShellCommand(command, {
        captureOutput: true, 
        captureErrorOutput: true,
        exitCallback: function (exitCode, capturedOutput, capturedErrorOutput) 
        {
            log("cmd output: " + capturedOutput);
            log("cmd Erroroutput: " + capturedErrorOutput);
        }
    });
}

send_message_telegram("simpleTest")

Выводит, вполне ожидаемое

2025-03-31 09:40:28cmd output: {"ok":false,"error_code":401,"description":"Unauthorized"}
2025-03-31 09:40:28cmd Erroroutput: 

2501, stable.
Не стоит ли стороннее ПО?

Добрый день, удалось ли решить вопрос?

Здравствуйте.
Да, исключение сведений о шлюзе в настройках проводного интерфейса решило проблему. Правда, не совсем понятно, почему, когда я это сделал в первый раз, то это не помогло. Возможно, в настройках этих сведений не было, а где-то в буфере сохранились.
И еще осталось непонятным, почему команда, отправляющая сообщение в ТГ из консоли срабатывает, а из runShellCommand() – нет.
Не отписывался, поскольку надо было убедиться, что всё работает с такими настройками сетевых интерфейсов. Две недели – полёт нормальный :slight_smile:

Добрый день!

Рад, что всё получилось настроить!

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