為什麼 Ubuntu docker 容器內的 netcat 監聽器會默默地忽略指定連接埠而選擇隨機連接埠?

為什麼 Ubuntu docker 容器內的 netcat 監聽器會默默地忽略指定連接埠而選擇隨機連接埠?

我想在 docker 容器內的給定連接埠上產生一個 netcat 偵聽器,以便手動偵錯傳入請求,但 docker 內的 netcat 行為似乎與我在非 dockerized 設定中觀察到的不同。以普通 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)```

相關內容