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

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

У меня 2 машины.

  • 192.168.0.10
  • 192.168.0.20

Которые запускают несколько служб Docker.

На второй машине я вижу входящий трафик от службы на первой машине на нескольких портах.

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

Так, например, я увижу:

 192.168.0.10:48002 ->  192.168.0.20
 192.168.0.10:51364 ->  192.168.0.20
 192.168.0.10:52502 ->  192.168.0.20

Но когда я захожу на 192.168.0.10, чтобы проверить эти порты, они не отображаются как используемые.

Итак, это пустое место:

sudo netstat -tulpan | grep '52502'

Что может быть причиной этого и как мне это исследовать? Я подозреваю, что это связано с контейнерами Docker и отображением портов, может быть?

РЕДАКТИРОВАТЬ:

Сканирование самой службы показывает что-то вроде этого:

tcp6       0      0 127.0.0.1:48806         127.0.0.1:8088          ESTABLISHED 1065071/java

Внутренний порт, идущий к другому порту в сети докера... и больше ничего. Могу ли я предположить, что это какой-то туннель, через который идет весь остальной трафик? Как мне это сопоставить?

решение1

При подключении к службе TCP порт назначения известен заранее (например, 80для службы http), но порт источника выбирается случайным образом при создании сокета, обычно с номером порта выше 32767.

Три порта, которые вы видите, 192.160.0.10являются исходными портами соединения, к которому осуществляется подключение.192.168.0.20

решение2

Контейнерный трафик не начинается и не заканчивается на Docker.хозяинпотому что он направлен из Docker или в Dockerконтейнеры. Сам хост действует как маршрутизатор и не имеет сокета, используемого для этого трафика (исключение составляет docker-proxyобработкаNAT-прикреплениеесли не отключено с помощью --userland-proxy=false, в этом случае привязка NAT будет выполнена с помощьюiptablesиroute_localnet).

Как использует Dockeriptablesи NAT, все это отслеживается Netfilterconntrack.

Чтобы увидеть отслеживаемые потоки, используйтеconntrackкоманда (установите conntrackпакет, если необходимо). Поскольку весь этот трафик транслируется через NAT, эта команда отобразит все соответствующие потоки:

conntrack -L --any-nat -d 192.168.0.20

Его следует запустить в системе с адресом 192.168.0.10, отображая исходные потоки NAT (контейнер как клиент), видимые из системы с адресом 192.168.0.20.

Если целевое приложение в системе с адресом 192.168.0.20 также находится в контейнере Docker, та же команда при запуске в этой системе отобразит потоки NAT назначения (контейнер как сервер). В противном случае ничего не будет отображено, поскольку нет NAT для отображения.

Связанный контент