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

도커 컨테이너에 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.

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



답변

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 규칙이 호스트에 기록됩니다. (이 커널 커밋을 참조하십시오.)


답변

컨테이너가 로그 버퍼를 오버런하여 호스트를 DOS하는 것을 방지하기 위해 네트워크 네임 스페이스 내부에서 iptables LOG 대상의 출력이 억제됩니다.

변화를 소개하다

현재 커널의 관련 소스 코드 라인


답변

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


답변

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

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