我知道 XDP 可以用来丢弃数据包/控制网络,但是我们如何在进程级别实现类似的事情?
内核不知道我们正在运行什么进程,所以我如何使用 eBPF 阻止特定进程的网络访问(类似于开放式告密者)?
答案1
OpenSnitch 不会使用 eBPF 阻止数据包。
它确实使用 eBPF,但用于跟踪内核堆栈中不同点的数据包,并收集有关这些数据包的指标和元数据,包括有关相关流所附加到的进程的信息。你可以看看OpenSnitch 目录中的相关探测器。
然后,该信息通过 eBPF 映射传递到用户空间,并且用户空间代理插入带有iptables
或 的新规则nftables
来阻止数据包。 (它可以使用 XDP 程序来代替阻止,但您仍然需要将收集数据的跟踪程序与网络堆栈中用于阻止数据包的任何程序分开。)
如果您想在系统范围内设置一些东西来丢弃与特定进程相关的数据包,您可能需要采用类似的方法:设置跟踪部分来识别连接与哪个进程相关,然后将此信息提供给另一个丢弃数据包的组件。
相反,如果您已经确定了要监视的特定进程,并且要过滤数据包(允许一些数据包,但不是所有数据包),那么您可以使用一些其他 eBPF 挂钩(套接字或 cgroup) -相关)将程序附加到特定的套接字或网络堆栈函数。