《端口与套接字:ss/netstat/lsof/socat/netcat》

《端口与套接字: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。

阅读 — · 全站 —
🎸 我的歌单 0 首