Блог

Из цеха Modbus TCP не доходит, из серверной пинг есть: маршрут и firewall

2026-07-20 09:24

Инженер в серверной открывает командную строку: ping 192.168.10.50 - ответ есть, потери нулевые. С того же ноутбука Modbus Poll к порту 502 - таймаут. В цеху у шкафа ПЛК ситуация зеркальная: пинг до SCADA-сервера проходит, опрос счётчиков по TCP не устанавливается. На совещании звучит «сеть живая, виноват Modbus». На деле чаще всего рвётся не протокол, а путь TCP между сегментами VLAN или правило на firewall, которое icmp пропускает, а 502 - нет.

Статья разбирает асимметричную маршрутизацию, ACL, NAT и типичные ошибки на границе цех-серверная. Здесь нет вводного курса по Modbus и разбора Unit ID - это отдельные материалы. Фокус - почему «пинг есть» не означает «Modbus TCP работает».

Короткий ответ

Если icmp до узла проходит, а TCP на порт 502 (или другой порт Modbus TCP) - нет, проверьте маршрут в обе стороны, правила firewall по протоколу и порту, NAT и asymmetric routing. Ping использует icmp; Modbus TCP - это TCP с установлением сессии. Firewall может разрешать echo-request, но блокировать входящие SYN на 502. Разные VLAN без маршрутизатора или с неверной таблицей маршрутов дают одностороннюю связность. Диагностика: с обеих сторон tracert/traceroute, Test-NetConnection -Port 502 (PowerShell) или telnet IP 502, захват на граничном коммутаторе. Таблица ниже связывает симптом со слоем сети.

Почему ping и Modbus TCP ведут себя по-разному

Ping проверяет доступность хоста на уровне IP через icmp Echo Request/Reply. Многие администраторы явно разрешают icmp «для диагностики», а прикладные порты закрывают политикой «deny all except». Modbus TCP (чаще порт 502, иногда нестандартный) требует успешного трёхстороннего рукопожатия TCP: SYN, SYN-ACK, ACK. Если на пути firewall отбрасывает SYN или ответный пакет уходит другим маршрутом и отбрасывается, сессия не поднимется, хотя echo на тот же IP проходит.

Второй частый случай - сервис слушает не на том интерфейсе. ПЛК отвечает на ping с адреса ETH1, а Modbus TCP-server привязан только к ETH2 с другим IP. С серверной пингуется «видимый» адрес, а опрос идёт на «правильный» из проекта - и наоборот.

Третий - путаница TCP и UDP. Modbus TCP - только TCP. Если в правиле firewall ошибочно указали UDP 502, опрос не заработает.

VLAN, маршрутизатор и таблица маршрутов

Цех и серверная часто сидят в разных VLAN: например, 192.168.10.0/24 (поле) и 192.168.20.0/24 (IT). Пинг работает, если есть маршрут L3 между VLAN и разрешён icmp. Modbus TCP требует того же маршрута, но плюс открытый порт на всём пути.

Проверьте на коммутаторе L3 или маршрутизаторе: есть ли маршрут к подсети назначения, не перекрывает ли его более специфичный статический маршрут «в никуда». Asymmetric routing: запрос от SCADA уходит через шлюз A, ответ ПЛК - через шлюз B без состояния сессии на firewall - TCP рвётся. Симптом: иногда «мигает» связь, чаще стабильный таймаут с одной стороны.

На объекте полезно нарисовать схему: кто шлюз по умолчанию у ПЛК, у сервера, есть ли промежуточный firewall с stateful inspection. Без схемы споры затягиваются на недели.

Firewall: что смотреть в правилах

Типовые ошибки в ACL:

  • разрешён icmp any-any, но нет правила allow TCP destination port 502 (или ваш нестандартный);
  • разрешение только «от сервера к ПЛК», но ответные пакеты блокируются (нужно stateful или явный return path);
  • Modbus разрешён между двумя IP, а опрос идёт с другого адреса NAT-пула;
  • после смены IP ПЛК обновили маршрут, но забыли правило firewall.

Попросите у IT экспорт правил для пары подсетей или временно включите лог deny на границе - одна сессия Modbus Poll даст видимый drop на 502.

Если между сегментами industrial firewall с режимом «только известные протоколы», убедитесь, что Modbus TCP разрешён как приложение, а не только «IP any».

NAT и опрос «снаружи»

Когда SCADA в корпоративной сети опрашивает «внутренний» IP ПЛК через NAT, в проекте должен совпадать адрес, который реально видит ПЛК как source, и порт. Ошибка NAT: проброс только 502 на один ПЛК, а в карте тегов - десять устройств на разных внутренних IP без отдельных правил.

Для диагностики с ноутбука в цеху отключите VPN и корпоративные прокси - они часто перехватывают маршрут к 192.168.x.x и ломают локальный опрос, при этом ping «в обход» ещё работает.

Практическая диагностика по шагам

  1. С узла-инициатора: ping до IP slave - фиксируем OK/FAIL.
  2. Проверка порта: PowerShell Test-NetConnection 192.168.10.50 -Port 502 или аналог в Linux nc -vz IP 502.
  3. С узла-получателя: то же в обратную сторону, если на нём тоже есть клиент или listener для теста.
  4. tracert с обеих сторон - совпадает ли путь, нет ли лишнего хопа через WAN.
  5. Wireshark на SPAN-порту у ПЛК или сервера: уходит ли SYN, приходит ли SYN-ACK (см. материал про захват Modbus TCP).
  6. Сверка IP в проекте CODESYS/MasterSCADA с реальным адресом на экране ПЛК и табличкой as-built.

Если SYN уходит, SYN-ACK нет - блокировка у slave или по пути к нему. Если SYN-ACK есть, но сразу RST - порт закрыт на сервисе или неверный IP.

Modbus-специфика при «живом» TCP

Когда TCP устанавливается, но опрос всё равно пустой - это уже Unit ID, карта регистров, таймауты. В данной статье граница такая: до слоя TCP вы должны увидеть установленную сессию. Modbus Poll с логом покажет connect OK. Если connect не наступает - не копайте MBAP, чините сеть.

Полезно сравнить с Modbus TCP для интегратора после того, как порт 502 реально открыт.

Шлюз на ПЛК и панели: ошибка, которую не видит IT

ПЛК в цеху часто настраивают с default gateway на адрес промышленного L3-коммутатора. Если после реконфигурации сети шлюз остался старым или указывает на порт коммутатора без IP-маршрутизации, картина такая: ping до соседа в той же /24 работает, ping и Modbus до серверной - нет. Из серверной до ПЛК маршрут есть, ответы ПЛК уходят «в никуда» - асимметрия с точки зрения клиента в серверной: «иногда доходило», когда кто-то временно прописал статику.

Панель оператора в цеху с отдельным IP - отдельный шлюз. FAT прошёл с ноутбука в серверной, панель в цеху не опрашивает - два разных источника, два разных маршрута. В as-built фиксируйте для каждого узла АСУ ТП: IP, маска, gateway, VLAN, кто инициатор Modbus.

Промышленный коммутатор: IGMP, QoS и «прозрачность»

На границе VLAN иногда включают IGMP snooping, storm control или ACL на самом коммутаторе - не только на firewall. Симптом похож: icmp маленький пакет проходит, TCP с определённым размером или rate limit - нет. Реже встречается, но на объектах с «умными» managed switch стоит проверить порт ПЛК: не в err-disabled ли после BPDU guard, не переведён ли в другой VLAN после autoconfig.

Связка физики и протоколов на таких объектах разобрана в материале про промышленные сети. Modbus TCP не требует multicast для базового опроса, но соседний ProfiNet или OPC на том же коммутаторе иногда меняют настройки портов «для всего цеха» - и ломают 502 попутно.

Документ для сдачи сети: матрица потоков Modbus

Чтобы не повторять спор после каждого обновления firewall, на пуске передайте IT таблицу: источник (IP/подсеть), назначение (IP/подсеть), протокол TCP, порт 502 (или список), направление, комментарий «SCADA опрос ПЛК», «панель цех», «резервный сервер». Отдельной строкой - запрет не нужен, если политика deny-by-default; важно явное allow для OT.

При изменении IP ПЛК меняют три места: проект CODESYS или MasterSCADA, таблица маршрутов, ACL. Ping после смены IP «доказывает» только L3 до нового адреса - снова проверяйте 502.

RTU over TCP и прокси: когда 502 не на ПЛК

На объекте Modbus иногда терминируется на шлюзе RS-485-Ethernet: снаружи опрос идёт на IP шлюза, порт 502, внутри - RTU. Firewall открыли до шлюза, но шлюз не форвардит в цеховую подсеть или ACL режет второй хоп. Ping до шлюза OK, Modbus timeout. Traceroute останавливается на шлюзе - дальше смотрите настройки маршрута и NAT на самом конвертере, не только корпоративный firewall.

Три режима Modbus (RTU, TCP, RTU over TCP) на пути влияют на то, где именно должен открыться TCP - см. материал про режимы Modbus. Для сетевика важно: конечный slave может не иметь ping с серверной, если он только за шлюзом без маршрута обратной видимости.

При сдаче объекта заказчику приложите к акту результат Test-NetConnection с каждого сегмента, откуда идёт опрос - не скрин ping. Это снимает повторные выезды «сеть же работала».

Симптом, слой и проверка

Симптом Слой сети Проверка
Ping OK, TCP 502 timeout Firewall ACL / state Лог deny, Test-NetConnection, временное правило allow
Работает из цеха, не из серверной Маршрут VLAN или односторонний ACL tracert с обеих сторон, таблица маршрутов
Работает после отключения VPN Политика VPN split tunnel Маршрут к 192.168.x.x через локальный шлюз
SYN без SYN-ACK Промежуточный фильтр или неверный IP Захват на границе VLAN
SYN-ACK затем RST Сервис Modbus не слушает порт Настройка порта на ПЛК, другой IP интерфейса
Связь «мигает» раз в несколько минут Asymmetric routing, дубли IP ARP-таблица, flapping, схема шлюзов
После замены коммутатора пропало Пропал inter-VLAN routing IP шлюза по умолчанию на ПЛК
IT говорит «всё открыто», не работает NAT только на один хост Список внутренних IP slave vs правила DNAT

Вопросы с объекта

Достаточно ли открыть ping для приёмки сети?
Нет. Для Modbus TCP нужен явный тест TCP на рабочий порт с узла, откуда реально идёт опрос SCADA.

Можно ли использовать тот же VLAN для IT и АСУ ТП «чтобы проще»?
Иногда так делают на малых объектах, но broadcast и политики IT остаются риском. Если VLAN разделены - настраивайте маршрут и ACL под 502, а не только icmp.

Почему с ноутбука в серверной работало, а с сервера нет?
Разный source IP, разные правила firewall, другой сетевой адаптер или статический маршрут на ноутбуке.

Нестандартный порт Modbus - что менять в сети?
В ACL указывают фактический TCP-порт; ping по-прежнему не проверяет его.

Ссылки по теме