Armadilloフォーラム

コンテナでcan0を使えるようにしたい(add_args --net=hostを使わないで)

hata

2024年3月5日 19時29分

コンテナからCANを使いたいです。*.confに

add_args --net=host
add_args --cap-add=NET_ADMIN

を追加することでcan0をコンテナから見ることができ、ip link でupすることでコンテナから使用できるようにました。しかし、usb0もwlan0も全て繋がってしまいました。セキュリティとしても問題がありそうで、コンテナとして好ましい状態と思えません。
can0のみをコンテナに接続したいのですが、ブリッジなどを試してみましたがうまくいきません。
良い方法はありませんでしょうか。(コンテナはslim-bullseyeを使っております)

コメント

at_dominique.m…

2024年3月6日 9時21分

hataさん

お世話になっています、
マルティネです。

> を追加することでcan0をコンテナから見ることができ、ip link でupすることでコンテナから使用できるようにました。しかし、usb0もwlan0も全て繋がってしまいました。セキュリティとしても問題がありそうで、コンテナとして好ましい状態と思えません。

そうですね、理想では can だけをコンテナに提供したいですね。
NET_ADMIN の制限もありますので、net=host のコンテナは結局何でもできてしまいます…
ひとまず ip link up をあらかじめ ABOS から実行しておけば(/etc/local.d のスクリプトかコンテナのコンフィグで直接に行うなどで)コンテナに NET_ADMIN の制限がなくても通信できると思いますが、いかがでしょうか?

> can0のみをコンテナに接続したいのですが、ブリッジなどを試してみましたがうまくいきません。
> 良い方法はありませんでしょうか。(コンテナはslim-bullseyeを使っております)

ご確認していただいた通り、podman は残念ながら can 等の設定を可能としません。
--net=host も使いたくない場合はかなり面倒になりますが、iproute2 の ip コマンドで can0 インタフェースの namespace を変更できます。
Armadillo Base OS では busybox の ip コマンドしかありませんので、それもコンテナで実行する必要もあります…
手動でこういう形にできそうです:

armadillo:~# podman run --cap-add=NET_ADMIN --net=host -v /var/run/netns:/var/run/netns -ti --rm netns
/ # ip netns list
netns-55c02473-599c-9671-d5b9-1f0619e1ff8b (id: 0)
^ はデフォルトネットワークで実行しているターゲットコンテナの network namespace です。
podman inspect で確認すると「               "SandboxKey": "/run/netns/netns-55c02473-599c-9671-d5b9-1f0619e1ff8b"」として出てきます。
/ # ip link set can0 up
/ # ip link set can0 netns netns-55c02473-599c-9671-d5b9-1f0619e1ff8b

その後にターゲットコンテナから can0 のインタフェースを使えるようになります。

手動でできても、実際に運用で使うと考えてもかなり使いにくいと思います。
コンテナはalpha順番に起動されてますので普段の起動でスクリプトしてどうにかなるかもしれませんが、そのターゲットコンテナが停止してしまうとその network namespace が削除されて can インタフェースが消えてしまいます。再起動無しのアップデートか何かの理由でコンテナを再起動してしまうと can を使用できなくなりますのでかなり不便です。

インターフェースの移動以外に vxcan と can_gw の機能でどうにかできそうですが、Armadillo Base OS のカーネルに無効になっていますのでこのままでは使えませんし、設定方法も移動より複雑になりますので省略します。
https://wiki.automotivelinux.org/_media/agl-distro/agl2018-socketcan.pdf に英語の説明は少しあります。

個人的な意見としては、podman (netavark) での設定方法ができたらぜひ使いたいですが、現状ではコンテナに NET_ADMIN の制限がなければ net=host でいいと思います。
https://github.com/containers/netavark/issues/940 で netavark の開発者に連絡してその問題を説明しておいて、何か動きあれば Armadillo Base OS でも使えるようにします。

よろしくお願いします。

マルティネさん。

お世話になっております。hataです。
早々のご回答ありがとうございます。

当初の要望(canのみをつなぐ)を実現するには、現状では可能ではあるけれど現実的ではないと理解しました。
NET_ADMINを考慮しつつ、net=hostで対応したいと思います。

何点か、気になることがあるので教えて下さい。
・net=hostにすることで、気をつけること・考慮したほうが良いことがありましたら教えて下さい。
  (複数のコンテナで net=hostにしてはいけない。
  ベースのOSとコンテナで同じポートを使用するIP通信をしてはいけない。
  コンテナのソフトを作成する際に、特別に考慮することがある。 など)
・NET_ADMINをコンテナに与えたくないというは、コンテナがホストOSに影響を与える権限を持つのが好ましくないという常識的な感覚によるものでしょうか。
 (私もその様に思います。一方で、ホストOS側に何らかの処理(今回だと link ip up)を行うは、汎用的でなくなるのでうれしくない)

以上、よろしくお願いします。

at_dominique.m…

2024年3月7日 12時52分

マルティネです。

> 何点か、気になることがあるので教えて下さい。
> ・net=hostにすることで、気をつけること・考慮したほうが良いことがありましたら教えて下さい。

使い方としては特にないです。
コンテナの中のプロセスとホストのプロセスは同じネットワークネームスペースを共有していますので、普通に複数のアプリケーションを起動していると同じです(例えば、同じポートでサーバーを立てれない等)

複数のコンテナでも問題ありません。

NET_ADMIN がなければセキュリティの面でも net=host を使っても特に問題ないと思いますが、コンテナ内のアプリケーションが ip/mac address 等を見えてしまうので、リモートアクセスの場合にハードウェアの区別できるようになりますね… それぐらいでしょうか。

> ・NET_ADMINをコンテナに与えたくないというは、コンテナがホストOSに影響を与える権限を持つのが好ましくないという常識的な感覚によるものでしょうか。

はい、ユーザー向けやデータ入力を処理するアプリケーションに最小限の制限を与えたい気持ちだけです。
アプリケーションを通って実行できてしまうと、NET_ADMIN があればホスト側の IP アドレスやファイアウォールの変更はできますので、普段不要でしたら外しておいて少しだけ安心できると思います。

>  (私もその様に思います。一方で、ホストOS側に何らかの処理(今回だと link ip up)を行うは、汎用的でなくなるのでうれしくない)

確かに逆もそうですね…
普段でしたら ip link up 時点で can の baudrate など、バスの設定を行いますので、「利用者」よりはやっぱり「ハードウェア設定」側でネットワークの初期化処理だお思えばいかがでしょうか。
(dts で設定しているので最後まで dts で設定して自動的に up にしてほしいところですが、これも仕方ないですね…)

よろしくお願いします。

hataです。

おかげさまで、疑問は解決しました。ありがとうございました。
(方針は、検討の余地ありですが)