我正在寻找一个特定的位置来向linux内核添加某种钩子,这将允许我执行以下操作:
我一直在看网络过滤器挂钩,但它们似乎不符合需要。bpf过滤器只查看数据包本身。
我还在看套接字连接的LSM挂钩。我可以尝试从套接字连接挂钩实现这一点,方法是查看请求的端口电流绑定到哪个进程来预测连接的位置,这听起来很麻烦。
发布于 2018-12-21 23:04:07
一种简单的方法可以是使用Linux网络名称空间。
Linux网络命名空间
顾名思义,网络名称空间将网络的使用--设备、地址、端口、路由、防火墙规则等--划分为单独的盒子,实质上是在一个运行中的内核实例中虚拟化网络。网络命名空间进入内核在2.6.24,.
请参阅https://lwn.net/Articles/580893/
取消共享
unshare()允许进程(或线程)断开其执行上下文中当前与其他进程(或线程)共享的部分。
请参阅http://man7.org/linux/man-pages/man2/unshare.2.html
Testcase
由于程序应该能够与自己结合,我们需要一个通过套接字与自己通信的程序。有一个很酷的答案,它显示了一个简单的Java程序,它可以传输文本“Hello!”通过套接字到自身,请参见这里的https://stackoverflow.com/a/8119708。
/usr/bin/java SendReceive按预期工作,并输出“Hello!”
使用-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答案:https://unix.stackexchange.com/a/83348:阻止进程的网络访问?
截图
这里是上面提到的在Ubuntu18.10上执行的测试用例的屏幕截图:

https://stackoverflow.com/questions/53641491
复制相似问题