Systemtap examples, Network - 3 Monitoring Incoming TCP Connections
背景
例子来自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