nftables?
- 기존의 iptables 의 단점이었던 ipv4/v6의 분리 설정을 합쳐서 할 수 있음
- iptables 보다 쓰기가 편함
- iptables에 있던걸 nftables로 마이그레이션 하는 작업도 가능함
참고
- 이번 실습은 Rocky Linux 9에서 진행함
- 사유 : CentOS 7에는 기본값이 iptables임
- 그리고 firewalld 를 다운시켜야 함. 왜냐면 firewalld 가 nftables를 제어하기 때문
0. 백업/복구하기
백업
nft list ruleset > <파일위치>- 예시
nft list ruleset > nftables.backup복구
nft flush ruleset # 아예 초기화
nft -f <파일위치> # 파일 적용- flush 안하면 똑같은 내용이 또 적용될 수 있음
1. 확인하기
- 참고 : nftables는 기본적으로 아무 정책도 없음
nft list ruleset
2. 정책 추가 / 수정하기
0) 테이블 만들기
- nftables 는 직접 테이블을 만들고 이를 체인에 적용하는 방식.
nft add table <패밀리> <테이블명>- 예시
nft add table inet filter-
inet : ipv4 + ipv6
-
따라서 위 명령어는 ipv4, ipv6에 공통으로 적용되는 filter라는 테이블을 만들겠다는 의미임
1) 화이트리스트 방식으로 만들기
- 저번 iptables처럼 들어오는걸 막고 나가는 것만 허용해볼 것
nft add chain inet filter input { \
type filter hook input priority 0\; \
policy drop\; \ }- filter 테이블 안에 체인 생성
- 타입 : 필터
- 훅 (후킹 포인트) : INPUT
- 우선순위 : 0
- 이후 행동 : DROP
nft add chain inet filter output { \
type filter hook output priority 0\; \
policy accept\; }- filter 테이블 안에 체인 생성
- 타입 : 필터
- 훅 (후킹 포인트) : OUTPUT
- 우선순위 : 0
- 이후 행동 : ACCEPT
nft add chain net filter forward { \
type filter hook forward priority 0\; \
policy drop\; }-
filter 테이블 안에 체인 생성
- 타입 : 필터
- 훅 (후킹 포인트) : FORWARD
- 우선순위 : 0
- 이후 행동 : DROP
-
결과 확인해보면 잘 된걸 볼 수 있음

2) 정책 추가하기
특정 인터페이스에 대한 정책
- 조건을 추가하려면 아래와 같이 작성
nft add rule <패밀리> <테이블명> <체인명> iif(또는 oif) <인터페이스명> <다음_행동>-
iif : Input Interface.
-
oif : Output Interface.
-
예시 :
- input 체인에 filter 테이블에, ipv4+ipv6 환경에서 lo (루프백) 인터페이스로 들어오는 데이터는 허용하는 정책을 추가
nft add rule inet filter input iif lo accept특정 IP에 관해 적용하는 정책
nft add rule <패밀리> <테이블명> <체인명> ip saddr(또는 daddr) <아이피> <다음_행동>-
saddr : Source Address. 출발지 IP
-
daddr : Destination Address. 도착지 IP
-
예시 : 192.168.10.20 을 제한하는 정책을 추가
nft add rule inet filter input ip saddr 192.168.10.20 drop특정 포트에 관해 적용하는 정책
nft add rule <패밀리> <테이블명> <체인명> tcp(또는 udp) dport(또는 sport) <포트> <다음_행동>-
sport : Source Port. 출발지 포트
-
dport : Destination Port. 도착지 포트
-
예시 : SSH (22번 포트) 막기
nft add rule inet filter input tcp dport 22 drop특정 조건을 부합했을 때 적용하는 정책
nft add rule <패밀리> <테이블> <체인> <조건> <다음_행동>- 원래 iptables에서는 확장 모듈의 경우 -m 을 사용했었는데, nftables에서는 기본 모듈과 확장 모듈의 경계가 사라졌음.
- 그냥 조건이 바로 붙게 됨
| iptables 확장 모듈 | nftables 대체 방법 |
|---|---|
| conntrack | ct state |
| multiport | { ... } set |
| limit | limit rate |
| recent | set + timeout |
| tcp | tcp flags |
| hashlimit | limit rate per |
| string | payload |
- 예시를 하나씩 들어보겠음
# conntrack > ct state
nft add rule inet filter input ct state established, related accept
# multiport > { ... } set
nft add rule inet filter input tcp dport { 22, 80, 443 }
# limit > limit rate
nft add rule inet filter input limit rate 5/minute accept
# recent > set + timeout
# 얘는 모양이 조금 다름
nft add set inet filter ssh_recent \
{ type ipv4_addr \; \
timeout 1m \; }
nft add rule inet filter input ip saddr @ssh_recent drop
# 참고로 이렇게 만든 구조 (ssh_recent) 의 경우 껐다 키면 없어지기 때문에, 파일에서 수정해야함
# 파일 위치 : /etc/sysconfig/nftables.conf
# tcp > tcp flags
nft add rule inet filter input tcp flags syn accept
# hashlimit > limit rate per
# limit처럼 사용
# string > payload
# 잘 안써서 패스로그를 남기기 위한 정책
- 로그를 위해 따로 정책을 만들 필요 없이, 기존의 다음 행동 위치 바로 앞에 log를 붙이면 되도록 바뀜
nft add rule <패밀리> <테이블> <체인> <조건> log prefix "로그_접두사" <다음_행동>- 예시
nft add rule inet filter input tcp dport 22 log prefix "SSH Approch : " dropNAT 구현
NAT 테이블부터 만들어야 됨
nft add table ip natPrerouting의 경우에는 더 빨리 실행되어야 하니까 따로 설정
nft add chain ip nat prerouting { type nat hook prerouting priority -100 \;}DNAT
nft add rule <패밀리> nat prerouting <조건> dnat to <IP:Port>- 예시
nft add rule ip nat prerouting tcp dport 8080 dnat to 192.168.0.10:80SNAT
nft add rule <패밀리> nat postrouting <조건> snat to <IP:Port>- 예시
nft add rule ip nat postrouting ip saddr 192.168.0.0/24 snat to 1.2.3.4MASQUERADE
nft add rule ip nat postrouting \
oifname <인터페이스명> ip saddr <IP/CIDR> masquerade- 예시
nft add rule ip nat postrouting \
oifname "eth0" ip saddr 192.168.0.0/24 masquerade
3. 정책 삭제하기
규칙 순서 확인
nft list chain <패밀리> <테이블명> <체인명>- 예시
nft list chain inet filter input
삭제
nft delete rule <패밀리> <테이블명> <체인명> handle <삭제할_규칙_번호>- 예시
nft delete rule inet filter input handle 0