为什么 Ubuntu docker 容器内的 netcat 监听器会默默忽略指定端口而使用随机端口?

为什么 Ubuntu docker 容器内的 netcat 监听器会默默忽略指定端口而使用随机端口?

我想在 Docker 容器内的给定端口上生成一个 netcat 侦听器,以便手动调试传入的请求,但 Docker 内部的 netcat 行为似乎与我在非 Dockerized 设置中观察到的行为不同。以 vanilla Ubuntu 18.04 为例:

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     

没有任何错误,只是静默分配了不同的点。根据非 dockerized 侦听器生成的经验,我曾经认为我会得到一个错误(例如端口被占用)或者请求的端口将被成功分配。这里发生了什么以及如何强制监听所需的端口?

只是为了预测潜在的建议,正如 netcat 的人所说-p [port]

将此选项与 -l 选项结合使用是错误的。

答案1

正如评论中所建议的,BusyBox netcat 版本需要-p指定监听端口,因此您引用的手册页不适用于这种情况。这是 BusyBox netcat 的正确命令行:

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

这是我的 alpine 版本中 nc 的帮助页面:

/ # 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)```

相关内容