《端口与套接字:ss/netstat/lsof/socat/netcat》
排查端口监听、连接统计、端口转发是运维的日常工作。ss 是 netstat 的现代替代,lsof 用于查看进程打开的文件与端口,socat/nc 则可做端口转发与代理。
1 ss(Socket Statistics)
ss 位于 iproute2 包,比 netstat 更快、显示更详细。
# 查看监听中的 IPv4 socket
ss -4 state listening
# 查看 TCP 连接
ss -t -a
# 查看某端口是否被监听
ss -lnt | grep 8090
常见选项:
| 选项 | 说明 |
|---|---|
| -t / -u | 只显示 TCP / UDP |
| -l | 只显示监听 |
| -a | 显示所有 |
| -n | 不解析服务名(数字) |
| -p | 显示进程信息 |
| -4 / -6 | IPv4 / IPv6 |
| -s | 显示汇总统计 |
统计各类 TCP 状态数量:
ss -t -a | tail -n +2 | awk '{print $1}' | sort | uniq -c | sort -rn
2 netstat
# 监听中的端口(含进程)
sudo netstat -plnt | grep ':80'
# 监听 8073/8074 端口
sudo netstat -plnt | grep -E "807[3|4]"
# 统计 TCP 各种状态的数量
netstat -ant | tail -n +3 | awk '{print $6}' | sort | uniq -c | sort -rn
3 lsof:进程打开的文件与端口
# 整个系统打开的文件数
lsof | wc -l
# 某个进程打开的文件数量(先取 pid)
pidof nginx-front
lsof -p 12014 | tail -n +2 | wc -l
# 查看监听在 25 端口的服务
sudo lsof -i:25
注意:打开的文件数量 ≠ 文件描述符数量,查看进程文件描述符:
ls /proc/<pid>/fd/ | wc -l。
4 socat:端口转发
socat 是功能强大的双向数据转发工具(Debian/Ubuntu 安装:apt-get install -y socat)。
# 将本机 8000 端口转发到 127.0.0.1:80
socat TCP-LISTEN:8000,reuseaddr,fork tcp:127.0.0.1:80
# 后台运行日志转发
nohup socat TCP-LISTEN:8999,reuseaddr,fork tcp:192.168.1.13:8080 >> socat.log 2>&1 &
# 从终端读取数据发送到 TCP 端口
echo "test" | socat - TCP:127.0.0.1:8099
# 监听 Unix socket 并把数据流式输出(观察进程间通信)
socat unix-listen:/var/run/app_log.sock,mode=777,reuseaddr,fork - | tee output.txt
# 持续监听 TCP 并打印到终端
socat tcp-listen:8099,reuseaddr,fork -
关键选项:reuseaddr 端口可复用、fork 支持多连接并发、TCP-LISTEN 可指定本机绑定 IP。
5 netcat 做透明代理/端口转发
# 简单 HTTP 端口转发(fifo 方案)
mkfifo backpipe
cat backpipe | nc 192.168.1.13 8080 | nc -k -l 8999 > backpipe
# ncat 持续转发(--keep-open 支持多请求)
nohup ncat --keep-open -l 8999 -c 'nc 192.168.1.13 8080' > info.log 2> error.log &
# 转发 HTTPS 到后端(openssl 解密后转发)
mkfifo tmp; mkfifo tmp2
nc -l 8995 -k > tmp < tmp2 &
while true; do
openssl s_client -connect www.example.com:443 -quiet < tmp > tmp2
done
6 查本机出口 IP
echo -e "GET /anything HTTP/1.0\r\nHost: httpbin.org\r\n\r\n" | nc httpbin.org 80
# 或直接用 curl
curl httpbin.org/anything
7 总结
排查流程建议:先用 ss -lntp 看端口监听,再用 lsof -i:<port> 定位进程;转发需求优先考虑 socat(更稳定、支持 fork),简单场景用 nc/ncat。
阅读 —
·
全站 —