免责声明
本文仅用于技术讨论与学习,利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者及本公众号不为此承担任何责任。
检测入站流量
-
定义在sock试图建立连接时出发的函数:
int trace_connect_entry(struct pt_regs *ctx, struct sock *sk)
2. 定义内部变量,分别为:
-
key_hash key = {}:用来作为散列的键的结构体。 -
full_packet packet_value = {}:用来存储此连接全部数据的结构体。 -
u8 verbose_state = 0:用于指示详细事件类型的状态变量。
u16 family = sk->__sk_common.skc_family;
if (family != AF_INET)
{
return 0;
}
4. 获取pid,端口,ip信息:
u32 pid = bpf_get_current_pid_tgid() >> 32;
u16 dst_port = sk->__sk_common.skc_dport;
dst_port = ntohs(dst_port);
u16 src_port = sk->__sk_common.skc_num;
u32 src_ip = sk->__sk_common.skc_rcv_saddr;
u32 dst_ip = sk->__sk_common.skc_daddr;
5. 检查pid是否在我们设置的监控列表中,不是则返回0:
u32 *monitored_pid = pid_list.lookup(&pid);
if (!monitored_pid)
{
return 0;
}
6. 如果目的ip不允许,不会阻断连接但是会记录下来:
u32 *allowed_ip = allow_list.lookup(&dst_ip);
if (!allowed_ip)
{
src_ip; =
src_port; =
dst_ip; =
dst_port; =
src_ip; =
src_port; =
dst_ip; =
dst_port; =
pid; =
sizeof(packet_value.comm));
verbose_state = 1;
&packet_value);
}
else
{
verbose_state = 2;
}
if (VERBOSE_OUTPUT)
{
verbose_event v = {};
src_ip, dst_ip, src_port, dst_port, pid, verbose_state);
&v, sizeof(v));
}
运行效果
-
启动监控时:
2. 有连接产生时:
总结
本文讲述了如何监控socket入站流量,结合上一篇文章,讲解了如何使用BCC进行简单的tcp防火墙过滤与监控功能。
原文始发于微信公众号(赛博安全狗):【eBPF】BCC实现tcp防火墙(下)
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论