nftables 명명된 세트 업데이트 지연

nftables 명명된 세트 업데이트 지연

나는 다음을 가지고 있습니다 nftables.conf:

table inet nat {

        set blocked {
            type ipv4_addr
        }
        
        chain postrouting {
            type nat hook postrouting priority 100; policy accept;

            ip daddr @blocked counter drop;
            
            oifname "ppp0" masquerade;
            iifname "br-3e4d90a574de" masquerade;
        }
    }

세트 blocked명명된 집합동적으로 업데이트할 수 있습니다. 이 세트 내에서 차단할 IP 세트를 갖고 싶고 각 IP에 대해 업데이트될 것입니다.N분. 저장하기 위해원자성, 그래요아니요updateblock.sh목록을 업데이트하려면 다음( )을 사용하십시오 .

#!/bin/bash

sudo nft flush set inet nat blocked
sudo nft add element inet nat blocked {$nodes}

대신에 blockediplist.ruleset:

#!/usr/sbin/nft -f

flush set inet nat blocked
add element inet nat blocked { <example_ip> }

나는 다음과 같은 일련의 명령을 사용합니다.

nft -f /etc/nftables.conf
nft -f blockediplist.ruleset

그러나 이러한 변경 사항은 blockediplist.ruleset즉시 적용되지 않습니다. 이러한 IP가 nft list ruleset및 에 존재하기 때문에 이제 규칙 세트에 새 IP가 포함되어 있다는 것을 알고 있습니다 nft list set inet nat blocked. 그냥 사용해도 nft add element inet nat blocked { <IP> }바로 IP가 차단되지는 않습니다.

또 다른 접근 방식은 새 컬렉션을 정의하고 nftables.conf전체 컬렉션을 다시 로드하는 것입니다. 하지만 이는 좋지 않고 비효율적인 방법이라고 생각합니다.

blockediplist.ruleset변경 사항을 즉시 적용하도록 하는 방법이 있습니까 ?

고쳐 쓰다:ping을 하지 않은 IP를 차단하면 즉시 차단된다는 사실을 방금 발견했습니다. 하지만 차단 목록에 IP가 추가되면 차단하는 데 시간이 걸립니다. IP를 설정하려고 하면 netdev ingress바로 차단됩니다. 아마도 이 조사 방법을 통해 뭔가가 밝혀질 수도 있을 것입니다.

답변1

nat 후크(다른 모든 후크와 마찬가지로)는 Netfilter에서 nftables에 제공됩니다. NAT 후크는 특별합니다. 연결의 첫 번째 패킷만 이 후크를 통과합니다. conntrack에 의해 이미 추적된 연결에 대한 다른 모든 패킷은 더 이상 NAT 후크를 통과하지 않고 직접 전송됩니다.연결하다이 흐름에 대해 구성된 NAT 작업을 진행합니다.

이는 삭제를 위해 이 후크를 절대 사용해서는 안되는 이유를 설명합니다. 이는 NAT 여부에 관계없이 이미 추적된 연결에는 영향을 미치지 않습니다.

트래픽을 떨어뜨리는 부분의 후크 유형을 에서 으로 변경하면 됩니다 type nat. type filter반대쪽으로iptables테이블은 하나의 후크 유형으로 제한되지 않습니다. 실제로 이 경우에는 여러 유형을 사용해야 합니다.놓다테이블에 로컬이며 두 테이블 간에 공유할 수 없습니다. 같은 이유로 이 테이블은 inet natNAT만 수행하는 것이 아니기 때문에 논리적으로 더 이상 호출되어서는 안 됩니다(그러나 이름을 바꾸지는 않았습니다).

그래서 결국:

nftables.conf:

table inet nat {

        set blocked {
            type ipv4_addr
        }

        chain block {
            type filter hook postrouting priority 0; policy accept;
            ip daddr @blocked counter drop
        }

        chain postrouting {
            type nat hook postrouting priority 100; policy accept;
            oifname "ppp0" masquerade
            iifname "br-3e4d90a574de" masquerade
        }
    }

지금:

  • 모든 패킷은 체인에 의해 검사되므로 inet nat block그룹 blocked은 다음 트래픽이 영향을 받을 때까지 기다릴 필요 없이 즉시 트래픽에 영향을 미칠 수 있습니다.

  • 평소와 같이 새 흐름의 첫 번째 패킷(임시 conntrack 상태 NEW)만 체인을 통과합니다 inet nat postrouting.


또한 iifname "br-3e4d90a574de" masquerade;충분히 새로운 커널(Linux커널 >= 5.5): 이전에는 라우팅 후 후크가 나가는 인터페이스에 의한 필터링만 지원했습니다. 또한 이는 Docker 관련 인터페이스처럼 보이며 이러한 종류의 규칙을 추가하면 브리지 인터페이스를 참조하므로 Docker와 상호 작용할 수 있습니다(예: 동일한 네트워크에 있는 두 컨테이너 간의 NAT 트래픽일 수 있음). 이는 Docker가 브리지된 트래픽을 가능하게 하기 때문입니다.nftables(또한iptables) 로드하여br_netfilter기준 치수).

관련 정보