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でコンテナを起動しましょう。