Skip to content

追踪快速消失的TCP连接

有些时候,Linux系统上会发起一些TCP连接,但很快就结束。传统的netstat、ss或者lsof这类工具很难追踪到是谁(UID)或者哪一个程序(binary)发起的。我觉得perf可以追踪到,但是还不知道具体该怎么操作。

看了一下perf的文档,看来至少在CentOS 6.x上perf是行不通的。没有相关的追踪点。又查了一下ss,至少下面这个小脚本可以达到我的目的:

找出到底是哪个用户、什么进程在连接某个特定的端口/IP:

[root@sc-perf02 logfiles]$ while (true) do myid=$(ss -tpn '( dport = :3476 or dport = :3477 )' | grep -v State|awk '{print $NF}' |awk -F"," '{print $2}'); if [ "X$myid" != "X" ];then ps -f -www -p $myid ;fi;sleep 1;done

UID        PID  PPID  C STIME TTY          TIME CMD
zabbix   10424  9648  5 11:47 ?        00:00:00 /opt/perforce/bin/python/3.4.2/bin/python3 /opt/perforce/scripts/zabbix-p4-synth-check.py --port p4-ac-data-apac-edge01.example.org:3477 --proxy

UID        PID  PPID  C STIME TTY          TIME CMD
zabbix   10937  9648  0 11:48 ?        00:00:00 /opt/perforce/bin/python/3.4.2/bin/python3 /opt/perforce/scripts/zabbix-p4-synth-check.py --port p4-ac-data-apac-edge01.example.org:3477 --proxy

这个脚本的逻辑在于,使用while循环运行ss -tpn '(dport = :3476 or dport = :3477)',这个命令可以检查是否又向外连接3476或3477端口的socket,如果有的话,它会输出相关的进程的程序名称(python3,如下),PID (17939)。

State      Recv-Q Send-Q     Local Address:Port     Peer Address:Port
ESTAB      0      0          10.233.47.202:53670    10.194.101.69:3477   users:(("python3",17939,7))

然后使用一串grep、awk命令获取PID,如果找到的话就运行ps -f -www -p $PID ,然后就可以看到哪个用户,哪个程序发起了这个特定的连接。

Avatar

专业Linux/Unix/Windows系统管理员,开源技术爱好者。对操作系统底层技术,TCP/IP协议栈以及信息系统安全有强烈兴趣。电脑技术之外,则喜欢书法,古典诗词,数码摄影和背包行。

Sidebar