Dokcer上でiptablesの設定を変更しようと思ったらいろいろとハマったのでメモを残しておきます。そもそも、Docker上でiptablesを変更するってどうなのよ?という話は置いておいてください(笑)
環境準備
今回の環境は、CentOSのDockerイメージを使うことにします。余談ですが、iptables
コマンドってデフォルトではインストールされてないんですね。
iptables
が使えない!?
rootユーザで実行しているのにPermission denied
が出たのでどうしたものかと。もしかしてDocker上でiptablesは使えないのか、、、と思って調査することに。
iptables
を使うには、docker run
時にオプション指定が必要
docker run
するときに--cap-add=NET_ADMIN
オプションをつけると、Docker上でiptablesの設定が行えるようです。このオプションは、ネットワークに関して特権モードでコンテナを起動するためのものです。特権モードじゃないとダメということは、そもそもコンテナの考え方として、人がネットワークの情報(ルーティングなど)を書き換えるのを推奨していないんでしょうね。
ちなみに、--privileged
オプションをつけて起動してもiptables
コマンドは使えます。ただ、--privileged
はネットワークを含むすべての操作において特権モードにするものなので、権限が過剰になりがちです。必要最小限の権限を付ける意味でも、--cap-add=NET_ADMIN
をつける方がよさそうです。
iptables
コマンド、使えるようになりましたね。
まとめ
Docker上でiptablesの設定を変更する場合は、docker run --cap-add=NET_ADMIN
でコンテナを起動しましょう。