iptables 와 nftables 는 리눅스 커널의 패킷 필터 프레임워크 netfilter 를 다루는 사용자 공간 도구다. 방화벽 규칙 · NAT · 패킷 마킹을 이것으로 넣는다.
| 도구 | 커널 백엔드 | 현행 버전 | 상태 |
|---|---|---|---|
nftables (nft) |
nf_tables |
1.1.7[1] | 현행. RHEL 8+ · Debian 10+ · Ubuntu 20.10+ 의 기본 |
iptables-nft (iptables) |
nf_tables |
1.8.13[2] | iptables 문법을 유지하면서 nf_tables 로 넣는 호환 계층. 최근 배포판의 iptables 는 이것이다 |
| iptables-legacy | x_tables |
1.8.13 | 옛 백엔드. 컨테이너 런타임·쿠버네티스 일부가 아직 쓴다 |
어느 것이 잡혀 있는지는 iptables -V 로 안다 — (nf_tables) 또는 (legacy) 가 뒤에 붙는다. 두 백엔드를 한 시스템에서 동시에 쓰지 않는다. 규칙이 두 군데에 나뉘어 들어가 어느 쪽이 먼저 잡는지 알 수 없게 된다[3].
iptables -V
# iptables v1.8.13 (nf_tables)
update-alternatives --display iptables # Debian/Ubuntu 에서 어느 쪽인지
패킷은 넷필터 훅(hook)을 지나며, 각 훅에 걸린 체인의 규칙을 위에서부터 차례로 맞춰 본다. 처음 맞는 규칙의 타깃(ACCEPT · DROP · REJECT · 점프 등)이 그 패킷의 운명을 정한다. 어느 규칙에도 맞지 않으면 체인의 기본 정책(policy)을 따른다.
| 테이블 | 용도 | 기본 체인 |
|---|---|---|
filter |
허용·차단 (기본 테이블) | INPUT · FORWARD · OUTPUT |
nat |
주소·포트 변환. 연결의 첫 패킷만 본다 | PREROUTING · INPUT · OUTPUT · POSTROUTING |
mangle |
헤더 수정 · 마킹 (TTL, TOS, MARK) | 5개 전부 |
raw |
conntrack 제외(NOTRACK) 지정 | PREROUTING · OUTPUT |
┌──────── 로컬 프로세스 ────────┐
│ │
NIC ─▶ PREROUTING ─▶ 라우팅 ─▶ INPUT ─▶ (프로세스) ─▶ OUTPUT ─▶ 라우팅 ─▶ POSTROUTING ─▶ NIC
(nat/mangle/raw) │ ▲
└──────────── FORWARD ────────────────────┘
nftables 에는 고정 테이블·체인이 없다. 필요한 테이블과 체인을 만들면서 어느 훅에 어떤 우선순위로 걸지 직접 적는다. 그 대신 IPv4·IPv6 를 inet 패밀리 하나로 다룰 수 있다.
# iptables
iptables -L -n -v --line-numbers
iptables -t nat -L -n -v
# nftables — 백엔드에 들어간 모든 규칙 (iptables-nft 가 넣은 것도 보인다)
nft list ruleset
# 연결 추적 — 이미 맺어진 연결의 응답은 허용
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# 루프백
iptables -A INPUT -i lo -j ACCEPT
# 특정 대역에서 SSH
iptables -A INPUT -p tcp --dport 22 -s 192.168.1.0/24 -j ACCEPT
# 포트 열기
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 나머지는 거부 (기본 정책으로 두거나 마지막 규칙으로)
iptables -P INPUT DROP
# 규칙 삽입 (번호 위치) / 삭제
iptables -I INPUT 3 -p icmp -j ACCEPT
iptables -D INPUT 3
같은 내용을 nftables 로 쓰면 다음과 같다.
nft add table inet filter
nft 'add chain inet filter input { type filter hook input priority 0; policy drop; }'
nft add rule inet filter input ct state established,related accept
nft add rule inet filter input iif lo accept
nft add rule inet filter input tcp dport 22 ip saddr 192.168.1.0/24 accept
nft add rule inet filter input tcp dport 443 accept
iptables-translate 가 한 줄씩, iptables-restore-translate 가 iptables-save 출력 전체를 nft 문법으로 바꿔 준다[3:1].
iptables-translate -A INPUT -p tcp --dport 22 -j ACCEPT
# nft add rule ip filter INPUT tcp dport 22 counter accept
iptables-save > /tmp/iptables.rules
iptables-restore-translate -f /tmp/iptables.rules > /tmp/nft.rules
nft -f /tmp/nft.rules
규칙을 처음부터 다시 넣거나, 무엇이 막고 있는지 모를 때 전부 지우고 시작한다. 원격 세션이면 먼저 기본 정책을 ACCEPT 로 바꾼다 — 정책이 DROP 인 채 규칙만 지우면 SSH 가 끊긴다.
# 모든 체인 기본 정책을 ACCEPT 로 변경
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
# 모든 규칙 삭제
iptables -F
# 모든 사용자 정의 체인 삭제
iptables -X
# 카운터 초기화 (선택)
iptables -Z
# nat 테이블
iptables -t nat -F
iptables -t nat -X
# mangle 테이블
iptables -t mangle -F
iptables -t mangle -X
# raw 테이블
iptables -t raw -F
iptables -t raw -X
IPv6 는 ip6tables 로 같은 순서를 반복한다.
ip6tables -P INPUT ACCEPT
ip6tables -P FORWARD ACCEPT
ip6tables -P OUTPUT ACCEPT
ip6tables -F
ip6tables -X
ip6tables -t nat -F
ip6tables -t nat -X
ip6tables -t mangle -F
ip6tables -t mangle -X
ip6tables -t raw -F
ip6tables -t raw -X
nft 는 테이블 단위로 통째로 지운다. 기본 정책도 테이블과 함께 사라지므로 위와 같은 정책 변경 단계가 없다.
nft flush ruleset
iptables-nft 가 넣은 규칙도 nf_tables 에 있으므로 이 한 줄로 같이 지워진다. 반대로 iptables-legacy 규칙은 x_tables 에 있어 nft flush ruleset 으로는 지워지지 않는다 — 초기화 뒤에도 무언가 막고 있으면 iptables-legacy -L -n 을 본다.
메모리에 넣은 규칙은 재부팅하면 사라진다. 배포판별로 영구 저장 방식이 다르다.
| 배포판 | 서비스 | 저장 파일 | 저장 명령 |
|---|---|---|---|
| RHEL 8+ · Rocky · Alma | nftables.service |
/etc/sysconfig/nftables.conf |
nft list ruleset > /etc/sysconfig/nftables.conf |
| RHEL 7 | iptables.service (iptables-services 패키지) |
/etc/sysconfig/iptables |
iptables-save > /etc/sysconfig/iptables |
| Debian · Ubuntu (nft) | nftables.service |
/etc/nftables.conf |
nft list ruleset > /etc/nftables.conf |
| Debian · Ubuntu (iptables) | netfilter-persistent (iptables-persistent 패키지) |
/etc/iptables/rules.v4 · rules.v6 |
netfilter-persistent save |
# 수동 저장·복원 (어느 배포판이든)
iptables-save > /etc/iptables.rules
iptables-restore < /etc/iptables.rules
nft list ruleset > /etc/nftables.conf
nft -f /etc/nftables.conf
RHEL 계열은 firewalld 가, Ubuntu 는 ufw 가 기본 프런트엔드로 켜져 있을 수 있다. 이들이 켜져 있으면 직접 넣은 iptables/nft 규칙을 재시작 때 덮어쓰므로 둘 중 하나만 쓴다 — 직접 관리하려면 systemctl disable --now firewalld (또는 ufw disable) 를 먼저 한다.
ESTABLISHED 등)의 바탕이 되는 연결 상태.nftables 최신 버전 1.1.7 (2026-09-01) — 2026-09-20 확인. https://www.netfilter.org/projects/nftables/index.html ↩︎
iptables 최신 버전 1.8.13 (2026-03-04) — 2026-09-20 확인. https://www.netfilter.org/projects/iptables/index.html ↩︎
nftables wiki "Moving from iptables to nftables" — iptables-nft / iptables-legacy 구분, iptables-translate, 두 백엔드 동시 사용 금지 — 2026-09-20 확인. https://wiki.nftables.org/wiki-nftables/index.php/Moving_from_iptables_to_nftables ↩︎ ↩︎