如何限制接收一个普通的networking连接多播到根用户?

我编写了一个发送通用Netlink多播的内核模块,并使用libmnl编写了一个接收它们的用户态客户端。

这一切工作正常,但我的客户端工作,即使它不是根用户,我想要阻止。

男人7 netlink说:

Only processes with an effective UID of 0 or the CAP_NET_ADMIN capability may send or listen to a netlink multicast group.

很明显,听这部分是不正确的。 我试过CentOS 5(2.6.18),CentOS 6(2.6.32)和Ubuntu 14.04(3.13)。

有可能有2个内核模块链接到相同的/ dev /设备?

为什么堆栈必须是页面alignment的?

在Linux内核中从path获取inode

当用户空间中的系统调用被调用时,设备驱动程序fn不被调用

全局偏移表结构

我知道限制接收到的内核通用netlink命令只能从根目录可能与GENL_ADMIN_PERM标志,但是有可能发送多播从内核只能被根接收?

编辑:我分享了一些内核模块的代码发送netlink多播,和客户端接收它们,在https://github.com/craig65535/mcast-exmpl 。 构build说明在README.md中,但是我将在这里粘贴它们。

在一个terminal:

$ make $ sudo insmod mcast-exmpl.ko $ cd client $ make $ ./client genl ctrl msg Family ID: 26 Mcast group ID: 4

(ID可能不同)

在另一个terminal中,运行将执行TCP连接的命令。 mcast-exmpl钩子通过jprobe连接,这样做会导致它发送一个netlink多播。

$ nc yahoo.com 80 ^C $

在第一个terminal中,即使您没有以root身份运行客户端,您也会看到已收到netlink多播:

mcast-exmpl msg SEND_NUM 55555

我想修改这个,所以只有当client以root用户身份运行时,才能接收到多播,否则,确认我发现Linux文档或Linux本身存在bug。

如何使用tc和cgroup修改数据包

WDK 10 – 无法安装SDK7的目标Windows 7

内核模块:hrtimer_start“模块中的未知符号”

per-cpuvariables的地址

操作系统如何知道缺页的磁盘地址?

首先,我不熟悉netlink IPC机制。 不过,我相信我有一些有用的信息可以分享。

尽管是非root用户,但能够接收的原因还是因为内核的某些改变 ,使得非root用户能够读取uevent。

通过C中的Netlink查看从内核到用户空间的多播 ,看起来内核模块可以/应该指定一个struct netlink_kernel_cfg 。

从LXR ,它似乎被定义为

struct netlink_kernel_cfg { unsigned int groups; unsigned int flags; void (*input)(struct sk_buff *skb); struct mutex *cb_mutex; int (*bind)(struct net *net,int group); void (*unbind)(struct net *net,int group); bool (*compare)(struct net *net,struct sock *sk); };

谷歌搜索flags属性产生了这个结果说

标志成员可以是NL_CFG_F_NONROOT_RECV或NL_CFG_F_NONROOT_SEND 。 当设置NL_CFG_F_NONROOT_RECV ,非超级用户可以绑定到多播组。

相关文章

引言 本文从Linux小白的视角, 在CentOS 7.x服务器上搭建一个...
引言: 多线程编程/异步编程非常复杂,有很多概念和工具需要...
一. 宏观概念 ASP.NET Core Middleware是在应用程序处理管道...
背景 在.Net和C#中运行异步代码相当简单,因为我们有时候需要...
HTTP基本认证 在HTTP中,HTTP基本认证(Basic Authenticatio...
1.Linq 执行多列排序 OrderBy的意义是按照指定顺序排序,连续...