Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux内核钩子,知道套接字的目标进程_Linux_Sockets_Kernel_Hook - Fatal编程技术网

Linux内核钩子,知道套接字的目标进程

Linux内核钩子,知道套接字的目标进程,linux,sockets,kernel,hook,Linux,Sockets,Kernel,Hook,我正在寻找一个特定的位置,为linux内核添加某种钩子,使我能够执行以下操作: 仅检测TCP连接到环回的情况(127.0.0.1) 检测数据包的源进程是否与目标进程相同 如果是这种情况,请允许连接,拒绝任何其他环回连接(一个进程到另一个进程) 我一直在寻找netfilter挂钩,但它们似乎不适合需要。bpf过滤器只查看数据包本身 我也在看socket connect的LSM挂钩。我可以尝试通过套接字连接钩子来实现这一点,方法是查看请求的端口当前绑定到什么进程,以预测连接将连接到什么地方,这听

我正在寻找一个特定的位置,为linux内核添加某种钩子,使我能够执行以下操作:

  • 仅检测TCP连接到环回的情况(127.0.0.1)
  • 检测数据包的源进程是否与目标进程相同
  • 如果是这种情况,请允许连接,拒绝任何其他环回连接(一个进程到另一个进程)
我一直在寻找netfilter挂钩,但它们似乎不适合需要。bpf过滤器只查看数据包本身


我也在看socket connect的LSM挂钩。我可以尝试通过套接字连接钩子来实现这一点,方法是查看请求的端口当前绑定到什么进程,以预测连接将连接到什么地方,这听起来相当骇人听闻。

一个简单的方法是使用Linux网络名称空间

Linux网络名称空间

顾名思义,网络名称空间将网络设备、地址、端口、路由、防火墙规则等的使用划分到单独的框中,本质上是在单个运行的内核实例中虚拟化网络。网络名称空间在2.6.24中进入内核

取消共享

unshare()允许进程(或线程)解除当前与其他进程(或线程)共享的部分执行上下文的关联

测试用例

因为程序应该能够与自身通信,所以我们需要一个通过socks与自身通信的程序。有一个很酷的答案,显示了一个简单的Java程序,它传输文本“Hello World!”通过插座连接到自身,请参见此处

按预期工作,并给出输出“Hello World!”

使用-n选项可以取消共享网络名称空间

unshare -n -- sh -c '/usr/bin/java SendReceive'
给出SocketException:无法访问网络,因为无法访问环回设备

unshare -n -- sh -c 'ip link set dev lo up; /usr/bin/java SendReceive'
“你好,世界!”再次通过环回接口。顺便说一句:这是一个专用环回设备。无法访问标准环回设备上打开的端口

另请参阅这篇很酷的Unix Stackexchange答案::阻止进程的网络访问

屏幕截图

下面是上面提到的在Ubuntu 18.10上执行的测试用例的屏幕截图:


TCP连接不一定与单个进程关联。文件描述符在分叉时由子进程继承,也可以使用
sendmsg()
@Barmar在进程之间传递,这是一个很好的观点。如果套接字的任何一侧都有多个进程与之关联,那么这也是我想要拒绝的连接。有没有关于在哪里放置这样一个钩子的线索?看看这里:据我所知,没有从文件表返回到进程表的指针。所以你需要扫描所有进程的文件描述符,正在寻找一个指向问题中的套接字。@shoosh通过使用SELinux套接字钩子函数实现,您可以管理套接字结构的安全字段,并对套接字操作执行访问控制。@Kousic SELinux没有用于确认环回连接的钩子。它只有我提到的LSM钩子,允许您确认对connect()的调用
unshare -n -- sh -c 'ip link set dev lo up; /usr/bin/java SendReceive'