![限制特定用户组访问 SocketCAN](https://linux22.com/image/222249/%E9%99%90%E5%88%B6%E7%89%B9%E5%AE%9A%E7%94%A8%E6%88%B7%E7%BB%84%E8%AE%BF%E9%97%AE%20SocketCAN.png)
我有一台 PC,机器人通过 CAN(使用 SocketCAN)连接到该 PC。我想控制谁可以向机器人发送命令,最好是通过一个组(即只有“use_robot”组中的用户有权通过 CAN 发送/接收任何内容)。
我怎样才能实现这个目标?据我了解,SocketCAN 使用网络接口,因此,可能以某种方式与 iptables 一起使用?
答案1
我想控制谁可以向机器人发送命令,最好是通过一组......
我今天花了一点时间看这个。我可以阻止群组成员发送使用 nftables 规则集传输至 CAN 接口的流量如下:
table netdev canfilter {
chain can1egress {
type filter hook egress device can1 priority filter; policy accept;
skgid 1000 counter drop;
}
}
(counter
上面的规则集中的内容不是必需的;它只是将数据包计数添加到 的输出中nft list ruleset
。)
这会阻止组 1000 的成员通过接口发送can1
。如果我尝试cangen can1
以 gid 1000 的用户身份运行,我会看到:
$ sudo -u testuser cangen can1
write: No buffer space available
然而,如果我与不在该组中的用户执行相同的操作,则它可以正常工作(并且我可以使用candump
另一个链接接收流量)。
我认为这可以实现你的目标。
我认为不可能限制接待通过uid;查看使用类似以下内容生成的日志:
table netdev canfilter {
chain can0ingress {
type filter hook ingress device can0 priority filter; policy accept;
log group 0;
}
}
看起来在接收端我们无法访问 uid/gid 元数据(这是有道理的,因为数据包可能来自本地系统以外的地方)。
为了测试这一点,我使用了cangen
和candump
实用程序can-utils
项目,以及ulogd
用于日志记录,因为我对 CAN 接口使用隔离的命名空间(因此常规内核日志记录不是一个选项)。
我简化了测试并将所有内容放在网上这里。