Systemtap examples, Network - 3 Monitoring Incoming TCP Connections

less than 1 minute read

背景

例子来自tcp_connections.stp脚本, 当有新的tcp连接建立时, 输出用户id, 本地命令名, 进程id, 本地端口, 源ip.  
用到两个内核函数探针  
kernel.function("tcp_accept").return ?   
kernel.function("inet_csk_accept").return ?   
问号表示没有这个函数时也不报错, 用以在多个内核版本间兼容使用.  
脚本内容以及注解  
[root@db-172-16-3-150 network]# cd /usr/share/systemtap/testsuite/systemtap.examples/network  
[root@db-172-16-3-150 network]# cat tcp_connections.stp  
#!/usr/bin/stap  
  
probe begin {  
  printf("%6s %16s %6s %6s %16s\n",  
         "UID", "CMD", "PID", "PORT", "IP_SOURCE")  
}  
// stap脚本开始时, 屏幕打印信息头信息:   
// 用户id, 命令信息, 进程id, 本地端口, 源ip  
probe kernel.function("tcp_accept").return?,  
      kernel.function("inet_csk_accept").return? {  
  sock = $return  
  if (sock != 0)  
    printf("%6d %16s %6d %6d %16s\n", uid(), execname(), pid(),  
           inet_get_local_port(sock), inet_get_ip_source(sock))  
}  
// inet_get_local_port(sock) 用于从sock取出这个连接的本地的tcp端口.  
// inet_get_ip_source(sock) 用于从sock取出这个连接的远端ip.  
  
执行输出举例  
[root@db-172-16-3-150 network]# stap ./tcp_connections.stp   
   UID              CMD    PID   PORT        IP_SOURCE  
// 当有新的tcp连接建立时, 会看到屏幕输出, 如下 :   
   500         postgres   7005   1921      172.16.3.40  
     0             sshd   1931     22      172.16.8.31  
// 第一条是与本地PostgreSQL建立连接的记录  
// 第二条是与本地sshd服务建立连接的记录.  
  
本文用到2个从sock中取本地端口和源ip的的systemtap函数.  
Name  
    function::inet_get_ip_source — Provide IP source address string for a kernel socket  
Synopsis  
    inet_get_ip_source:string(sock:long)  
Arguments  
    sock  
    pointer to the kernel socket  
  
Name  
    function::inet_get_local_port — Provide local port number for a kernel socket  
Synopsis  
    inet_get_local_port:long(sock:long)  
Arguments  
    sock  
    pointer to the kernel socket  

参考

1. /usr/share/systemtap/testsuite/systemtap.examples

2. https://sourceware.org/systemtap/SystemTap_Beginners_Guide/useful-systemtap-scripts.html

3. systemtap-testsuite

4. https://sourceware.org/systemtap/examples/

5. /usr/share/systemtap/testsuite/systemtap.examples/index.txt

6. /usr/share/systemtap/testsuite/systemtap.examples/keyword-index.txt

7. /usr/share/systemtap/tapset

8. https://sourceware.org/systemtap/tapsets/API-inet-get-local-port.html

9. https://sourceware.org/systemtap/tapsets/API-inet-get-ip-source.html

Flag Counter

digoal’s 大量PostgreSQL文章入口