nftables: 새 테이블을 변경하거나 생성할 때 새로 고침/삭제

nftables: 새 테이블을 변경하거나 생성할 때 새로 고침/삭제

웹 필터링 테이블을 만들었습니다. 대본에 썼어요. 이 스크립트를 항상 로드할 수는 없습니다. 테이블을 새로 고치거나 삭제하면 테이블이 존재하지 않으면 작동하지 않습니다. 새로 고치거나 삭제하지 않으면 이전 규칙과 새 규칙이 병합됩니다.

테이블이 있는 경우 어떻게 새로 고치거나 삭제할 수 있나요?

#!/usr/sbin/nft -f

flush table my_table

table ip my_table {
    chain output {
        type filter hook output priority 0; policy accept;
        ip daddr 8.8.8.8 counter 
        ip daddr 1.1.1.1 counter
        skuid "other" jump restrict_chain
        skuid "d" jump d_chain
    }

    chain accept_chain {
        nftrace set 1 counter accept
    }

    chain reject_chain {
        nftrace set 1 counter reject
    }

    chain restrict_chain {
        #type filter priority 0; policy drop;
        counter
        ip daddr 1.1.1.1 counter
        oifname "lo" jump accept_chain
        oifname != "lo" jump reject_chain
    }

    chain d_chain {
        counter
    }
}

답변1

먼저 빈 테이블을 선언합니다. 테이블이 이미 존재하는 경우 오류가 발생하지 않으며 내용도 변경되지 않습니다. 아무 일도 일어나지 않습니다. 존재하지 않으면 빈 테이블이 생성된 것입니다. 모든 경우에 존재하므로 제거가 가능합니다. 이 모든 작업은 다음에서 수행될 수 있습니다.같은규칙 세트.

따라서 체인이나 규칙 없이 테이블을 선언한 다음 삭제합니다(매뉴얼 페이지새로 고침을 하면 체인과 규칙이 새로 고쳐지지만 체인 자체는 삭제되지 않고 비워질 뿐이며 이름이 변경된 이전 체인이나 세트가 유지되거나 속성이 변경된 경우 충돌합니다. 이것nftables 위키에는 삭제 및 플러시에 대한 자세한 정보가 있습니다.행동. ). 이제 실제로 만들 수 있습니다.동일하고 독특한규칙 세트 파일. 이제 동일한 규칙 세트를 처음에도 오류를 발생시키지 않고 여러 번 멱등적으로 로드할 수 있습니다.

#!/usr/sbin/nft -f

table ip my_table
delete table ip my_table

table ip my_table {
    chain output {
        type filter hook output priority 0; policy accept;
        ip daddr 8.8.8.8 counter 
# [...]
    }
}

업데이트: 충분히 새로운 커널과nftablesdestroy또한 동일한 멱등성 효과를 얻기 위해 처음 두 명령([ add] + )을 대체할 수 있는 "있는 경우 제거"를 의미하는 키워드를 허용합니다.delete

선택해서 사용하시면 됩니다include준비 라인이 많고 규칙 세트를 오염시키지 않으려는 경우 이러한 모든 준비 라인을 별도의 파일에 저장하는 명령문입니다.

체인 수준에서 동일한 작업을 수행할 수 있습니다. 즉, 동일한 테이블의 다른 체인을 변경하지 않고, 테이블과 해당 체인이 이전에 여기에 있었음을 가정하거나 요구하지 않고 수행할 수 있습니다. reject_chain활성화 예시 입니다NTRACE, 다른 테이블이나 체인은 삭제되지 않습니다 my_table. 이 예는 실제적인 용도는 없으며 단지 예일 뿐입니다.

#!/usr/sbin/nft -f

table ip my_table {
    chain reject_chain {
    }
}
delete chain ip my_table reject_chain

table ip my_table {
    chain reject_chain {
        nftrace set 1 counter reject
    }
}

호환성 참고: 아래와 같이 제대로 작동하려면 커널 < 3.18을 새로 고치고 제거해야 합니다.설명했다위키피디아에서. 이(및 이에 상응하는 체인)는 모든 커널 버전에서도 작동합니다.

table ip my_table
flush table ip my_table
delete table ip my_table

관련 정보