コンテナで vpnc のルートフラッシュ警告が出る理由
ルートキャッシュのフラッシュは、そのキャッシュをもはや保持しないカーネルの名残です。読み取り専用エラーはコンテナのマウントに由来し、トンネルのせいではありません。
新しいコンテナのログは、/proc/sys/net/ipv4/route/flush に関する Read-only file system という苦情で終わることが多く、その行が、実際には完全に健全なこともあるトンネルのせいにされます。その背後にある書き込みは、IPv4 ルートキャッシュが消えた今では何の役にも立たないカーネルのエントリを対象にしています。コンテナ内では /proc/sys が読み取り専用でマウントされるため、値が入る前にリダイレクトが拒否され、シェルがその拒否を出力します。動作中のトンネルでも、古い行がスクリプトに残っている限りこの警告を出し続けることがあり、--privileged は書き込みを決して意味のあるものにしません。
スクリプトがフラッシュしようとしていたもの
古い接続スクリプトはキャッシュの掃除で終わっていました。カーネルの制御ファイルに値を書き込み、IPv4 スタックにルーティングキャッシュを捨てるよう求めることで、古いエントリが期限切れになるのを待たずに新しいトンネルルートが選ばれるようにしていました。ファイルは /proc/sys/net/ipv4/ の下で指定されていたため、この処理はルーティングコマンドではなくシェルのリダイレクトになっていました。カーネル 3.6 がそのキャッシュを削除し、フラッシュが存在した理由も一緒に消えました。現在のデータ経路でその書き込みに依存しているものはありません。
エントリ自体はレガシーの書き込み専用ファイルとして残ったため、まだそこへ書き込むスクリプトは実在するパスと実際の権限チェックに到達します。ホストでは書き込みは成功を返し、何も変わりません。コンテナでは同じリダイレクトが読み取り専用の /proc/sys に当たり、EROFS で失敗します。シェルはこれを読み取り専用ファイルシステムのメッセージとして出力します。パスが本当に存在しないカーネルでは文言が No such file or directory になり、結論は変わりません。
二つのエラーは別のことを言っており、その違いは明確に保つ価値があります。Read-only file system はカーネルがエントリに到達して書き込みを拒否したことを意味し、No such file or directory はエントリが消えたことを意味します。どちらのメッセージもトンネルデバイス、ルート、名前解決について報告しないため、どちらもより多くの権限を正当化できません。
メッセージを原因のように見せるのは順序です。接続スクリプトは最後の掃除に到達する前にルートを設定し、インターフェースの状態を変え、名前解決を書き換えるため、最後に出力された行が引用される行になります。重要な手順がすべて成功を返していても同じです。この警告を出しながら確立して通信を運ぶトンネルは、上の仕組みに正確に当てはまります。
権限を追加する前にマウントとルートを確認する
三つの確認が、見た目だけの警告と実際の障害を分けます。導入されたスクリプトにまだその行があるか、/proc/sys がどうマウントされているか、そして アプリケーションの通信が実際にどこへ行くか です。警告が出たのと同じコンテナ名前空間かホストで実行してください。無関係なマシンでの確認は別の問いに答えることになります。
grep -n 'ipv4/route/flush' /usr/share/vpnc-scripts/vpnc-script
findmnt -no OPTIONS /proc/sys
ip -4 route get 10.20.5.10grep の答えは見た目より弱いものです。ヒットはその行が存在することを示すだけで、保護なしで実行されることは示しません。保守されたスクリプトでは、その行を飛ばすガードの中に書き込みが入っていることがあります。findmnt -no OPTIONS /proc/sys はマウントを直接確定し、その出力の ro は、その地点より下のすべての書き込みがスクリプトの動作にかかわらず拒否されることを意味します。続いてルート検索が、アプリケーションに必要な宛先がトンネルインターフェース経由で解決されるのか、コンテナのデフォルトゲートウェイ経由で解決されるのかを示します。デフォルトゲートウェイを選ぶ検索は、トンネルは上がったが何もそこへルーティングされていないことを意味し、これは権限の問題ではなくルーティングの問題です。
修正は実際どこから届くのか
保守された修正はコンテナのフラグではなくスクリプトにあります。upstream vpnc-script はこの処理の扱いを変えているので、イメージ内のコピーを現在の upstream と比較し、それを提供するパッケージやイメージビルドを通じて更新してください。実行中のコンテナ内で手で編集したファイルはレビューできず、次のビルドでは残りません。
--privileged はすべてのケーパビリティと広範なデバイスアクセスを与えるものとして文書化されており、何も変えないメッセージに対して大きな譲歩です。本当に不足しているケーパビリティがあるなら、そちらを名指ししてください。更新後はルート検索を繰り返し、アプリケーションにトンネルを使わせてください。静かなログと機能する接続は別の結果です。