我正在寻找一个特定的位置来向Linux内核添加某种挂钩,这将允许我执行以下操作:
我一直在寻找netfilter钩子,但它们似乎不适合需要。 bpf过滤器仅查看数据包本身。
我还在看套接字连接的LSM钩子。我可以尝试通过socket-connect钩子来实现此目的,方法是查看所请求的端口电流是否绑定了哪个进程,以预测连接将在何处进行连接,这听起来很黑。
答案 0 :(得分:5)
一种简单的方法可以是使用Linux网络名称空间。
Linux网络命名空间
顾名思义,网络名称空间将网络的使用(设备,地址,端口,路由,防火墙规则等)划分为单独的框,实际上是在单个运行的内核实例中虚拟化网络。网络名称空间在2.6.24中进入内核,...
请参阅https://lwn.net/Articles/580893/
取消共享
unshare()允许进程(或线程)取消其执行上下文的当前与其他进程(或线程)共享的部分的关联。
请参阅http://man7.org/linux/man-pages/man2/unshare.2.html
测试用例
由于一个程序应该能够与自己通讯,所以我们需要一个通过袜子与自己进行通讯的程序。有一个很酷的SO答案,它显示了一个简单的Java程序,该程序传输了文本“ Hello World!”。通过套接字连接到其自身,请参见此处https://stackoverflow.com/a/8119708。
/usr/bin/java SendReceive
按预期工作,并提供输出“ 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'
最终转移“ Hello World!”再次通过回送接口。顺便说一句:这是一个专用的环回设备。您无法访问标准回送设备上的开放端口。
另请参见以下出色的Unix Stackexchange答案:https://unix.stackexchange.com/a/83348:是否阻止进程的网络访问?
屏幕截图
以下是在Ubuntu 18.10上执行的上述测试用例的屏幕截图: