Por que o ouvinte netcat dentro de um contêiner docker do Ubuntu ignora silenciosamente a porta especificada em favor de uma aleatória?

Por que o ouvinte netcat dentro de um contêiner docker do Ubuntu ignora silenciosamente a porta especificada em favor de uma aleatória?

Gostaria de gerar um ouvinte netcat em uma determinada porta dentro de um contêiner do docker para depurar manualmente as solicitações recebidas, mas o comportamento do netcat dentro do docker parece diferente do que eu costumava observar em uma configuração não dockerizada. Tomando o vanilla Ubuntu 18.04 como exemplo:

sudo docker run -it -p 6010:6010 ubuntu:18.04

# inside container
apt-get update && apt-get install -y netcat net-tools
nc -lk 0.0.0.0 6010 &

# then to verify what I am listening on
netstat -an|grep LISTEN

# example output:
# tcp        0      0 0.0.0.0:39331           0.0.0.0:*               LISTEN     

Nenhum erro de qualquer tipo, apenas uma alocação silenciosa de um ponto diferente. Pela experiência de geração de ouvinte não dockerizado, eu costumava pensar que receberia um erro (como porta ocupada) ou a porta solicitada seria alocada com sucesso. O que está acontecendo aqui e como forçar a escuta na porta desejada?

Apenas para antecipar possíveis sugestões, como diz o homem do netcat em -p [port]:

É um erro usar esta opção em conjunto com a opção -l.

Responder1

Conforme sugerido nos comentários, a versão do BusyBox netcat requer -pa especificação da porta de escuta, portanto a página de manual citada não se aplica neste caso. Esta é a linha de comando correta para o BusyBox netcat:

nc -l -p 6010      # IP can be left out if it is 0.0.0.0 (all IPs)

Aqui está a página de ajuda do nc na minha versão do Alpine:

/ # nc -v
BusyBox v1.32.1 () multi-call binary.

Usage: nc [OPTIONS] HOST PORT  - connect
nc [OPTIONS] -l -p PORT [HOST] [PORT]  - listen

        -e PROG Run PROG after connect (must be last)
        -l      Listen mode, for inbound connects
        -lk     With -e, provides persistent server
        -p PORT Local port
        -s ADDR Local address
        -w SEC  Timeout for connects and final net reads
        -i SEC  Delay interval for lines sent
        -n      Don't do DNS resolution
        -u      UDP mode
        -v      Verbose
        -o FILE Hex dump traffic
        -z      Zero-I/O mode (scanning)```

informação relacionada