Skip to content
VDS · 네트워크, IP 주소 및 도메인

nftables: 더 복잡한 규칙

ufw로 부족할 때를 다뤄요. nftables 테이블과 체인의 구조, 바로 쓸 수 있는 설정, 주소 집합, 속도 제한, 포트 포워딩을 설명해요.

업데이트 2026년 8월 23일

nftables는 ufw가 그 위에서 동작하는 바로 그 커널 메커니즘이에요. 이름이 붙은 주소 집합, 속도 제한, 인터페이스별로 다른 정책, 포트 포워딩이 필요할 때 — 즉 규칙이 더 이상 "포트 허용" 수준에 머물지 않을 때 — 직접 사용해야 해요.

두 도구를 동시에 쓸 필요는 없어요. 전환하기 전에 ufw disable로 ufw를 비활성화하세요. 그렇지 않으면 규칙이 겹쳐서 디버깅할 때 혼란스러워져요.

구조

규칙은 테이블에 있고, 테이블은 체인을 담고, 체인은 규칙을 담아요. 체인은 패킷 처리 단계(input, forward, output)에 묶이고 기본 정책을 가져요.

apt install -y nftables
systemctl enable --now nftables
nft list ruleset

동작하는 설정

파일 /etc/nftables.conf:

#!/usr/sbin/nft -f
flush ruleset

table inet filter {
    set admins {
        type ipv4_addr
        elements = { 203.0.113.5, 198.51.100.7 }
    }

    chain input {
        type filter hook input priority 0; policy drop;

        iif lo accept
        ct state established,related accept
        ct state invalid drop

        ip protocol icmp icmp type echo-request limit rate 5/second accept

        tcp dport 22 ip saddr @admins accept
        tcp dport 22 ct state new limit rate 6/minute accept
        tcp dport { 80, 443 } accept
    }

    chain forward {
        type filter hook forward priority 0; policy drop;
    }

    chain output {
        type filter hook output priority 0; policy accept;
    }
}

적용하고 저장하세요:

nft -c -f /etc/nftables.conf
nft -f /etc/nftables.conf
systemctl restart nftables

-c 플래그는 규칙을 적용하지 않고 문법만 검사해요. 항상 사용하세요. 오타가 있는 drop 정책은 접근을 끊어버리므로 /hosting/vds/m/<id> 패널의 콘솔을 통해 다시 들어와야 해요.

주소 집합과 속도 제한

이름이 붙은 집합은 규칙을 다시 불러오지 않고 즉시 편집할 수 있어요:

nft add element inet filter admins { 192.0.2.10 }
nft delete element inet filter admins { 198.51.100.7 }
nft list set inet filter admins

타임아웃이 있는 동적 집합은 사용자 지정 차단에 편리해요:

set blocked {
    type ipv4_addr
    flags timeout
    timeout 1h
}

포워딩과 주소 대체

내부에서 컨테이너나 터널이 실행 중일 때 필요해요:

table ip nat {
    chain prerouting {
        type nat hook prerouting priority -100;
        tcp dport 8443 dnat to 10.10.0.2:443
    }
    chain postrouting {
        type nat hook postrouting priority 100;
        oifname "eth0" masquerade
    }
}

흔한 실수

실수결과해결책
ct state established 규칙 없음나가는 요청에 대한 응답이 차단됨첫 번째 규칙으로 추가하세요
iif lo accept를 잊음로컬 서비스와 데이터베이스가 깨짐루프백 인터페이스를 허용하세요
규칙을 적용했지만 저장하지 않음재부팅 후 모든 것이 열림/etc/nftables.conf에 기록하세요
ufw와 nftables를 함께 사용예측할 수 없는 결과도구를 하나만 유지하세요

사용 중인 세션을 닫지 않은 채 별도의 세션에서 새 규칙 집합을 테스트하세요. 간단한 안전장치로 백그라운드에서 sleep 300 && nft flush ruleset을 실행하세요 — 스스로 접근을 차단해도 접근이 자동으로 복구돼요.

이런 세부 사항이 필요 없다면 ufw로 돌아가세요. 대부분의 작업을 처리해 줘요.