Dockerコンテナーのiptablesルールをセットアップしようとしています。 nsenter を使用して、コンテナーのネットワーク名前空間内でiptablesコマンドを実行しています:
# log access to port 8080
PID=$(docker inspect --format "{{.State.Pid}}" $ID)
/home/ubuntu/nsenter -n -t $PID iptables -A OUTPUT -o eth0 -p tcp -m tcp --dport 8080 -j LOG
このアプローチは、LOG
ルールを除いて完全に機能します。それらはどこにも記録しないようです。ホストシステムに適用された同じルールが機能し、/var/log/kern.log
。
これらのログルールの出力はどこにありますか?これはネットワーク名前空間の既知の問題/制限ですか?
ドナルドが述べたように、コンテナー内のiptables LOGルールはデフォルトで抑制されます。
カーネル<= 4.10では、カーネルにパッチを適用しないと、この動作を調整できませんでした。 agrrdが述べたように、回避策は各コンテナーでulogdを実行し、LOGルールの代わりにiptables NFLOG(またはULOG)ルールを使用することです。
ただし、カーネル4.11以降では、echo 1 > /proc/sys/net/netfilter/nf_log_all_netns
(コンテナー外の)ホストで、すべてのコンテナー内のiptables LOGルールがホストにログを記録します。 (このカーネルコミットを参照してください。)
ネットワークネームスペース内からのiptables LOGターゲットの出力は、コンテナーがログバッファーをオーバーランしてホストをDOSで実行できないようにするための設計により抑制されています。
Ulogdをインストールして「-j LOG」を「-j ULOG」に置き換えることで、Dockerコンテナーのiptablesルールをログに記録できました。一致したパケットは/ var/log/ulogディレクトリに記録されます
-v /dev/log:/dev/log
の使用例(カーネル関連ではない)を見てきました。同様のことをする必要があるのかしら。
また、docker exec
ではなくnsenterを使用しているようです。どのバージョンのdockerを実行していますか?