У меня 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 для отображения.