8장. nftables 시작하기
nftables
프레임워크는 패킷을 분류하고 iptables
,ip6tables
,arptables
,ebtables
, ipset
유틸리티의 후속 조치입니다. 이전의 패킷 필터링 툴에 비해 편의성, 기능 및 성능이 크게 향상되었으며 주요 개선 사항은 다음과 같습니다.
- 선형 처리 대신 기본 제공 조회 테이블
-
IPv4
및IPv6
프로토콜 모두를 위한 단일 프레임워크 - 모든 규칙은 전체 규칙 세트를 가져오기, 업데이트 및 저장하는 대신 원자적으로 적용됩니다.
-
규칙 세트(
nftrace
) 및 모니터링 추적 이벤트(nft
툴 내)에서 디버깅 및 추적 지원 - 프로토콜별 확장 없이 보다 일관되고 컴팩트한 구문
- 타사 애플리케이션을 위한 Netlink API
nftables
프레임워크는 테이블을 사용하여 체인을 저장합니다. 체인에는 작업을 수행하기 위한 개별 규칙이 포함되어 있습니다. nft
유틸리티는 이전 패킷 필터링 프레임워크의 모든 도구를 대체합니다. libnftnl
라이브러리를 사용하여 libmnl
라이브러리를 통해 nftables
Netlink API와 하위 수준의 상호 작용을 수행할 수 있습니다.
규칙 세트 변경의 효과를 표시하려면 nft list ruleset
명령을 사용합니다. 이러한 유틸리티는 테이블, 체인, 규칙, 세트 및 기타 오브젝트를 nftables
규칙 세트에 추가하므로 nft flush ruleset
명령과 같은 nftables
규칙 세트 작업이 iptables
명령을 사용하여 설치된 규칙 세트에 영향을 미칠 수 있습니다.
8.1. nftables 테이블, 체인 및 규칙 생성 및 관리
nftables
규칙 세트를 표시하고 관리할 수 있습니다.
8.1.1. nftables 테이블 기본
nftables
의 테이블은 체인, 규칙, 세트 및 기타 오브젝트 컬렉션을 포함하는 네임스페이스입니다.
각 테이블에는 주소 제품군이 할당되어 있어야 합니다. 주소 family는 이 테이블이 처리하는 패킷 유형을 정의합니다. 테이블을 만들 때 다음 주소 제품군 중 하나를 설정할 수 있습니다.
-
ip
: 일치하는 IPv4 패킷 만 일치합니다. 주소 제품군을 지정하지 않으면 기본값입니다. -
ip6
: IPv6 패킷 만 일치합니다. -
inet
: IPv4 및 IPv6 패킷과 일치합니다. -
ARP
: IPv4 ARP(Address Resolution Protocol) 패킷과 일치합니다. -
브리지
: 브리지 장치를 통과하는 패킷과 일치합니다. -
netdev
: 수신에서 패킷 일치.
테이블을 추가하려면 사용할 형식은 방화벽 스크립트에 따라 다릅니다.
기본 구문 스크립트의 경우 다음을 사용합니다.
table <table_address_family> <table_name> { }
쉘 스크립트에서는 다음을 사용합니다.
nft add table <table_address_family> <table_name>
8.1.2. nftables 체인의 기본 사항
테이블은 체인으로 구성되며, 이 체인은 규칙용 컨테이너입니다. 다음 두 가지 규칙 유형이 있습니다.
- 기본 체인: 기본 체인을 네트워킹 스택의 패킷 진입점으로 사용할 수 있습니다.
-
일반 체인: 규칙을 더 잘 구성하기 위해 일반 체인을
이동
대상으로 사용할 수 있습니다.
테이블에 기본 체인을 추가하려면 사용할 형식은 방화벽 스크립트에 따라 다릅니다.
기본 구문 스크립트의 경우 다음을 사용합니다.
table <table_address_family> <table_name> { chain <chain_name> { type <type> hook <hook> priority <priority> policy <policy> ; } }
쉘 스크립트에서는 다음을 사용합니다.
nft add chain <table_address_family> <table_name> <chain_name> { type <type> hook <hook> priority <priority> \; policy <policy> \; }
쉘이 명령 끝으로 해석되지 않도록 하려면 \ 이스케이프 문자 앞에
\
이스케이프 문자를 배치합니다.
두 예에서는 기본 체인을 생성합니다. 일반 체인 을 생성하려면 중괄호에서 매개 변수를 설정하지 마십시오.
체인 유형
다음은 체인 유형 및 제품군과 후크를 사용할 수 있는 개요입니다.
유형 | 주소 제품군 | 후크 | 설명 |
---|---|---|---|
| 모두 | 모두 | 표준 체인 유형 |
|
|
| 이 유형의 체인은 연결 추적 항목을 기반으로 기본 주소 변환을 수행합니다. 첫 번째 패킷만 이 체인 유형을 통과합니다. |
|
|
| 이 체인 유형을 트래버스하는 수락된 패킷은 IP 헤더의 관련 부분이 변경된 경우 새로운 경로 조회를 유발합니다. |
체인 우선순위
priority 매개변수는 패킷이 동일한 후크 값을 사용하는 체인을 트래버스하는 순서를 지정합니다. 이 매개변수를 정수 값으로 설정하거나 표준 우선순위 이름을 사용할 수 있습니다.
다음 매트릭스는 표준 우선 순위 이름과 해당 숫자 값에 대한 개요와 함께 사용할 수 있는 제품군과 후크를 처리합니다.
텍스트 값 | 숫자 값 | 주소 제품군 | 후크 |
---|---|---|---|
|
|
| 모두 |
|
|
| 모두 |
|
|
|
|
|
|
| |
|
|
IP , | 모두 |
|
| 모두 | |
|
|
| 모두 |
|
|
|
|
|
|
| |
|
|
|
|
체인 정책
체인 정책은 이 체인의 규칙이 작업을 지정하지 않는 경우 nftables
가 패킷을 수락하거나 삭제해야 하는지 여부를 정의합니다. 체인에서 다음 정책 중 하나를 설정할 수 있습니다.
-
수락
(기본값) -
drop
8.1.3. nftables 규칙의 기본 사항
규칙은 이 규칙을 포함하는 체인을 전달하는 패킷에서 수행할 작업을 정의합니다. 규칙에 일치하는 표현식도 포함된 경우 nftables
는 모든 이전 표현식이 적용되는 경우에만 작업을 수행합니다.
체인에 규칙을 추가하려면 사용할 형식은 방화벽 스크립트에 따라 다릅니다.
기본 구문 스크립트의 경우 다음을 사용합니다.
table <table_address_family> <table_name> { chain <chain_name> { type <type> hook <hook> priority <priority> ; policy <policy> ; <rule> } }
쉘 스크립트에서는 다음을 사용합니다.
nft add rule <table_address_family> <table_name> <chain_name> <rule>
이 쉘 명령은 체인 끝에 새 규칙을 추가합니다. 체인 시작 부분에 규칙을 추가하려면
nft add
대신nft insert
명령을 사용하십시오.
8.1.4. nft 명령을 사용하여 테이블, 체인 및 규칙 관리
명령줄 또는 쉘 스크립트에서 nftables
방화벽을 관리하려면 nft
유틸리티를 사용합니다.
이 절차의 명령은 일반적인 워크플로우를 나타내지 않으며 최적화되지 않습니다. 이 절차에서는 일반적으로 nft
명령을 사용하여 테이블, 체인 및 규칙을 관리하는 방법을 보여줍니다.
절차
테이블이 IPv4 및 IPv6 패킷을 모두 처리할 수 있도록
inet
주소 Family를 사용하여nftables_svc
라는 테이블을 만듭니다.# nft add table inet nftables_svc
들어오는 네트워크 트래픽을 처리하는
INPUT
라는 기본 체인을inet nftables_svc
테이블에 추가합니다.# nft add chain inet nftables_svc INPUT { type filter hook input priority filter \; policy accept \; }
쉘이 명령 끝으로 해석되는 것을 방지하기 위해
\
문자를 사용하여 이름이 0으로 이스케이프합니다.INPUT
체인에 규칙을 추가합니다. 예를 들어 포트 22 및 443에서 들어오는 TCP 트래픽을 허용하고INPUT
체인의 마지막 규칙으로 IMP(Internet Control Message Protocol) 포트 연결할 수 없는 메시지가 있는 다른 들어오는 트래픽을 거부합니다.# nft add rule inet nftables_svc INPUT tcp dport 22 accept # nft add rule inet nftables_svc INPUT tcp dport 443 accept # nft add rule inet nftables_svc INPUT reject with icmpx type port-unreachable
다음과 같이
nft add rule
명령을 입력하면nft
는 명령을 실행할 때와 동일한 순서로 규칙을 체인에 추가합니다.프로세스를 포함한 현재 규칙 세트를 표시합니다.
# nft -a list table inet nftables_svc table inet nftables_svc { # handle 13 chain INPUT { # handle 1 type filter hook input priority filter; policy accept; tcp dport 22 accept # handle 2 tcp dport 443 accept # handle 3 reject # handle 4 } }
handle 3이 있는 기존 규칙 앞에 규칙을 삽입합니다. 예를 들어 포트 636에서 TCP 트래픽을 허용하는 규칙을 삽입하려면 다음을 입력합니다.
# nft insert rule inet nftables_svc INPUT position 3 tcp dport 636 accept
handle 3이 있는 기존 규칙 뒤에 규칙을 추가합니다. 예를 들어 포트 80에서 TCP 트래픽을 허용하는 규칙을 삽입하려면 다음을 입력합니다.
# nft add rule inet nftables_svc INPUT position 3 tcp dport 80 accept
handles를 사용하여 규칙 세트를 다시 표시합니다. 나중에 추가된 규칙이 지정된 위치에 추가되었는지 확인합니다.
# nft -a list table inet nftables_svc table inet nftables_svc { # handle 13 chain INPUT { # handle 1 type filter hook input priority filter; policy accept; tcp dport 22 accept # handle 2 tcp dport 636 accept # handle 5 tcp dport 443 accept # handle 3 tcp dport 80 accept # handle 6 reject # handle 4 } }
handle 6을 사용하여 규칙을 제거합니다.
# nft delete rule inet nftables_svc INPUT handle 6
규칙을 제거하려면 handle을 지정해야 합니다.
규칙 세트를 표시하고 제거된 규칙이 더 이상 존재하지 않는지 확인합니다.
# nft -a list table inet nftables_svc table inet nftables_svc { # handle 13 chain INPUT { # handle 1 type filter hook input priority filter; policy accept; tcp dport 22 accept # handle 2 tcp dport 636 accept # handle 5 tcp dport 443 accept # handle 3 reject # handle 4 } }
INPUT
체인에서 나머지 모든 규칙을 제거합니다.# nft flush chain inet nftables_svc INPUT
규칙 세트를 표시하고
INPUT
체인이 비어 있는지 확인합니다.# nft list table inet nftables_svc table inet nftables_svc { chain INPUT { type filter hook input priority filter; policy accept } }
INPUT
체인을 삭제합니다.# nft delete chain inet nftables_svc INPUT
이 명령을 사용하여 여전히 규칙이 포함된 체인을 삭제할 수도 있습니다.
규칙 세트를 표시하고
INPUT
체인이 삭제되었는지 확인합니다.# nft list table inet nftables_svc table inet nftables_svc { }
nftables_svc
테이블을 삭제합니다.# nft delete table inet nftables_svc
이 명령을 사용하여 체인이 여전히 포함된 테이블을 삭제할 수도 있습니다.
참고전체 규칙 세트를 삭제하려면 별도의 명령으로 모든 규칙, 체인 및 테이블을 수동으로 삭제하는 대신
nft flush ruleset
명령을 사용합니다.
추가 리소스
시스템의 nft(8)
도움말 페이지