![Linux:拦截连接建立](https://linux22.com/image/116972/Linux%EF%BC%9A%E6%8B%A6%E6%88%AA%E8%BF%9E%E6%8E%A5%E5%BB%BA%E7%AB%8B.png)
我希望能够拦截连接建立,例如想知道某个进程(任何进程)何时建立连接。有办法实现吗?
我唯一能想到的就是拦截connect()
系统调用。但也许还有其他方法吗?可能是在内核中创建网络上下文时?
目标是根据某些要求过滤进程并实时启用/禁用连接建立。
提前致谢。
PS 我这样做是为了绝对合法的目的。
PPS 我在谷歌中搜索过,但只找到了如何拦截已经建立的连接(不完全是我想要的)。我要求的是一个想法,一个搜索方向,而不是一个代码。
答案1
对于提取信息而言,可以使用 AUDIT 匹配(如果不需要大量信息,则可能使用 LOG 匹配)通过 iptables 来完成此操作。
对于基于一些复杂规则实际允许或禁止实时连接的情况,我不确定您是否可以在 Linux 上可靠地做到这一点。选项包括:
- Seccomp-BPF,但我不确定它可以做到这一点(并且过滤器在给定进程中实例化后将是静态的)。
- 使用 LD_PRELOAD 或其他方法覆盖各种套接字调用。这是不可靠的,因为它很容易被绕过(进行直接系统调用很简单,您也可以使用
dlopen()
任何 libc 并以这种方式进行调用)。 - 对照
net_cls
组。这需要防火墙设置,可能会影响活动连接,并且可能无法完全按照您想要的方式工作(它将需要一个守护程序,在进程启动时将其移动到适当的控制组中)。 - 如果您可以容忍一些数据进入网络,您可以使用 iptables NFLOG 目标并监视有趣的连接(如果您想要实时评估,您需要记录所有新连接并解析用户空间中的内容),然后被动地关闭您不想要的连接。
- 您可以在每个应用程序自己的网络命名空间中运行每个应用程序,并强制出站流量通过主机系统,然后使用基于源的策略路由来控制到达实际网络的流量。
也就是说,您可能需要重新评估为什么需要这个。除非您通过神经网络或其他启发式方法(由于多种原因,这两种方法都是有问题的选择)来提供决策,否则您几乎总是最好将内容直接编码到防火墙中(iptables 可以做到)一些非常复杂的东西,例如仅将使用特定 IP 协议的连接以均匀分布的随机速率匹配到特定 UID 发起的特定端口,并将不匹配的数据包发送到不同的目的地),或者使用调度工具或其他挂钩来更新防火墙动态规则(例如,在系统不使用时更改防火墙规则,或者在用户登录时仅允许来自给定 UID 的新连接)。
答案2
目标是根据某些要求过滤进程并实时启用/禁用连接建立
netstat -pant |grep -i ESTABLISHED
上面的命令将为您提供已建立的连接、进程 ID/应用程序名称、用户
现在您已经拥有了所需的内容,您可能需要编写一个 bash 脚本来继续使用从第一个命令收到的信息。