본문 바로가기
리눅스

(번역) nftables

by 다움위키 2025. 2. 22.

원문 보기: https://dawoum.duckdns.org/wiki/Nftables

 

Original article: w:Nftables

 

nftables네트워크 패킷/데이터그램/프레임의 필터링과 분류를 제공하는 리눅스 커널의 하위 시스템입니다. 그것은 2014년 1월 19일에 출시된 리눅스 커널 3.13부터 사용할 수 있습니다.

nftables는 Netfilter의 레거시 iptables 구성 요소를 대체합니다. iptables에 비해 nftables의 장점 중 하나는 코드 중복이 적고 새로운 프로토콜로 쉽게 확장할 수 있다는 것입니다. nftables의 단점 중 하나는 SNI 필터링과 같은 "iptables 문자열 일치"에 의해 제공된 DPI가 지원되지 않는다는 것입니다.

nftables는 사용자-공간 유틸리티 nft를 통해 구성되고, 반면에 레거시 도구는 유틸리티 iptables, ip6tables, arptables, 및 ebtables 프레임워크를 통해 구성됩니다.

nftables는 네트워킹 스택에 대한 기존 후크, 연결 추적 시스템, 사용자-공간 대기열 구성 요소, 및 로깅 하위-시스템과 같은 Netfilter 인프라의 빌딩 블록을 활용합니다.

nft

Command-line syntax

대상 IP 주소 1.2.3.4를 갖는 임의의 패킷을 버리는 명령:

nft add rule ip filter output ip daddr 1.2.3.4 drop

새로운 구문은 iptables의 구문과 상당히 다름에 주목하며, 이것에서 같은 규칙이 다음과 같이 작성됩니다:

iptables -A OUTPUT -d 1.2.3.4 -j DROP

새로운 구문은 더 장황하게 보일 수 있지만, 역시 훨씬 더 유연합니다. nftables는 iptables에 존재하지 않는 사전, 맵 및 연쇄와 같은 고급 데이터 구조를 통합합니다. 이것들의 사용을 만드는 것은 주어진 패킷 필터링 설계를 표현하기 위해 필요한 체인 및 규칙의 수를 크게 줄일 수 있습니다.

iptables-translate 도구는 기존의 많은 iptables 규칙을 동등한 nftables 규칙으로 변환하기 위해 사용될 수 있습니다. 다른 리눅스 패포판 중에서 Debian 10 (Buster)는 nftables를 기본 패킷 필터링 백엔드로 iptables-translate와 함께 사용합니다.

History

그 프로젝트는 Netfilter Core Team으로부터 Patrick McHardy에 의해 Netfilter Workshop 2008에서 처음으로 공개적으로 발표되었습니다. 커널과 사용자 공간 구현의 첫 번째 미리보기 출시는 2009년 3월에 제공되었습니다. 비록 그 도구가 "2001년 iptables의 도입 이후 리눅스 방화벽에 가장 큰 변화"라고 불리지만, 언론의 주목을 거의 받지 못했습니다. 유명 해커 Fyodor Vaskovich (Gordon Lyon)는 "주류 리눅스 커널에서 일반적으로 출시기를 기대하고 있습니다"라고 말했습니다.

그 프로젝트는 알파 단계에 머물렀고, 공식 웹사이트는 2009년에 제거되었습니다. 2010년 3월, 프로젝트 메일링 목록에 있는 작성자의 이메일은 프로젝트가 여전히 활성화되어 있고 베타 릴리스에 접근하고 있음을 보여주었지만, 후자는 공식적으로 결코 출시되지 않았습니다. 2012년 10월, Pablo Neira Ayuso는 iptables에 대한 호환성 계층을 제안했고, 이 프로젝트를 주류 커널에 포함할 가능성을 발표했습니다.

2013년 10월 16일, Pablo Neira Ayuso는 리눅스 커널 메인라인 트리에 nftables 코어 풀 요청을 제출했습니다. 그것은 리눅스 커널 버전 3.13이 출시와 함께 2014년 1월 19일에 커널 메인라인에 병합되었습니다.

Overview

nftables 커널 엔진은 네트워크 패킷을 검사하고 해당 패킷이 처리되어야 하는 방법에 대한 결정을 내리기 위해 바이트코드를 실행할 수 있는 리눅스 커널에 간단한 가상 기계를 추가합니다. 이 가상 기계에 의해 구현된 연산은 의도적으로 기본으로 만들어졌습니다. 그것은 패킷 자체에서 데이터를 가져오고, 결합된 메타데이터 (예를 들어, 인바운드 인터페이스)를 살펴보고, 연결-추적 데이터를 관리할 수 있습니다. 산술, 비트-별, 및 비교 연산자는 해당 데이터를 기반으로 결정을 내리는 데 사용될 수 있습니다. 가상 기계는 역시 데이터의 집합 (전형적으로, IP 주소)을 조작하여, 여러 비교 작업을 단일 집합 조회로 대체할 수 있습니다.

위에-설명된 조직은 프로토콜 인식 기능이 논리에 너무 깊숙이 내장되어 있어서 방화벽 엔진이 일반적인 방식으로 사용하기에는 프로토콜에 너무 특화되어 있기 때문에 코드를 IPv4, IPv6, ARP, 및 이더넷 브리징에 대해 4번 복제해야 했던 iptables 방화벽 코드와 상반됩니다.

iptables에 비해 nftables의 주요 장점은 리눅스 커널 ABI의 단순화, 코드 중복의 감소, 오류 보고 개선, 및 필터링 규칙의 보다 효율적인 실행, 저장, 및 증분적 변경입니다. 전통적으로 사용되는 iptables(8), ip6tables(8), arptables(8), 및 ebtables(8) (각각 IPv4, IPv6, ARP, 및 이더넷 브리징용)는 단일 통합 구현으로 nft(8)으로 대체되어, 커널-내 가상 기계의 꼭대기에 방화벽 구성을 제공하도록 의도되었습니다.

nftables는 역시 단일 Netlink 트랜잭션 내에서 하나 이상의 방화벽 규칙을 원자적으로 대체할 수 있는 개선된 사용자-공간 API를 제공합니다. 이것은 대규모 규칙-집합을 가지는 설정을 위해 방화벽 구성 변경 속력을 높입니다; 그것은 역시 규칙 변경이 실행되는 동안 경쟁 조건을 피하는 데 도움이 될 수 있습니다. nftables는 역시 이전 방화벽에서 쉽게 전환할 수 있는 호환성 기능, iptables 형식에서 규칙을 변환하기 위해 명령-줄 유틸리티, 및 nftables 백엔드를 사용하는 iptables 명령의 구문-호환 버전도 포함되어 있습니다.