如何收集进程产生的网络连接日志信息?

justlearnm0re
  • 4
新手上路,请多包涵

这边尝试过如下几种方式:
1、根据cn_proc拿到的pid去/proc/pid/net下去取,但这种只能拿到进程创建马上建立连接的日志,存在大量数据丢失,显然不太行
2、遍历/proc/net/tcp,netstat的逻辑,但是某些瞬时数据也可能拿不到,而且会比较消耗用户态io
3、netfilter内核框架写lkm,调研结果显示各个内核版本之间差异较大,不具备普适性

emmm 感觉以上这几种方式都不太行,感觉目前缺的是进程产生网络连接时的信号(回调也算),想请问下dalao们目前有哪些通用的技术手段能比较优雅的拿到进程产生网络连接数据的(技术选型这块auditd和系统调用hook这块暂时不考虑)。

回复
阅读 853
1 个回答
✓ 已被采纳

一些参考

方式1: 通过内核 tracepoint 跟踪 connect/accept 系统调用

bcc-tools 有几个工具可以参考

  • tcpconnect 监听主动发起的连接
  • tcpaccept 监听被动接受的连接

用 ebpf 实现比较简单,但是对内核版本有一定要求。没有 ebpf 的情况可以用 SystemTap,实在不行还能写内核模块直接跟踪 tracepoint。

方式2:LD_PRELOAD 替换 libc 的 connect/accept,但只能监听自己启动的进程。

方式3: iptable 日志,不好关联进程信息

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏