Armadilloフォーラム

独自DHCPクライアントでのIPアドレス取得

yhashi1977

2024年6月10日 15時49分

Armadillo-610(ABOS)のコンテナを作成し、独自のDHCPクライアントを動作させて、
ホスト側のIPアドレスを設定させたいです。

ホスト側のDHCPを無効にして、
コンテナからDHCPDISCOVERをソケットで送信しようとしましたが、
sendto()でエラーとなりました。
エラーメッセージ:Network is unreachable

コンテナのconfファイルにてネットワークは
set_network host
としています。

ホスト側のDHCPを有効にすると
DHCPDISCOVERを送信できるようになり、ルーターからDHCPOFFERが返ってきますが、
コンテナ側で、DHCPのポート68を受信する処理を入れると、
bind()でエラーとなります。
エラーメッセージ:Address already in use

コンテナを使って、独自DHCPクライアントによるホスト側のIPアドレス設定は
できないのでしょうか?

ABOSを使用しなければ、上記目的は達成できますでしょうか?

コメント

at_dominique.m…

2024年6月10日 16時19分

yhashi1977さん

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

> Armadillo-610(ABOS)のコンテナを作成し、独自のDHCPクライアントを動作させて、
> ホスト側のIPアドレスを設定させたいです。

好奇心で聞きますが、NetworkManager で設定できない dhcp のオプションがありますでしょうか?
コンテナで独自の DHCP クライアントは使えますが、
標準のソフトでできればそちらの方がいいと思いますので、
説明が面倒でなければ聞きます。

> ホスト側のDHCPを無効にして、
> コンテナからDHCPDISCOVERをソケットで送信しようとしましたが、
> sendto()でエラーとなりました。
> エラーメッセージ:Network is unreachable

NET_RAW の権限をコンテナに渡していますか?
IP を取得できてインタフェースに設定するには NET_ADMIN も必要になりますので、
まだ設定されてなかったらコンテナの conf ファイルにこれを追加してみてください:

add_args --cap-add NET_RAW
add_args --cap-add NET_ADMIN

試しに、このコンフィグで busybox udhcpc をコンテナから起動できました。

ちなみに、 DNS サーバーの設定も面倒になりますが、/etc/dnsmasq.d/custom.conf 等に
「resolv-file=/var/app/volumes/dnsmasq/resolv.conf」等にして、
/var/app/volumes/dnsmasq をコンテナのボリュームとしてマウントすれば dnsmasq はそれを編集する時に拾ってくれます。
/etc/dnsmasq.d/dns.conf の設定に NetworkManager が管理する別の resolv.conf が入ってますが、
NetworkManager が別のインターフェスでサーバーを取得しなければ更新されないのでファイルが無視されます。
仕組みとしては、最新のファイルが使用されます。
/etc/dnsmasq.d/dns.conf を編集してもいいですが、その場合は preserve_file -P (Armadillo Base OS 更新の際に
armadillo側のファイルを優先する) で保存してください。分かりにくい実装ですみません…)

> ホスト側のDHCPを有効にすると
> DHCPDISCOVERを送信できるようになり、ルーターからDHCPOFFERが返ってきますが、
> コンテナ側で、DHCPのポート68を受信する処理を入れると、
> bind()でエラーとなります。
> エラーメッセージ:Address already in use

これは仕方ないですね、できたとしてもホスト側かコンテナ側が返事をもらう側を選べないので、
そういう2重起動を推奨できません。

よろしくお願いします。

yhashi1977

2024年6月12日 16時11分

マルティネさん
ご返信ありがとうございます。

結論から言うと自己解決しました。

> 好奇心で聞きますが、NetworkManager で設定できない dhcp のオプションがありますでしょうか?
> コンテナで独自の DHCP クライアントは使えますが、
> 標準のソフトでできればそちらの方がいいと思いますので、
> 説明が面倒でなければ聞きます。

NetworkManagerでDHCPのオプションエリアの変更ができるのですね。
DHCPサーバに対して送らないオプションもあったので、
独自で作成する必要があると思いチャレンジしています。

> NET_RAW の権限をコンテナに渡していますか?
> IP を取得できてインタフェースに設定するには NET_ADMIN も必要になりますので、
> まだ設定されてなかったらコンテナの conf ファイルにこれを追加してみてください:
>

> add_args --cap-add NET_RAW
> add_args --cap-add NET_ADMIN
> 

NET_RAWとNET_ADMINは設定済みでした。
> sendto()でエラーとなりました。
> エラーメッセージ:Network is unreachable
この原因はネットワークが接続状態になっていなかったためのようです。
nmcliでipv4.methodをdisableに設定していましたが、
ipv4.methodをmanualに設定し、固定IPを設定することで
このエラーは出なくなりました。

> > ホスト側のDHCPを有効にすると
> > DHCPDISCOVERを送信できるようになり、ルーターからDHCPOFFERが返ってきますが、
> > コンテナ側で、DHCPのポート68を受信する処理を入れると、
> > bind()でエラーとなります。
> > エラーメッセージ:Address already in use
固定IPにすることで、このエラーも出なくなりました。

ipv4.gatewayのアドレスをDHCPサーバのIPアドレスにすることで、
DHCPDISCOVERがDHCPサーバ(ルーター)に到達し、
DHCPOFFERを受信することが確認できました。

以上、ありがとうございました。