Docker

Docker上でiptablesをいじろうとしたらハマった

Dokcer上でiptablesの設定を変更しようと思ったらいろいろとハマったのでメモを残しておきます。そもそも、Docker上でiptablesを変更するってどうなのよ?という話は置いておいてください(笑)

環境準備

# CentOSのイメージからコンテナを起動する
$ docker run -it centos /bin/bash
# iptablesをインストールする
[root]# yum install -y iptables

今回の環境は、CentOSのDockerイメージを使うことにします。余談ですが、iptablesコマンドってデフォルトではインストールされてないんですね。

iptablesが使えない!?

[root]# iptables -L
iptables v1.4.21: can't initialize iptables table `filter': Permission denied (you must be root)
Perhaps iptables or your kernel needs to be upgraded.

rootユーザで実行しているのにPermission deniedが出たのでどうしたものかと。もしかしてDocker上でiptablesは使えないのか、、、と思って調査することに。

iptablesを使うには、docker run時にオプション指定が必要

$ docker run -it --cap-add=NET_ADMIN centos /bin/bash

docker runするときに--cap-add=NET_ADMINオプションをつけると、Docker上でiptablesの設定が行えるようです。このオプションは、ネットワークに関して特権モードでコンテナを起動するためのものです。特権モードじゃないとダメということは、そもそもコンテナの考え方として、人がネットワークの情報(ルーティングなど)を書き換えるのを推奨していないんでしょうね。

ちなみに、--privilegedオプションをつけて起動してもiptablesコマンドは使えます。ただ、--privilegedはネットワークを含むすべての操作において特権モードにするものなので、権限が過剰になりがちです。必要最小限の権限を付ける意味でも、--cap-add=NET_ADMINをつける方がよさそうです。

[root]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination

iptablesコマンド、使えるようになりましたね。

まとめ

Docker上でiptablesの設定を変更する場合は、docker run --cap-add=NET_ADMINでコンテナを起動しましょう。

参考リンク

-Docker

S