Ich versuche, iptables-Regeln für einen Docker-Container einzurichten. Ich verwende nsenter , um den Befehl iptables im Netzwerk-Namespace des Containers auszuführen:
# 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
Dieser Ansatz funktioniert bis auf LOG
Regeln einwandfrei . Diese scheinen sich nirgendwo anzumelden. Beachten Sie, dass dieselbe Regel, die auf das Hostsystem angewendet wird, funktioniert und sich bei anmeldet /var/log/kern.log
.
Wo finde ich die Ausgabe dieser Protokollregeln? Ist dies ein bekanntes Problem / eine Einschränkung von Netzwerk-Namespaces?
networking
iptables
docker
containers
Fabian Jakobs
quelle
quelle
NFLOG
stattdessen versucht, aber es wird immer noch nicht funktionierenAntworten:
Wie Donald erwähnt hat, werden iptables LOG-Regeln in Containern standardmäßig unterdrückt.
In Kerneln <= 4.10 konnte dieses Verhalten nicht angepasst werden, ohne den Kernel zu patchen. Wie bereits erwähnt, besteht eine Problemumgehung darin, ulogd in jedem Container auszuführen und iptables NFLOG- (oder ULOG-) Regeln anstelle von LOG-Regeln zu verwenden.
Ab Kernel 4.11 führt die Ausführung
echo 1 > /proc/sys/net/netfilter/nf_log_all_netns
auf dem Host (außerhalb des Containers) jedoch dazu, dass iptables-LOG-Regeln in allen Containern beim Host protokolliert werden. (Siehe dieses Kernel-Commit.)quelle
Die Ausgabe von iptables-LOG-Zielen aus einem Netzwerk-Namespace wird vom Design her unterdrückt, um zu verhindern, dass Container ihren Host durch Überlaufen ihrer Protokollpuffer DOS-fähig machen.
verpflichten sich, die Änderung einzuführen
relevante Quellcodezeile im aktuellen Kernel
quelle
Ich konnte iptables-Regeln für Docker-Container protokollieren, indem ich ulogd installierte und "-j LOG" durch "-j ULOG" ersetzte. Übereinstimmende Pakete werden im Verzeichnis / var / log / ulog protokolliert
quelle
Ich habe ein Beispiel (nicht kernelbezogen) für die Verwendung gesehen
-v /dev/log:/dev/log
. Ich frage mich, ob Sie etwas Ähnliches tun müssen.Außerdem sehe ich, dass Sie nsenter verwenden und nicht
docker exec
: Welche Docker-Version verwenden Sie?quelle