web-dev-qa-db-ja.com

ネットワーク名前空間内のiptables LOGルール

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

これらのログルールの出力はどこにありますか?これはネットワーク名前空間の既知の問題/制限ですか?

9
Fabian Jakobs

ドナルドが述べたように、コンテナー内のiptables LOGルールはデフォルトで抑制されます。

カーネル<= 4.10では、カーネルにパッチを適用しないと、この動作を調整できませんでした。 agrrdが述べたように、回避策は各コンテナーでulogdを実行し、LOGルールの代わりにiptables NFLOG(またはULOG)ルールを使用することです。

ただし、カーネル4.11以降では、echo 1 > /proc/sys/net/netfilter/nf_log_all_netns(コンテナー外の)ホストで、すべてのコンテナー内のiptables LOGルールがホストにログを記録します。 (このカーネルコミットを参照してください。)

8
Paul Donohue

ネットワークネームスペース内からのiptables LOGターゲットの出力は、コンテナーがログバッファーをオーバーランしてホストをDOSで実行できないようにするための設計により抑制されています。

変更の導入をコミット

現在のカーネルの関連するソースコード行

3
Donald

Ulogdをインストールして「-j LOG」を「-j ULOG」に置き換えることで、Dockerコンテナーのiptablesルールをログに記録できました。一致したパケットは/ var/log/ulogディレクトリに記録されます

1
agrrd

-v /dev/log:/dev/logの使用例(カーネル関連ではない)を見てきました。同様のことをする必要があるのか​​しら。

また、docker execではなくnsenterを使用しているようです。どのバージョンのdockerを実行していますか?

0
Cameron Kerr