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
これをテストするためにandcandump
ユーティリティを使用しました。can-utils
プロジェクトとulogd
CANインターフェイスには分離された名前空間を使用しているため、ロギングに使用します(したがって、一般的なカーネルロギングはオプションではありません)。
テストを簡素化し、すべてをオンラインにしました。ここ。