nftables環境でのDocker統合テストを修正
Kamalの統合テスト環境において、nftablesを使用するホスト上でDockerコンテナ内からのnetfilterルール作成が失敗する問題が解決されました。
背景
現代のLinuxディストリビューションでは、従来のiptablesに代わってnftablesがデフォルトのファイアウォールバックエンドとして採用されています。しかし、nftables環境下では、Dockerコンテナ内からnetfilterルールを作成できないという制約があります。
この制約により、Kamalの統合テストで使用されるテストコンテナ内でdockerdの起動が失敗していました:
iptables v1.8.11 (nf_tables): CHAIN_ADD failed (No such file or directory)
技術的な変更
#1762では、テストコンテナの起動スクリプトにiptables-legacyへの切り替え処理を追加しています。
変更箇所:
# On hosts using nftables, Docker can't create netfilter rules from inside a container.
# iptables-legacy uses an older kernel interface that doesn't have this limitation.
update-alternatives --set iptables /usr/sbin/iptables-legacy 2>/dev/null || true
update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy 2>/dev/null || true
dockerd --max-concurrent-downloads 1 &
同様の変更がtest/integration/docker/vm/boot.shにも適用されています。
update-alternativesコマンドを使用して、システムのiptables実装をlegacy版に切り替えることで、iptables-legacyが使用する古いカーネルインターフェース(xtables)経由でのnetfilterルール操作を可能にしています。
設計判断
この修正では、エラーが発生しても処理を続行できるよう|| trueを付加しています。これにより、iptables-legacyが利用できない環境でもスクリプトが中断されることを防いでいます。
また、IPv4(iptables)とIPv6(ip6tables)の両方を切り替えることで、完全な互換性を確保しています。
nftablesとiptables-legacyの共存は、コンテナ化されたテスト環境における実用的な解決策です。本番環境ではホストのnftables設定がそのまま使用されるため、この変更はテストインフラストラクチャにのみ影響します。