Mapeo de puertos entre máquinas que usaron contenedores Docker

Mapeo de puertos entre máquinas que usaron contenedores Docker

Tengo 2 maquinas.

  • 192.168.0.10
  • 192.168.0.20

Que ejecutan algunos servicios acoplables.

En la segunda máquina veo tráfico entrante de un servicio en la primera máquina en algunos puertos.

Pero cuando reviso ese primer host, no veo esos puertos en uso.

Entonces, por ejemplo, estaré viendo:

 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

Pero cuando accedo a 192.168.0.10 para verificar esos puertos, no aparecen en uso.

Entonces esto aparece vacío:

sudo netstat -tulpan | grep '52502'

¿Qué podría estar causando esto y cómo lo investigo? Sospecho que tiene que ver con los contenedores Docker y el mapeo de puertos, ¿tal vez?

EDITAR:

La búsqueda del servicio en sí muestra algo como esto:

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

El puerto interno va a otro puerto en la red acoplable... y luego nada. ¿Debo asumir que se trata de una especie de túnel por el que pasa el resto del tráfico? ¿Cómo mapeo esto?

Respuesta1

Cuando se conecta a un servicio tcp, el puerto de destino se conoce de antemano (por ejemplo, 80para un servicio http), pero el puerto de origen se elige aleatoriamente al crear el socket, generalmente con un número de puerto superior a 32767.

Los tres puertos que ve 192.160.0.10son los puertos de origen de la conexión realizada a192.168.0.20

Respuesta2

El tráfico de contenedores no se origina ni termina en Dockeranfitriónporque está enrutado desde o hacia Dockercontenedores. El propio host actúa como un enrutador y no tiene ningún socket en uso para este tráfico (la excepción es docker-proxypara manejarHorquilla NATcuando no está deshabilitado con --userland-proxy=false, en cuyo caso la horquilla NAT se haría coniptablesyroute_localnet).

Como usa Dockeriptablesy NAT, todo esto es rastreado por Netfilterconectar.

Para ver los flujos rastreados, utilice elconntrackcomando (instale el conntrackpaquete si es necesario). Como todo este tráfico es NAT, este comando mostrará todos los flujos relevantes:

conntrack -L --any-nat -d 192.168.0.20

Se debe ejecutar en el sistema con dirección 192.168.0.10, mostrando los flujos NAT de origen (contenedor como cliente) vistos desde el sistema con dirección 192.168.0.20.

Si la aplicación de destino en el sistema con dirección 192.168.0.20 también está en un contenedor Docker, cuando se ejecute el mismo comando en ese sistema mostrará los flujos NAT de destino (contenedor como servidor). De lo contrario, no se mostrará nada ya que no hay NAT para mostrar.

información relacionada