nftables 활동을 올바르게 기록하고 보는 방법은 무엇입니까?

nftables 활동을 올바르게 기록하고 보는 방법은 무엇입니까?

Debian 10 Buster에서 Docker 컨테이너가 Docker 호스트 또는 Docker 브리지 인터페이스에 대해 ping을 수행할 수 없지만 인터넷에 액세스할 수 있는 문제에 직면했습니다.
액세스를 허용해도(여기 관련 질문에 표시됨) 내 상황이 해결되지 않습니다. iptables/nftables와 관련된 것 같습니다. 처음에 오류를 기록하는 방법을 알아낼 수 있다면 무엇을 해야 할지 알 수 있을 것입니다.

DOCKER-USER두 가지 모두에 로그 규칙을 입력했지만 INPUTnft insert rule ip filter DOCKER-USER counter log다 기록된 패킷이 0으로 표시됩니다.

/var/log/kern.log방화벽 관련 정보를 표시하지 않습니다 journalctl -k.

이 시스템을 사용하여 방화벽 활동을 보는 새로운 방법은 어떻습니까 nftables?

nft list ip table filter

table ip filter {
    chain INPUT {
        type filter hook input priority 0; policy drop;
        ct state invalid counter packets 80 bytes 3200 drop
        iifname "vif*" meta l4proto udp udp dport 68 counter packets 0 bytes 0 drop
        ct state related,established counter packets 9479197 bytes 17035404271 accept
        iifname "vif*" meta l4proto icmp counter packets 0 bytes 0 accept
        iifname "lo" counter packets 9167 bytes 477120 accept
        iifname "vif*" counter packets 0 bytes 0 reject with icmp type host-prohibited
        counter packets 28575 bytes 1717278 drop
        counter packets 0 bytes 0 log
        counter packets 0 bytes 0 log
        iifname "docker0" counter packets 0 bytes 0 accept
    }

    chain FORWARD {
        type filter hook forward priority 0; policy drop;
        counter packets 880249 bytes 851779418 jump DOCKER-ISOLATION-STAGE-1
        oifname "br-cc7b89b40bee" ct state related,established counter packets 7586 bytes 14719677 accept
        oifname "br-cc7b89b40bee" counter packets 0 bytes 0 jump DOCKER
        iifname "br-cc7b89b40bee" oifname != "br-cc7b89b40bee" counter packets 5312 bytes 2458488 accept
        iifname "br-cc7b89b40bee" oifname "br-cc7b89b40bee" counter packets 0 bytes 0 accept
        oifname "br-d41d1510d330" ct state related,established counter packets 8330 bytes 7303256 accept
        oifname "br-d41d1510d330" counter packets 0 bytes 0 jump DOCKER
        iifname "br-d41d1510d330" oifname != "br-d41d1510d330" counter packets 7750 bytes 7569465 accept
        iifname "br-d41d1510d330" oifname "br-d41d1510d330" counter packets 0 bytes 0 accept
        oifname "br-79fccb9a0478" ct state related,established counter packets 11828 bytes 474832 accept
        oifname "br-79fccb9a0478" counter packets 11796 bytes 707760 jump DOCKER
        iifname "br-79fccb9a0478" oifname != "br-79fccb9a0478" counter packets 7 bytes 526 accept
        iifname "br-79fccb9a0478" oifname "br-79fccb9a0478" counter packets 11796 bytes 707760 accept
        counter packets 1756295 bytes 1727495359 jump DOCKER-USER
        oifname "docker0" ct state related,established counter packets 1010328 bytes 1597833795 accept
        oifname "docker0" counter packets 0 bytes 0 jump DOCKER
        iifname "docker0" oifname != "docker0" counter packets 284235 bytes 16037499 accept
        iifname "docker0" oifname "docker0" counter packets 0 bytes 0 accept
        ct state invalid counter packets 0 bytes 0 drop
        ct state related,established counter packets 0 bytes 0 accept
        counter packets 0 bytes 0 jump QBS-FORWARD
        iifname "vif*" oifname "vif*" counter packets 0 bytes 0 drop
        iifname "vif*" counter packets 0 bytes 0 accept
        counter packets 0 bytes 0 drop
    }

    chain OUTPUT {
        type filter hook output priority 0; policy accept;
    }

    chain QBS-FORWARD {
    }

    chain DOCKER {
    }

    chain DOCKER-ISOLATION-STAGE-1 {
        iifname "br-cc7b89b40bee" oifname != "br-cc7b89b40bee" counter packets 5312 bytes 2458488 jump DOCKER-ISOLATION-STAGE-2
        iifname "br-d41d1510d330" oifname != "br-d41d1510d330" counter packets 7750 bytes 7569465 jump DOCKER-ISOLATION-STAGE-2
        iifname "br-79fccb9a0478" oifname != "br-79fccb9a0478" counter packets 7 bytes 526 jump DOCKER-ISOLATION-STAGE-2
        iifname "docker0" oifname != "docker0" counter packets 590138 bytes 34612496 jump DOCKER-ISOLATION-STAGE-2
        counter packets 1808904 bytes 1760729363 return
    }

    chain DOCKER-ISOLATION-STAGE-2 {
        oifname "br-cc7b89b40bee" counter packets 0 bytes 0 drop
        oifname "br-d41d1510d330" counter packets 0 bytes 0 drop
        oifname "br-79fccb9a0478" counter packets 0 bytes 0 drop
        oifname "docker0" counter packets 0 bytes 0 drop
        counter packets 644929 bytes 74784737 return
    }

    chain DOCKER-USER {
        counter packets 0 bytes 0 log
        iifname "docker0" counter packets 305903 bytes 18574997 accept
        counter packets 1450392 bytes 1708920362 return
    }
}

답변1

당신은 그것을 사용할 수 있습니다nftrace패킷 흐름을 추적합니다. 매우 장황하지만 커널 로그에는 들어가지 않고 멀티캐스트 넷링크 소켓을 통해 배포됩니다(즉, 아무것도 수신하지 않는 경우 추적은 "/dev/null"로만 들어갑니다).

정말로 모든 것을 추적하고 싶다면 추적하세요.사전 라우팅그리고산출우선순위가 낮습니다. nft list ip table filter실제로 표시되는 내용은 별도의 표를 사용하는 것이 좋습니다.nftables의 iptables조작해서는 안 되는 xt 매칭 레이어 API와의 호환성(그러나 추적과 함께 사용하는 것은 안전함) 또한 iptables에는 다음과 같은 다른 테이블이 있을 수도 있다는 점을 알아야 합니다.테이블.

traceall.nft따라서 로드된 파일의 규칙 세트를 사용하면 다음과 같습니다 nft -f traceall.nft.

table ip traceall
delete table ip traceall

table ip traceall {
    chain prerouting {
        type filter hook prerouting priority -350; policy accept;
        meta nftrace set 1
    }

    chain output {
        type filter hook output priority -350; policy accept;
        meta nftrace set 1
    }
}

이제 다음 명령을 사용하여 매우 상세한 IPv4 추적을 추적할 수 있습니다.

nft monitor trace

컨테이너 내부에서 수행하는 경우에도 동일한 작업을 수행합니다(일반적으로 로그 대상의 경우는 아님).

이러한 추적을 다른 곳에서 활성화하거나 활성화하기 전에 우선 순위가 낮은 규칙에 조건을 넣어 모든 후크/체인 추적을 방지할 수 있습니다. 이 다이어그램을 따르면 이벤트 순서를 이해하는 데 도움이 됩니다.일반 네트워크의 Netfilter 및 패킷 흐름.

동등한 것을 사용하기로 선택한 경우-j TRACE목표는iptables, 그 분에게도 상담해 주세요xtables-monitor, 왜냐하면nftables의 iptables행동을 바꾸십시오 (비교iptables-이전 버전).


OP의 질문에 대답하면서 질문과 로그 문제에 대한 몇 가지 대략적인 추측은 다음과 같습니다.

  • Docker 자체가 컨테이너에서 실행 중인 경우 로그를 사용하지 못할 수 있습니다. 호스트에게 제공될 수 있으며,그리고 모든 컨테이너sysctl -w net.netfilter.nf_log_all_netns=1커널 메시지 에는 네임스페이스 인스턴스가 없으므로 커널 메시지 쿼리가 허용됩니다 .

  • 카운터는통나무규칙IP 필터 입력는 0인 반면 이전 규칙의 카운터는줄이다진술은 그렇지 않습니다. 이는 로깅 규칙이 너무 늦게 만들어졌음을 의미합니다.줄이다. 이것통나무규칙(또는 오히려iptables) -j LOG을 삽입해야 함앞으로결승줄이다절대로 접근할 수 없는 위치에 추가되지 않는 명령문입니다.

  • Docker와 관련된 유일한 입력 규칙은 iifname "docker0" counter packets 0 bytes 0 accept. 컨테이너가 기본 Docker 네트워크에 없으면 호스트에 도달하도록 허용하는 규칙이 없습니다.

    이를 테스트하려면 규칙을 추가해 보세요. 결과가 이전에 삽입되었는지 확인하십시오.줄이다규칙. 사용iptables, 규칙 추가 방지nftables호환되지 않을 수 있습니다.nftables의 iptables:

    iptables -I INPUT 8 -i "br-*" -j ACCEPT
    

관련 정보