首页 > *nix应用编程, *nix技术, TCP/IP, 内核技术, 应用程序, 网络协议, 跟踪调试 > Linux下如何在应用层获取连接跟踪事件

Linux下如何在应用层获取连接跟踪事件

2018年2月23日 发表评论 阅读评论 1,288 次浏览

承接上一篇,如果不仅仅只是需要系统当前连接跟踪的静态信息,而需要及时获取连接跟踪的事件信息,又该怎么做?

有两个示例可以获取Linux系统当前的连接跟踪信息,并在连接跟踪事件发生(例如新建连接,断开连接)时进行及时回调:

这里有一个go语言实现的程序:https://github.com/akashihi/conntrack-logger

在源码包libnetfilter_conntrack-1.0.6的utils目录下也有几个类似的实现:
conntrack_events.c、ctexp_events.c、expect_events.c。

以conntrack_events.c为例看看效果:
1,先看看代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

#include <libnetfilter_conntrack/libnetfilter_conntrack.h>

static int event_cb(enum nf_conntrack_msg_type type,
		    struct nf_conntrack *ct,
		    void *data)
{
	static int n = 0;
	char buf[1024];

	nfct_snprintf(buf, sizeof(buf), ct, type, NFCT_O_XML, NFCT_OF_TIME | NFCT_OF_TIMESTAMP);
	printf("%s\n", buf);

	if (++n == 10)
		return NFCT_CB_STOP;

	return NFCT_CB_CONTINUE;
}

int main(void)
{
	int ret;
	struct nfct_handle *h;

	h = nfct_open(CONNTRACK, NFCT_ALL_CT_GROUPS);
	if (!h) {
		perror("nfct_open");
		return 0;
	}

	nfct_callback_register(h, NFCT_T_ALL, event_cb, NULL);

	printf("TEST: waiting for 10 events...\n");

	ret = nfct_catch(h);

	printf("TEST: conntrack events ");
	if (ret == -1)
		printf("(%d)(%s)\n", ret, strerror(errno));
	else
		printf("(OK)\n");

	nfct_close(h);

	ret == -1 ? exit(EXIT_FAILURE) : exit(EXIT_SUCCESS);
}

逻辑比较简单,主要是几个函数的使用,具体可以查阅doc文档:http://netfilter.org/projects/libnetfilter_conntrack/
上面的输出是xml格式,为了方便终端里查看,我改为了NFCT_O_PLAIN。

1,首先进行编译:

# gcc conntrack_events.c -o conntrack_events -lnetfilter_conntrack

2,执行程序后,在另外一台机器ping该台机器,即可抓到对应的icmp事件:

# ./conntrack_events 
TEST: waiting for 10 events...
    [NEW] icmp     1 30 src=192.168.137.130 dst=192.168.137.131 type=8 code=0 id=36522 [UNREPLIED] src=192.168.137.131 dst=192.168.137.130 type=0 code=0 id=36522
 [UPDATE] icmp     1 30 src=192.168.137.130 dst=192.168.137.131 type=8 code=0 id=36522 src=192.168.137.131 dst=192.168.137.130 type=0 code=0 id=36522
^C

嗯,貌似很简单,如果没有看到对应的信息,请查看是否加载了nf_conntrack、nf_conntrack_ipv4模块,是否有root权限。

PS:
通过打开对应的内核选项,可以看到更多的信息,例如通过如下命令就可以统计连接上的包数和流量大小:
echo “1” > /proc/sys/net/netfilter/nf_conntrack_acct

nf_conntrack_acct – BOOLEAN 0 – disabled (default)
not 0 – enabled
Enable connection tracking flow accounting. 64-bit byte and packet counters per flow are added.

PS2:
通过加载nf_conntrack_ftp模块,所有ftp关联连接能够注册回调实时捕获。
演示命令:# conntrack -E expect

默认ftp端口就是21。如果修改了ftp服务器端口,那么需要在加载nf_conntrack_ftp模块时指定ftp端口:
# modprobe nf_conntrack_ftp ports=6069

转载请保留地址:http://www.lenky.info/archives/2018/02/2603http://lenky.info/?p=2603


备注:如无特殊说明,文章内容均出自Lenky个人的真实理解而并非存心妄自揣测来故意愚人耳目。由于个人水平有限,虽力求内容正确无误,但仍然难免出错,请勿见怪,如果可以则请留言告之,并欢迎来讨论。另外值得说明的是,Lenky的部分文章以及部分内容参考借鉴了网络上各位网友的热心分享,特别是一些带有完全参考的文章,其后附带的链接内容也许更直接、更丰富,而我只是做了一下归纳&转述,在此也一并表示感谢。关于本站的所有技术文章,欢迎转载,但请遵从CC创作共享协议,而一些私人性质较强的心情随笔,建议不要转载。

法律:根据最新颁布的《信息网络传播权保护条例》,如果您认为本文章的任何内容侵犯了您的权利,请以Email或书面等方式告知,本站将及时删除相关内容或链接。

  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.