Règle Iptables LOG dans un espace de noms réseau

9

J'essaie de configurer des règles iptables pour un conteneur Docker. J'utilise nsenter pour exécuter la commande iptables à l'intérieur de l'espace de noms réseau du conteneur:

# 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

Cette approche fonctionne parfaitement, sauf pour les LOGrègles. Ceux-ci ne semblent se connecter nulle part. Notez que la même règle appliquée au système hôte fonctionne et se connecte à /var/log/kern.log.

Où puis-je trouver la sortie de ces règles de journal? S'agit-il d'un problème / limitation connu des espaces de noms réseau?

Fabian Jakobs
la source
Mise à jour: j'ai essayé à la NFLOGplace mais cela ne fonctionnera toujours pas
Fabian Jakobs
J'ai fait un test en utilisant un conteneur docker basé sur centos 7 et cela fonctionne, l'hôte est un centos, le même test avec l'hôte ubuntu Ubuntu 15.04 et le conteneur ubuntu 12.04.5 ne fonctionne pas, de toute façon vous devez être sûr, le syslog s'exécute sur votre hôte.
c4f4t0r
J'utilise Debian Wheezy comme hôte et Ubuntu 14.04 dans un conteneur. Là ça ne marche pas. Je me demande ce qui est différent là-bas.
Fabian Jakobs
Avez-vous trouvé une solution à cela?
gucki
@gucki Je n'ai pas trouvé de solution pour le faire fonctionner à l'intérieur de l'espace de noms. J'ai déplacé les règles de journalisation en dehors du conteneur.
Fabian Jakobs

Réponses:

8

Comme Donald l'a mentionné, les règles LOG iptables à l'intérieur des conteneurs sont supprimées par défaut.

Dans les noyaux <= 4.10, ce comportement ne pouvait pas être ajusté sans patcher le noyau. Comme mentionné précédemment, une solution de contournement consiste à exécuter ulogd dans chaque conteneur et à utiliser des règles iptables NFLOG (ou ULOG) au lieu des règles LOG.

Cependant, à partir du noyau 4.11, l'exécution echo 1 > /proc/sys/net/netfilter/nf_log_all_netnssur l'hôte (en dehors du conteneur) entraînera la journalisation des règles iptables LOG à l'intérieur de tous les conteneurs sur l'hôte. (Voir ce Kernel Commit.)

Paul Donohue
la source
1

J'ai pu enregistrer les règles iptables pour les conteneurs Docker en installant ulogd et en remplaçant "-j LOG" par "-j ULOG". Les paquets correspondants sont enregistrés dans le répertoire / var / log / ulog

agrrd
la source
Avez-vous installé ulogd sur l'hôte (ne donne aucune sortie de la règle) ou à l'intérieur du conteneur (qui ne démarre pas)?
Phillipp
0

J'ai vu un exemple d'utilisation (non lié au noyau) -v /dev/log:/dev/log. Je me demande si vous devez faire quelque chose de similaire ..

De plus, je constate que vous utilisez nsenter plutôt que docker exec: quelle version de docker utilisez-vous?

Cameron Kerr
la source
Cela ne fonctionne pas non plus lorsque vous n'utilisez pas du tout docker, mais les réseaux manuellement depuis la ligne de commande.
gucki
Vous auriez besoin de / proc / kmsg ou / dev / kmsg et docker vous empêche efficacement de monter cela dans le conteneur.
Phillipp