Iptables LOG-Regel in einem Netzwerk-Namespace

9

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 LOGRegeln 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?

Fabian Jakobs
quelle
Update: Ich habe es NFLOGstattdessen versucht, aber es wird immer noch nicht funktionieren
Fabian Jakobs
Ich habe einen Test mit einem Docker-Container durchgeführt, der auf Centos 7 basiert, und es funktioniert. Der Host ist ein Centos. Der gleiche Test mit Ubuntu Ubuntu 15.04 Host und Ubuntu 12.04.5 Container funktioniert nicht. Sie müssen jedoch sicher sein, dass das Syslog läuft in Ihrem Host.
c4f4t0r
Ich benutze Debian Wheezy als Host und Ubuntu 14.04 in einem Container. Dort funktioniert es nicht. Ich frage mich, was dort anders ist.
Fabian Jakobs
Haben Sie eine Lösung dafür gefunden?
Gucki
@gucki Ich habe keine Lösung gefunden, um es im Namespace zum Laufen zu bringen. Ich habe die Protokollierungsregeln aus dem Container verschoben.
Fabian Jakobs

Antworten:

8

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_netnsauf dem Host (außerhalb des Containers) jedoch dazu, dass iptables-LOG-Regeln in allen Containern beim Host protokolliert werden. (Siehe dieses Kernel-Commit.)

Paul Donohue
quelle
1

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

agrrd
quelle
Haben Sie ulogd auf dem Host installiert (gibt keine Ausgabe der Regel aus) oder im Container (der nicht startet)?
Phillipp
0

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?

Cameron Kerr
quelle
Es funktioniert auch nicht, wenn Docker überhaupt nicht verwendet wird, sondern manuell über die Befehlszeile.
Gucki
Sie würden / proc / kmsg oder / dev / kmsg benötigen und Docker verhindert effektiv, dass Sie dies in den Container einbinden.
Phillipp