Armadilloフォーラム

iptablesにRULE_APPENDできないことでpodmanコンテナが起動できない

imai98

2024年3月11日 16時23分

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

OP-TEEを利用するにあたって、Armadillo-IoT ゲートウェイ G4 セキュリティガイドの6.4.8「OP-TEEを組み込む」を参照し、podmanコンテナを起動することで利用しておりました。先週ごろまでは問題なくコンテナを起動し、利用できていたのですが先日起動を試みたところ以下のようなエラーが生じました。

Error: netavark: unable to append rule '-d 10.88.0.0/16 -j ACCEPT' to table 'nat': code: 4, msg: iptables v1.8.10 (nf_tables):  RULE_APPEND failed (No such file or directory): rule in chain NETAVARK-1D8721804F16F

原因の確認のため、

 
iptables -t nat -L -v

でchainが存在することを確認し、その上で改めてiptablesのコマンドで直接

iptables -t nat -A NETAVARK-1D8721804F16F -d 10.88.0.0/16 -j ACCEPT

を実行しましたが、全く同様のエラーが出たという状況です。

Alpine Linuxのバージョンを確認したところAlpine Linux v3.19.1へアップデートされていたのでそれがなにか関係しているのかと考えていますがもし何かご存知でしたら教えていただけますと幸いです。

よろしくお願いいたします。

コメント

at_dominique.m…

2024年3月11日 16時54分

imai98さん

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

> Error: netavark: unable to append rule '-d 10.88.0.0/16 -j ACCEPT' to table 'nat': code: 4, msg: iptables v1.8.10 (nf_tables):  RULE_APPEND failed (No such file or directory): rule in chain NETAVARK-1D8721804F16F

大変お手数をおかけしています。
alpine 3.19 アップストリームでは iptables コマンドを iptables-legacy の実装から iptables-nft という実装に切り替えましたので、おそらくその影響だと考えています。

お手数ですが、まずは一点を確認させてください。

おそらく自分のカーネルをビルドして使用していると思いますが、そのカーネルをビルドした時にオプションを変更しましたか? Armadillo IoT G4 向けの「x2_defconfig」では nft モードに必要な CONFIG_NFT_NAT 等の設定は最初から入ってますのでデフォルトのコンフィグどおりにモジュールもインストールされている場合にコマンドを問題なく利用できると思いますが、設定を無効にした場合には使用できなくなってしまいました。

以下のコマンドでは、モジュールがちゃんと有効になっている例です(バージョンによって2パターン):

armadillo:~# zcat /proc/config.gz | grep NFT_NAT
CONFIG_NFT_NAT=y
# =y か =m になっているはずです。=mの場合に以下のモジュールがインストールされているはずです:
armadillo:~# zcat /proc/config.gz | grep NFT_NAT
CONFIG_NFT_NAT=m
armadillo:~# modinfo nft_chain_nat
filename:       /lib/modules/5.10.205-0-at/kernel/net/netfilter/nft_chain_nat.ko
[...]

そのモジュールがない場合に上記のエラーが発生しますが、いかがでしょうか。

残念ですが、alpine では簡単に切り替える方法はありませんが、カーネルの変更が難しい場合は iptables-legacy パッケージをインストールして iptables と ip6tables のリンクを無理やりに変更すれば再び使用可能になると思います。
Armadillo Base OS を更新する度に再び行う必要がありますのであまりおすすめできませんが、どうしてもの場合は以下のコマンドを参考にしてください。

armadillo:~# persist_file -a add iptables-legacy
fetch https://download.atmark-techno.com/alpine/v3.19/atmark/aarch64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.19/main/aarch64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.19/community/aarch64/APKINDEX.tar.gz
(1/3) Installing libip4tc (1.8.10-r3)
(2/3) Installing libip6tc (1.8.10-r3)
(3/3) Installing iptables-legacy (1.8.10-r3)
Executing busybox-1.36.1-r15.trigger
OK: 222 MiB in 202 packages
Install succeeded, but might not work in the running system
Please reboot if installed program does not work
armadillo:~# ln -sf xtables-legacy-multi /sbin/iptables
armadillo:~# ln -sf xtables-legacy-multi /sbin/ip6tables
armadillo:~# persist_file -v /sbin/iptables /sbin/ip6tables
'/mnt/sbin/iptables' -> '/target/sbin/iptables'
'/mnt/sbin/ip6tables' -> '/target/sbin/ip6tables'

(戻りたい場合はリンクを xtables-nft-multi に戻してください)

よろしくお願いします

早急なご対応ありがとうございます。

> そのモジュールがない場合に上記のエラーが発生しますが、いかがでしょうか。
確認してみたところ、以下のようであり、

/etc/containers # zcat /proc/config.gz | grep NFT_NAT
CONFIG_NFT_NAT=m
/etc/containers # modinfo nft_chain_nat
modinfo: can't open '/lib/modules/5.10.185/modules.dep': No such file or directory

確かにモジュールが存在しないようでした。

> おそらく自分のカーネルをビルドして使用していると思いますが、そのカーネルをビルドした時にオプションを変更しましたか? Armadillo IoT G4 向けの「x2_defconfig」では nft モードに必要な CONFIG_NFT_NAT 等の設定は最初から入ってますのでデフォルトのコンフィグどおりにモジュールもインストールされている場合にコマンドを問題なく利用できると思いますが、設定を無効にした場合には使用できなくなってしまいました。
こちら確かに自身でビルドしたカーネルを利用しているのですが、カーネルのビルドオプションで私が変更した箇所は主にkprobeに関するところであったはずであり、NAT周りのオプションに変更を加えた記憶がないという次第です。x2_defconfigを確認したところ、確かにこちらでもCONFIG_NAT_NFT=mとなっていることを確認したのですが、モジュールがインストールされないのは私がどこに変更を加えてしまったからでしょうか。できれば、自分でカーネルをビルドしつつnftのiptableを利用したいと考えていますので教えていただけると幸いです。参考のため、x2_defconfigを添付させていただきます。

>
> 残念ですが、alpine では簡単に切り替える方法はありませんが、カーネルの変更が難しい場合は iptables-legacy パッケージをインストールして iptables と ip6tables のリンクを無理やりに変更すれば再び使用可能になると思います。
> Armadillo Base OS を更新する度に再び行う必要がありますのであまりおすすめできませんが、どうしてもの場合は以下のコマンドを参考にしてください。
>

> armadillo:~# persist_file -a add iptables-legacy
> fetch https://download.atmark-techno.com/alpine/v3.19/atmark/aarch64/APKINDEX.tar.gz
> fetch https://dl-cdn.alpinelinux.org/alpine/v3.19/main/aarch64/APKINDEX.tar.gz
> fetch https://dl-cdn.alpinelinux.org/alpine/v3.19/community/aarch64/APKINDEX.tar.gz
> (1/3) Installing libip4tc (1.8.10-r3)
> (2/3) Installing libip6tc (1.8.10-r3)
> (3/3) Installing iptables-legacy (1.8.10-r3)
> Executing busybox-1.36.1-r15.trigger
> OK: 222 MiB in 202 packages
> Install succeeded, but might not work in the running system
> Please reboot if installed program does not work
> armadillo:~# ln -sf xtables-legacy-multi /sbin/iptables
> armadillo:~# ln -sf xtables-legacy-multi /sbin/ip6tables
> armadillo:~# persist_file -v /sbin/iptables /sbin/ip6tables
> '/mnt/sbin/iptables' -> '/target/sbin/iptables'
> '/mnt/sbin/ip6tables' -> '/target/sbin/ip6tables'
> 

こちらの方法でのpodmanコンテナの起動を確認しました。ありがとうございます。

ファイル ファイルの説明
x2_defconfig.txt 拡張子に制限があるようでしたので.txtの拡張子にいたしました。

at_dominique.m…

2024年3月11日 18時11分

マルティネです。

> /etc/containers # zcat /proc/config.gz | grep NFT_NAT
> CONFIG_NFT_NAT=m
> /etc/containers # modinfo nft_chain_nat
> modinfo: can't open '/lib/modules/5.10.185/modules.dep': No such file or directory

> 確かにモジュールが存在しないようでした。

確認ありがとうございます。
defconfig に問題はないようですが、インストールした際に Image ファイルだけをコピーした形でインストールされてますね。

モジュールのインストール手順は初期のころにはっきりされてませんでしたが、よろしければ最新のマニュアルの「Linux カーネルをビルドする」からの「インストール」(6.) を参照ください:
https://manual.atmark-techno.com/armadillo-iot-g4/armadillo-iotg-g4_pro…

また、インストールの際にモジュールがコピーされてもアップデートで失った可能性もありますので、「grep /lib/modules /etc/swupdate_preserve_files」などで永続化の確認もお願いします(マニュアルの swupdate 方法で自動的に行われますが、この点も分かりにくいと思います)

> 参考のため、x2_defconfigを添付させていただきます。

ファイルありがとうございます。このままで問題ないと思います。

最新のバージョンと比べて見たところ、いくつかの USB デバイスが有効にされましたが、使用されてない分に影響ありません。
また、関心の nft のモジュールを細かい最適化のために最新のカーネルに有効にして、もう使われない legacy のモジュールをモジュールに戻しましたが、それも得に影響ありません(強いて言えば、legacyのモジュールが =y のままでは iptablesコマンドを手動に実行すると「Warning: iptables-legacy tables present, use iptables-legacy to see them」の警告が表示されますが、動作自体に影響ありません)

> kprobeに関するところであったはずであり

ちなみに kprobe関連のオプションだけでしたら、マニュアルに説明してないのでとても恥ずかしいですが「linux-at-x2-debug」のパッケージを使用できます。
デフォルトの状態に比べたら以下の設定が有効になっています:

CONFIG_AUDIT=y
CONFIG_BLK_DEBUG_FS=y
CONFIG_BPF_SYSCALL=y
CONFIG_CGROUP_PERF=y
CONFIG_DEBUG_FS=y
CONFIG_DEBUG_INFO=y
CONFIG_DEBUG_INFO_BTF=y
CONFIG_DYNAMIC_DEBUG=y
CONFIG_DYNAMIC_FTRACE=y
CONFIG_FTRACE=y
CONFIG_FTRACE_SYSCALLS=y
CONFIG_FUNCTION_TRACER=y
CONFIG_HIST_TRIGGERS=y
CONFIG_IKHEADERS=m
CONFIG_KPROBES=y
CONFIG_KRETPROBES=y
CONFIG_PERF_EVENTS=y
CONFIG_SOFTLOCKUP_DETECTOR=y
CONFIG_TRACEPOINTS=y
CONFIG_TRACING=y
CONFIG_UPROBES=y
CONFIG_WQ_WATCHDOG=y

使用方法としては以下のとおりです(実行中に再起動すると起動できなくなる恐れもありますので、運用に向いてない方法です):

persist_file -rd /lib/modules
persist_file -a add linux-at-x2-debug

このパッケージでも swupdate_preserve_files にカーネルの保存が設定されたら更新でも残ります( https://manual.atmark-techno.com/armadillo-iot-g4/armadillo-iotg-g4_pro… )

こちらに関しては私の余計なお世話なだけですので、無視して構いません!(こちらでも kprobe をよく使ってますので…)

よろしくお願いします