微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何限制接收一个普通的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 ,非超级用户可以绑定到多播组。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐