8.3. nftables 테이블, 체인 및 규칙 생성 및 관리
nftables
규칙 세트를 표시하고 관리할 수 있습니다.
8.3.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.3.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.3.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.3.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)
매뉴얼 페이지