Skip to content

Контейнер MTG создает внутреннюю петлю: пустые соединения (out=0 in=0) с собственного IP #490

@zilaev

Description

@zilaev

Я запускаю MTG в Docker-контейнере на том же хосте, где работает Nginx в качестве потокового прокси (stream).
Nginx принимает TLS-трафик на порту 443, анализирует ssl_preread и перенаправляет MTProto-трафик на MTG (порт 8444), а обычный веб-трафик — на другой бэкенд.

В логе Nginx (stream) появляется флуд, огромное количество записей вида:

172.17.0.2 [01/May/2026:20:13:23 +0300] host=ik.xxx.yy prot=TCP status=200 out=0 in=0

IP-адрес 172.17.0.2 принадлежит самому контейнеру mtg-proxy (проверено через docker inspect, других контейнеров нет).
Эти соединения пустые (out=0 in=0) и повторяются с большой частотой, утилизируя CPU.

У контейнера нет healthcheck. Конфигурация работает нормально для реальных клиентов (кстати, если клиент вместо ip указывает DNS имя, то коннект не строится), но внутренняя петля создает шум и лишнюю нагрузку. (Да, при обращении на DNS адрес который NGINX проскирует на MTG утилизация CPU растет до 100%, спустя 30 сек, падает к стандартным значениям)

Команда запуска mtg:

docker run -d --name mtg-proxy --restart unless-stopped \
  -p 127.0.0.1:8444:8444 \
  -v $(pwd)/mtg/config.toml:/config.toml:ro \
  nineseconds/mtg:2.2.8
config.toml:

toml

secret = "ee11223344556677889900aabbccddeeff6......"
domain = "ik.ххх.yyy"
bind-to = "0.0.0.0:8444"
[tls]
enabled = true

Доп.вопрос: как передавать реальный валидный сертификат который выпускается для NGINX в MTG, чтобы он не генерировал свой
Nginx (версия 1.22+):

Релевантная часть конфигурации nginx:

stream {
    map $ssl_preread_server_name $backend {
        ik.ххх.yyy mtg_backend;
        default web_backend;
    }
    upstream mtg_backend {
        server 127.0.0.1:8444;
    }
    server {
        listen 443 reuseport;
        ssl_preread on;
        proxy_pass $backend;
    }
}

Что происходит
Сам контейнер MTG устанавливает соединение с портом 443 хоста, используя свой IP 172.17.0.2.
Nginx, видя ik.ххх.yyy, перенаправляет трафик обратно на 127.0.0.1:8444, то есть снова на MTG.
Возникает петля, в результате которой создается множество TCP-соединений без передачи данных (out=0 in=0).

Вероятно, MTG после запуска выполняет внутреннюю самопроверку (self-test) или проверку домена (вероятно, резолвит domain и пытается подключиться к нему).
Если домен указывает на тот же хост, и трафик проходит через Nginx, возникает петля.

Какие есть варианты пресечения такого поведения?

Является ли это известным поведением? Есть ли способ отключить самопроверку (self-test/domain verification) в MTG?

Временное решение (костыль):
Я могу заблокировать петлю с помощью iptables:

iptables -I DOCKER-USER -s 172.17.0.2 -d 172.17.0.1 -p tcp --dport 443 -j DROP
Но хотелось бы более чистого решения внутри самого MTG.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions