nftables 규칙을 자동으로 교체하는 방법은 무엇입니까?

nftables 규칙을 자동으로 교체하는 방법은 무엇입니까?

nftables 규칙을 자동으로 대체하려고 합니다. Nftables 공식 위키상태-f는 이를 달성하는 데 권장되는 방법입니다. 그러나 nft -f /path/to/new/rulesDebian Buster를 실행하면 새 규칙이 현재 규칙을 대체하는 대신 추가되고 두 ​​규칙 세트를 동시에 실행하는 시스템이 됩니다.

systemd'를 통해 구성을 다시 로드 하려고 할 때도 같은 일이 발생합니다 nftables.service.

nft단일 원자성 작업에서 새 규칙 세트를 추가하는 동안 현재 규칙 세트를 어떻게 삭제할 수 있습니까 ?

답변1

작업 완료nft -f /path/to/new/rules 원자성: 이는 완전히 완료되거나 전혀 완료되지 않음(예: 재개)을 의미하며 제출 직후 일치하는 다음 패킷에만 영향을 미칩니다. (오류로 인해) 끝나지 않고 절반만 완료되었습니다. 따라서 이전 규칙 세트를 삭제하지 않은 경우 예상대로 작동합니다. 자동으로 규칙을 추가합니다.다시, 댓글에서 언급했듯이원자 규칙 대체위키피디아에서:

반복 규칙: 줄 flush table filter의 맨 처음에 줄을 추가하는 경우필터 테이블파일을 사용하면 iptables-restore에서 제공하는 것과 동일한 원자 규칙 세트 대체를 구현할 수 있습니다. 커널은 트랜잭션 내 파일의 규칙 명령을 처리하므로 기본적으로 새 규칙의 플러시와 로드가 동시에 발생합니다.테이블을 새로 고치지 않도록 선택하면 구성을 다시 로드할 때마다 중복 규칙이 표시됩니다.

이렇게 하려면 동일한 거래에 참여해야 합니다.삭제이전 규칙을 규칙 세트에 다시 추가하기 전에 삭제하세요. 가장 간단하지만(모든 것에 영향을 미침)nftables, 포함하다iptables-nft또한 사용되는 경우) 위에서 설명한 것과 유사하게 규칙 세트 앞에 다음을 추가하면 됩니다 /path/to/new/rules.

flush ruleset

논리적 기능을 분리된 상태로 유지하기 위해 서로 다른 시간에 서로 다른 테이블을 로드하는 경우(nftables, 테이블은 (특정 패밀리에 대한) 모든 유형의 기본 체인을 포함할 수 있지만 다음 테이블과 직접적으로 동일하지는 않습니다.iptablesflush ruleset고정된 가능한 체인 세트가 있습니다. 규칙 파일에서 다른 테이블(포함)이 삭제되기 때문에 약간 복잡해집니다.iptables-nft함께 사용하는 경우의 규칙nftables). 그런 다음 이 작업은 예를 들어 테이블 수준에서 수행되어야 합니다(그러나 이 작업을 수행하기 전에 자세한 내용을 읽어 보십시오).

delete table inet foo

다음은 재정의( table inet foo {...)입니다. 있는 그대로 이것은 또 다른 닭과 달걀 문제를 야기합니다. 파일을 처음 읽을 때(예: 시작 시) 삭제 작업이 실패하므로 테이블이 존재하지 않기 때문에 모든 것이 자동으로 실패합니다. 이미 선언된 테이블의 이름을 선언하는 것은 no-op로 간주되어 실패하지 않으므로 결국 다음을 수행할 수 있습니다.

table inet foo
delete table inet foo

table inet foo {
[...]
  • 참고 1: 모든 상황에서 제대로 작동하려면커널 >= 3.18 필요, 그렇지 않으면 계속 사용하는 것이 가장 좋습니다 flush ruleset.

  • 참고 2: 위의 위키 주석에서는 이 경우에 사용을 권장 flush table inet foo하지만 컬렉션이 존재하는 경우 이 경우에는 사용하지 않는 것이 좋습니다.컬렉션에서 요소를 삭제하지 않습니다., 규칙 세트 내에서 요소가 추가되고 변경된 경우 다시 요소가 교체되지 않고 추가됩니다. 또한 기본 체인의 유형/후크를 재정의하는 것도 허용하지 않습니다. table inet foo+를 사용하면 delete table inet foo이러한 단점이 없습니다. 물론 규칙을 다시 로드할 때 컬렉션의 요소를 유지해야 하는 경우 이를 사용 flush table inet foo하고 이 접근 방식의 제한 사항에 적응하는 것을 고려할 수 있습니다.


모든 경우에 현재 규칙을 규칙 파일로 덤프할 때는 주의해야 합니다 nft list {ruleset, table inet foo, ...} > /path/to/new/rules. 여기에는 새로 고침 또는 삭제 명령이 포함되어 있지 않으며 수동으로 다시 추가해야 합니다. 당신은 사용할 수 있습니다include실제 규칙 외부에 "배관공" 문을 배치하여 이 문제를 극복하십시오.

관련 정보