네트워크 네임 스페이스 내부의 iptables LOG 규칙


9

도커 컨테이너에 iptables 규칙을 설정하려고합니다. 컨테이너의 네트워크 네임 스페이스 내에서 iptables 명령을 실행하기 위해 nsenter 를 사용 하고 있습니다.

# 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.

해당 로그 규칙의 출력을 어디에서 찾을 수 있습니까? 네트워크 네임 스페이스의 알려진 문제 / 제한입니까?


업데이트 : NFLOG대신 시도 했지만 여전히 작동하지 않습니다.
— Fabian Jakobs

centos 7을 기반으로 한 도커 컨테이너를 사용하여 테스트를 수행했으며 작동합니다. 호스트는 centos입니다. 우분투 우분투 15.04 호스트 및 우분투 12.04.5 컨테이너와 동일한 테스트가 작동하지 않습니다. 어쨌든 syslog 호스트에서 실행 중입니다.
— c4f4t0r

컨테이너로 데비안 wheezy를 호스트로 사용하고 우분투 14.04를 사용하고 있습니다. 작동하지 않습니다. 나는 무엇이 다른지 궁금합니다.
— Fabian Jakobs 님이

이것에 대한 해결책을 찾았습니까?
— gucki

@gucki 네임 스페이스 내에서 작동하게하는 솔루션을 찾지 못했습니다. 로깅 규칙을 컨테이너 외부로 옮겼습니다.
— Fabian Jakobs

답변:


8

Donald가 언급했듯이 컨테이너 내부의 iptables LOG 규칙은 기본적으로 억제됩니다.

커널 <= 4.10에서는 커널을 패치하지 않으면이 동작을 조정할 수 없습니다. agrrd가 언급했듯이 해결 방법은 각 컨테이너에서 ulogd를 실행하고 LOG 규칙 대신 iptables NFLOG (또는 ULOG) 규칙을 사용하는 것입니다.

그러나 커널 4.11 echo 1 > /proc/sys/net/netfilter/nf_log_all_netns부터는 컨테이너 외부에서 호스트를 실행 하면 모든 컨테이너 내부의 iptables LOG 규칙이 호스트에 기록됩니다. (이 커널 커밋을 참조하십시오.)



1

ulogd를 설치하고 "-j LOG"를 "-j ULOG"로 바꾸어 docker 컨테이너에 대한 iptables 규칙을 기록 할 수있었습니다. 일치하는 패킷은 / var / log / ulog 디렉토리에 기록됩니다


컨테이너 내부의 호스트에 ulogd를 설치 했습니까 (규칙에서 출력되지 않음) 시작하지 않습니까?
— Phillipp

0

을 사용하는 예제 (커널 관련이 아님)를 보았습니다 -v /dev/log:/dev/log. 비슷한 일을해야하는지 궁금합니다 ..

또한, 나는 당신이 아닌 nsenter를 사용하고 있음을 알고 있습니다 docker exec: 어떤 버전의 docker를 실행하고 있습니까?


도커를 전혀 사용하지 않을 때도 작동하지 않지만 명령 줄에서 수동으로 netns를 사용하십시오.
— gucki

/ proc / kmsg 또는 / dev / kmsg를 사용하면 docker가 컨테이너에 컨테이너를 마운트하지 못하게 효과적으로 방지합니다.
— Phillipp
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.