Linux:拦截连接建立

mav*_*rik 1 linux networking kernel

我希望能够拦截连接建立,例如想知道某个进程(任何进程)何时建立连接。有没有办法实现这一目标?

我唯一能想到的就是拦截connect()系统调用。但可能还有其他方法吗?可能是在内核中创建网络上下文时?

目标是根据某些要求过滤进程并实时启用/禁用连接建立。

提前致谢。

PS 我这样做是出于绝对合法的目的。

PPS 我在谷歌搜索过,但只找到了如何拦截已经建立的连接(不完全是我想要的)。我要的是一个想法,一个搜索方向,而不是一个代码。

Aus*_*arn 6

对于仅提取信息的方面,可以使用 AUDIT 匹配(如果不需要大量信息,则可能使用 LOG 匹配)使用 iptables 来完成。

对于基于一些复杂规则实时允许或禁止连接的情况,我不确定您是否可以在 Linux 上可靠地做到这一点。选项包括:

  • Seccomp-BPF,但我不确定它是否可以做到这一点(一旦在给定进程中实例化,过滤器将是静态的)。
  • 使用 LD_PRELOAD 或其他一些方法覆盖各种套接字调用。这是不可靠的,因为它很容易绕过(进行直接系统调用是微不足道的,您也可以使用dlopen()任何 libc 并以这种方式进行调用)。
  • net_cls对照组。这需要设置防火墙,可能会影响活动连接,并且可能无法完全按照您的意愿工作(它将需要一个守护进程,在进程启动时将进程移动到适当的控制组中)。
  • 如果你可以容忍一些数据进入网络,你可以使用 iptables NFLOG 目标并观察有趣的连接(如果你想要实时评估,你需要记录所有新连接并在用户空间解析东西),然后被动地关闭您不想要的连接。
  • 您可以在其自己的网络命名空间中运行每个应用程序并强制通过主机系统的出站流量,然后使用基于源的策略路由来控制到达实际网络的内容。

也就是说,您可能需要重新评估为什么需要它。除非您通过神经网络或其他启发式方法(由于多种原因,这两种方法都是有问题的选择)来提供决策,否则您几乎总是最好将东西直接编码到防火墙中(iptables 可以做到)一些非常复杂的东西,例如仅将使用特定 IP 协议的连接与特定 UID 以均匀分布的随机速率启动的特定端口匹配,并将不匹配的数据包发送到不同的目的地),或使用调度工具或其他钩子来更新防火墙动态规则(例如,在系统不使用时更改防火墙规则,或仅在该用户登录时允许来自给定 UID 的新连接)。