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 대체 방법
conntrackct state
multiport{ ... } set
limitlimit rate
recentset + timeout
tcptcp flags
hashlimitlimit rate per
stringpayload
  • 예시를 하나씩 들어보겠음
# 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 : " drop

NAT 구현

NAT 테이블부터 만들어야 됨

nft add table ip nat

Prerouting의 경우에는 더 빨리 실행되어야 하니까 따로 설정

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:80

SNAT

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.4

MASQUERADE

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