Возможно ли подключение к шлюзу KNX с виртуальной машины Azure?

Я разрабатываю приложение.NET Core, предназначенное для подключения к шлюзу KNX, используя KNX Falcon SDK, и извлекаю все дейтаграммы, проходящие через шину KNX. Приложение размещается на виртуальной машине Azure Windows Server 2019 (B2s) и имеет назначенный ему общедоступный IP-адрес. Брандмауэр виртуальной машины был полностью отключен, а соответствующая группа сетевой безопасности была настроена для разрешения всех входящих и исходящих подключений для всех протоколов (TCP и UDP). Балансировщик нагрузки или шлюзы NAT не настроены для использования с обсуждаемой виртуальной машиной или ее виртуальной сетью.

Вот код, который я использую для подключения к шлюзу KNX:

       static void Main(string[] args)
{
    var options = new KnxIpTunnelingConnectorParameters(
        "{ip address of the gateway}", 3671, IpProtocol.Auto, true);

    var activeBus_ = new Bus(options);

    try {
        activeBus_.Connect();
        Console.WriteLine("Connected!");

    } catch (Exception ex) {
        Console.WriteLine(ex);
        Console.WriteLine($"Failure Reason {(ex as ConnectorException)?.ErrorReason}");

    } finally {
        activeBus_.Disconnect();
        activeBus_.Dispose();
    }
}

Проблема, с которой я боролся, заключается в том, что невозможно установить соединение со шлюзом KNX, и вышеупомянутый код всегда дает сбой:

       Knx.Bus.Common.Exceptions.ConnectorException: No ConnectResponse received
   at b5.a(ConnectorMode A_0, al A_1, CancellationToken A_2)
   at b5.d.c(CancellationToken A_0)
   at d.c.c()
   at System.Threading.Tasks.Task.InnerInvoke()
   at System.Threading.Tasks.Task.<>c.<.cctor>b__274_0(Object obj)
   at System.Threading.ExecutionContext.RunFromThreadPoolDispatchLoop(Thread threadPoolThread, ExecutionContext executionContext, ContextCallback callback, Object state)
--- End of stack trace from previous location where exception was thrown ---
   at System.Threading.ExecutionContext.RunFromThreadPoolDispatchLoop(Thread threadPoolThread, ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.Tasks.Task.ExecuteWithThreadLocal(Task& currentTaskSlot, Thread threadPoolThread)
--- End of stack trace from previous location where exception was thrown ---
   at d.a(al A_0, Action`1 A_1, Action`1 A_2)
   at b5.a(b8 A_0, ConnectorMode A_1, Action`1 A_2)
   at b5.a(ConnectorMode A_0)
   at e.a(ConnectorMode A_0, Boolean& A_1)
   at e.a(ConnectorMode A_0)
   at e.q()
   at Knx.Falcon.Sdk.Bus.Connect()
   at KnxConnectionTest.Program.Main(String[] args) in C:\KnxConnectionTest\KnxConnectionTest\Program.cs:line 29
Failure. Reason DeviceNotRespond

Обратите внимание, что это работает должным образом, когда я запускаю его из своей личной домашней сети.

Моя первая мысль заключалась в том, что это могло быть связано с неправильной конфигурацией сети, поэтому я установил Wireshark для прослушивания всех дейтаграмм UDP. При установлении соединения отправляются две дейтаграммы:

Насколько я понимаю, первый запрашивает у шлюза KNX предпочтительный протокол (по умолчанию TCP/UDP), а второй указывает, можно ли установить соединение. Датаграммы, отправленные с виртуальной машины Azure, никогда не получают ответа, как отправленные из моей домашней сети:

Моя вторая мысль заключалась в том, что это как-то связано с сетью в Azure, поэтому я безуспешно попробовал несколько вещей:

  1. Добавление виртуального NAT для упрощения создания исходящих подключений, поскольку в документации указано, что:

NAT позволяет создавать потоки из виртуальной сети в Интернет. Обратный трафик из Интернета разрешен только в ответ на активный поток.

  1. Добавьте балансировщик нагрузки для захвата входящего UDP-трафика и перенаправления его на частный IP-адрес виртуальной машины.

После неудачи с вышеуказанными конфигурациями я сделал предположение, что может быть проблема с дейтаграммами UDP в целом, поэтому я использовал iPerf двумя разными способами, чтобы проверить свое предположение.

  1. Запрос от онлайн-сервера iPerf на отправку датаграмм на IP моей виртуальной машины для проверки моего входящего подключения:
       iperf3.exe -u-c ping.online.net -p 5209 -R --cport 3671 --bind 10.0.1.4
  1. Отправьте дейтаграммы на онлайн-сервер iPerf, чтобы проверить мою исходящую связь:
       iperf3.exe -u-c ping.online.net -p 5209

Оба вышеперечисленных сработали, как и ожидалось, поэтому это наводит меня на мысль, что может быть проблема с самим Falcon SDK.

Мой вопрос: что-то мне не хватает? Есть ли что-нибудь еще, что я могу попытаться решить эту проблему? Любая помощь будет принята с благодарностью.

(Обратите внимание, что я также пытался создать виртуальную машину в облаке AWS EC2 с теми же результатами)

0 ответов

Другие вопросы по тегам