Передача данных через демилитаризованную зону DMZ с помощью протокола Modbus

Как правило в АСУ ТП реализация демилитаризованной зоны выглядит следующим образом:


В сети №1 есть OPC-сервер от которого должен получать данные OPC-клиент в сети №2. Есть сервер DMZ. Firewall 1 разрешает только соединения из сети 1, остальные соединения запрещает. Firewall 2 разрешает только соединения из сети 2, остальные соединения запрещает. Передача по стандарту OPC DA в таких условиях невозможна.
Какие стандартные протоколы обмена есть в АСУ ТП? Конечно же первым на ум приходит Modbus. Для TCP/IP есть Modbus TCP. Ещё есть режим Modbus-RTU поверх TCP/IP: те же самые пакеты, которые проходят по RS-485 передаются по TCP/IP. Режим Modbus-RTU поверх TCP/IP стал стандартом де-факто, но остался нестандартным де-юре.
Определимся с терминами:

  • Modbus-Slave – программа, которая отдаёт данные по протоколу Modbus
  • Modbus-Master — программа, которая принимает данные от Slave по протоколу Modbus
Итак, рассмотрим такую схему:

В сети №1 «преобразователь ОРС в Modbus TCP» является Modbus-slave, он получает данные от ОРС-сервера. «Преобразователь ОРС в Modbus TCP» сам устанавливает ТСР соединение с ОРС-сервером Modbus TCP (Modbus-Master) в DMZ (в нем есть режим пассивного ожидания соединений), преобразователь ОРС в Modbus TCP (Modbus-slave) в демилитаризованной зоне получает данные от ОРС-сервера. ОРС-сервер Modbus TCP (Modbus-Master) в сети 2 устанавливает соединение с «Преобразователем ОРС в Modbus TCP» в DMZ и передает данные ОРС-клиенту.
В этой схеме нестандартно то, что «преобразователь ОРС в Modbus TCP», являясь Modbus-slave, сам устанавливает соединение с Modbus-Master. Именно для этого и потребовалось написать свой преобразователь.

Упростим схему:

Для сервера демилитаризованной зоны создадим простую программу с условным названием TCP connections Convertor. Она открывает 2 ТСР порта. Из сети №1 «преобразователь ОРС в Modbus TCP» устанавливает соединение с ней по порту 1000, ОРС-сервер Modbus TCP устанавливает соединение с ней по порту 1001. Пакет, приходящий на порт 1000, отсылается клиенту, подсоединенному к порту 1001. Пакет, приходящий на порт 1001, отсылается клиенту, подсоединенному к порту 1000.

Можно сказать, что потенциальный злоумышленник может взломать «преобразователь ОРС в Modbus TCP», посылая ему нехорошие пакеты. Тогда в TCP connections Convertor можно ввести запрет в подключении к нему с неизвестных IP-адресов, ввести контроль длины пакетов и проверять пакеты на соответствие стандарту Modbus TCP.

Ещё одна идея!

С появлением беспроводных GSM/GPRS-модемов, обеспечивающих передачу данных в сети по стеку протоколов TCP/IP стало удобно организовывать каналы связи с удаленными объектами. Однако не всегда удаётся получить статический IP-адрес для GSM/GPRS-модема. В таком случае статический IP-адрес присваивается серверу. GSM/GPRS-модем устанавливает соединение с сервером, на сервер устанавливается программа TCP connections Convertor. ОРС-сервер отправляет запрос к серверу на порт 1000, GSM/GPRS-модем, подключенный к порту 1001 принимает этот пакет, передает его счетчику, счетчик отвечает, GSM/GPRS-модем передает ответ серверу на порт 1001, сервер через порт 1000 отдает ответ ОРС-серверу. ОРС-сервер «думает», что общается со счетчиком напрямую, компьютер с ОРС-сервером оказывается изолированным от внешней сети (интернета).