Armadilloフォーラム

Armadillo Base OSのコンテナからホストのネットワーク設定を変更できますか

haramoto

2023年5月30日 12時51分

お世話になっております。

現在、Armadillo 640で動作するアプリケーションをX2へ移植作業をしているものです。
Armadillo 640のアプリケーションをDebianのコンテナにして、X2で動作するようほとんどの機能を移植することができました。
ただ1点だけ移植する方法がわからないの部分があったので質問させていただきます。

移植中のアプリケーションは、運用中にアプリケーションのAPIを使用してArmadillo 640の本体のネットワーク設定を変更することができるものでした。
X2に移植しても同様の機能を実現させていのですが、コンテナ内からホストのネットワーク設定を変更することができるでしょうか。
どうぞよろしくお願い致します。

コメント

at_dominique.m…

2023年5月30日 13時42分

haramotoさん、

お世話になっています、
アットマークテクノのマルティネです。

> 移植中のアプリケーションは、運用中にアプリケーションのAPIを使用してArmadillo 640の本体のネットワーク設定を変更することができるものでした。
> X2に移植しても同様の機能を実現させていのですが、コンテナ内からホストのネットワーク設定を変更することができるでしょうか。
> どうぞよろしくお願い致します。

コンテナからホストのネットワークの変更を行いたいですね。この点は確かにかなり難しくなりました。

場合によっていくつかのやり方がありますので、この中に使えそうな方法があったら使ってみてください:

1. ホスト側の設定を止めて、コンテナで制御します:
ホスト側の NetworkManager からコンテナで管理したいインターフェースを disable します。 ABOS 3.17.3-at.5 以降の「/etc/NetworkManager/conf.d/00_disable_ap.conf」を参考できます。
コンテナコンフィグに「set_network host」と「add_args --cap NET_ADMIN」で起動すれば、コンテナから直接にネットワーク管理ができるようになりますので、設定をそちらで記録して適用できます。

2. ワークアラウンドに近いですが… Armadillo ホスト側に sshd を起動させて、コンテナからデフォルトルートを取得して (おそらく 10.88.0.1 ) 接続すれば、ホスト側の設定を変更できます。nmcli を使って /etc/NetworkManager/system-connections のファイルを persist_file で保存すれば何でも対応できるはずです。

3. /run/dbus をコンテナと共有すれば (コンテナコンフィグの「add_volumes /run/dbus:/run/dbus」など)、コンテナから nmcli などを使ってホスト側の networkmanager を管理できますが、その場合は保存されたコンフィグを永続化できませんのでご注意ください。また、コンテナの nmcli とホスト側のサービスのバージョンの差で不具合の可能性もあります;コンテナで同じ alpine バージョンを使った方に向いてる方法かもしれません。

簡単な方法がなくて申し訳ございません、今の段階では BaseOS のコンフィグを固定した使い方がほとんどでしたがもう少し使いやすくしたいと思っています。

よろしくお願いします。

マルティネ様

コンテナからのホストのネットワークの変更方法を教えてくださりありがとうございます。
1か2の方法で試してみたいと思います。
ありがとうございました。

マルティネ様

お世話になります。
なるほどそんな方法があるんですね。
色々考えたんですが良い方法が思いつかなくて。
大変参考になりました。
1か2の方法でやってみたいともいます。
ありがとうございました。

横からコメント/質問してしまい申し訳ありません。(投稿を分けたほうが良ければ分けます。)
私たちもコンテナ内からネットワーク設定を変更するアプリケーションを検討しています。

マルティネさんが↑に記載した1つ目の方法、「1. ホスト側の設定を止めて、コンテナで制御します」を使う場合について質問させてください。

(1) コンテナ内から設定を制御する場合、nmcliではなくipコマンドを使うという理解で正しいでしょうか? debianベースコンテナにNetworkManagerをインストールしましたが、nmcliは使えませんでした。
(2) ホスト(alipne)では名前解決をdnsmasqでキャッシュしているようです。コンテナ内から制御する場合は、これを無視してコンテナ内のresolv.confでDNSサーバを指定してよいのでしょうか?

また、マルティネさんのコメントにある下記の部分で、もし検討が進んでいる仕組みがありましたら教えていただきたいです。

> 簡単な方法がなくて申し訳ございません、今の段階では BaseOS のコンフィグを固定した使い方がほとんどでしたがもう少し使いやすくしたいと思っています。

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

at_dominique.m…

2023年9月11日 13時59分

tmygtさん、

マルティネです。

> マルティネさんが↑に記載した1つ目の方法、「1. ホスト側の設定を止めて、コンテナで制御します」を使う場合について質問させてください。
>
> (1) コンテナ内から設定を制御する場合、nmcliではなくipコマンドを使うという理解で正しいでしょうか? debianベースコンテナにNetworkManagerをインストールしましたが、nmcliは使えませんでした。

そうですね、set_network host + add_args --cap-app NET_ADMIN + dbus の手動起動で networkmanager を起動できましたが、今改めて考えてもおすすめできません。
理由は単純な設計の話で具体的な失敗がみてませんが、何かの不具合でコンテナできなかったりするとネットワークさえあれば復帰できる可能性があると思います。ネットワークまでコンテナで制御すると、救える状況を救えなくなりますのでちょっと心配です。

> (2) ホスト(alipne)では名前解決をdnsmasqでキャッシュしているようです。コンテナ内から制御する場合は、これを無視してコンテナ内のresolv.confでDNSサーバを指定してよいのでしょうか?

これも理論の話として回答するだけですが、ホスト側の機能を使用する場合(OTAアップデート等)に /run/NetworkManager をコンテナのボリュームでマウントしてそこの no-stub-resolv.conf を提供した方がいいと思います(/etc/dnsmasq.d/dns.conf 参考)

> また、マルティネさんのコメントにある下記の部分で、もし検討が進んでいる仕組みがありましたら教えていただきたいです。
>
> > 簡単な方法がなくて申し訳ございません、今の段階では BaseOS のコンフィグを固定した使い方がほとんどでしたがもう少し使いやすくしたいと思っています。

そのコメント以来、ABOS-Web ができて少しずつ進んでいますが、コンテナから設定するには ABOS-Web に REST API などが必要で、まだできてません。

2023年9月現状、ネットワーク設定の推奨は以下のとおりです:
* ABOS-Web を使えるなら、使ってください。設置されているところで使えない場合もありますが、細かいファイルの保存はそのサービスで行っていますので使えたら便利だと考えています。

* (やっぱり REST API が理想なので、頑張れば curl でできなくはないが今の URL を変更しない保証はないのでおすすめできないですね…もう少し時間をください)

* 5月で提案した内に、(2) が一番安定して使えると思います。コンテナからホストに ssh して nmcli 等で制御できますので、ABOS-Web を使えない場合はそっちらを推奨しています。

よろしくお願いします。

マルティネさん

コメントありがとうございます。
コンテナ内でのネットワーク設定がおすすめできないと理解しました。

> 2023年9月現状、ネットワーク設定の推奨は以下のとおりです:
> * ABOS-Web を使えるなら、使ってください。設置されているところで使えない場合もありますが、細かいファイルの保存はそのサービスで行っていますので使えたら便利だと考えています。
>
> * (やっぱり REST API が理想なので、頑張れば curl でできなくはないが今の URL を変更しない保証はないのでおすすめできないですね…もう少し時間をください)
>
> * 5月で提案した内に、(2) が一番安定して使えると思います。コンテナからホストに ssh して nmcli 等で制御できますので、ABOS-Web を使えない場合はそっちらを推奨しています。

顧客に操作してもらうことなどから、やはりABOS Webを直接使うのは難しいです。
SSHか、必要な機能のみREST APIを提供するようなサービスを自作してホスト上で動作させることを検討します。
ご対応ありがとうございました。