Regra Iptables LOG dentro de um namespace de rede

9

Estou tentando configurar as regras do iptables para um contêiner de docker. Estou usando o nsenter para executar o comando iptables dentro do namespace de rede do contêiner:

# 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

Essa abordagem funciona perfeitamente, exceto pelas LOGregras. Aqueles não parecem registrar em qualquer lugar. Observe que a mesma regra aplicada ao sistema host funciona e faz logon no /var/log/kern.log.

Onde posso encontrar a saída dessas regras de log? Esse é um problema / limitação conhecido dos namespaces de rede?

Fabian Jakobs
fonte
Update: Eu tentei NFLOGvez, mas ainda não vai funcionar
Fabian Jakobs
Eu fiz um teste usando um contêiner de docker baseado no centos 7 e funciona, o host é um centos, o mesmo teste com o host ubuntu Ubuntu 15.04 e o ubuntu 12.04.5 container não funciona, de qualquer forma, é preciso ter certeza, o syslog está sendo executado em seu host.
C4f4t0r
Estou usando o Debian wheezy como host e o Ubuntu 14.04 em um contêiner. Lá não funciona. Eu estou querendo saber o que é diferente lá.
Fabian Jakobs #
Você encontrou uma solução para isso?
gucki
@ Gucki Não encontrei uma solução para fazê-lo funcionar dentro do espaço para nome. Mudei as regras de log para fora do contêiner.
Fabian Jakobs #

Respostas:

8

Como Donald mencionou, as regras LOG do iptables dentro dos contêineres são suprimidas por padrão.

Nos kernels <= 4.10, esse comportamento não pode ser ajustado sem o patch do kernel. Como mencionado anteriormente, uma solução alternativa é executar o ulogd em cada contêiner e usar as regras iptables NFLOG (ou ULOG) em vez das regras LOG.

No entanto, a partir do kernel 4.11, a execução echo 1 > /proc/sys/net/netfilter/nf_log_all_netnsno host (fora do contêiner) fará com que as regras LOG do iptables dentro de todos os contêineres sejam registradas no host. (Veja este Kernel Commit.)

Paul Donohue
fonte
1

Consegui registrar as regras do iptables para contêineres do docker instalando o ulogd e substituindo "-j LOG" por "-j ULOG". Pacotes correspondentes são registrados no diretório / var / log / ulog

agrrd
fonte
Você instalou o ulogd no host (não fornece saída da regra) ou dentro do contêiner (que não inicia)?
Phillipp 13/11
0

Eu vi um exemplo (não relacionado ao kernel) de uso -v /dev/log:/dev/log. Gostaria de saber se você precisa fazer algo semelhante ..

Além disso, vejo que você está usando o nsenter e não docker exec: qual versão do docker você está executando?

Cameron Kerr
fonte
Também não está funcionando quando não está usando o docker, mas os netns manualmente a partir da linha de comando.
gucki
Você precisará de / proc / kmsg ou / dev / kmsg e o docker efetivamente impede que você o monte no contêiner.
Phillipp