본문 바로가기

nftables

룰 설정 / Simple rule management

source: https://wiki.nftables.org/wiki-nftables/index.php/Simple_rule_management

이전 글: 체인 설정 / Configuring chains

다음 글: 순식간에 많은 룰 변경 / Atomic rule replacement

참고: https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/configuring_and_managing_networking/getting-started-with-nftables_configuring-and-managing-networking

 

패켓에 대한 조건을 확인하고 조건에 맞다면 그 결과에 따라 처리(행동)(accept, drop, counter 등)하는 것을 룰이라고 합니다. 룰은 조건 검색을 하는 expression과 처리하는 부분을 statement로 이루어져 있습니다. expression 안에서는 여러개 조건을 명시하여 검색할 있습니다. 조건은 왼쪽부터 오른쪽으로 차례로 검색합니다. statement에서도 여러개 행동을 지정할 수 있습니다. statement에 해당하는 행동은 마킹, counting, logging, accept, drop, jumping 등이 있습니다. 

룰 추가

다음은 룰을 추가하는 명령어 문법입니다. 

% nft add rule <table-name> <chain-name> <rule-expressions> <rule-statements>

아래는 목적지 주소가 8.8.8.8인 ip packet을 세는 룰을 추가하는 예입니다. 

  • table-name: filter
  • chain-name: output
  • rule-expression: ip daddr 8.8.8.8
  • rule-statement: counter
% nft add rule filter output ip daddr 8.8.8.8 counter

아래는 hook output에 적용해 놓은 base chain output에서 위 룰을 추가하는 것입니다.

salsal@r3:~$ sudo nft list table filter
table ip filter {
	chain output {
		type filter hook output priority 0; policy accept;
	}
}
salsal@r3:~$ sudo nft add rule filter output ip daddr 8.8.8.8 counter

룰 확인

추가한 룰을 확인하는 방법입니다.  table을 확인하거나 chain을 확인하면 됩니다. 

# nft list ruleset 으로 전체 룰을 볼 수 있고, table, chain을 모두 확인할 수 있습니다. 

salsal@r3:~$ sudo nft list ruleset
table inet filter {
	chain input {
		type filter hook input priority 0; policy accept;
	}

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

	chain output {
		type filter hook output priority 0; policy accept;
	}
}
table ip filter {
	chain output {
		type filter hook output priority 0; policy accept;
		ip daddr 8.8.8.8 counter packets 2 bytes 168
	}
}

# table을 확인할 수도 있습니다. 

salsal@r3:~$ sudo nft list table filter
table ip filter {
	chain output {
		type filter hook output priority 0; policy accept;
		ip daddr 8.8.8.8 counter packets 0 bytes 0
	}
}

# chain을 확인할 수도 있습니다. 

salsal@r3:~$ sudo nft list chain filter output
[sudo] password for salsal:
table ip filter {
	chain output {
		type filter hook output priority 0; policy accept;
		ip daddr 8.8.8.8 counter packets 0 bytes 0
	}
}

nft -a 를 이용하여 각 룰의 handle 번호를 출력할 수 있습니다. 룰을 삽입(insert)하려고 할때 필요한 번호입니다. 

salsal@r3:~$ sudo nft -a list chain ip filter output
table ip filter {
	chain output {
		type filter hook output priority 0; policy accept;
		ip daddr 8.8.8.8 counter packets 2 bytes 168 # handle 6
	}
}

(* 1개 hook output에 적용한 chain 들을 어떻게 한 번에 다 볼 수 있을까? 방법이 없는 듯 보임. 방법이 없다면 .. family 1개를 위한 테이블을 만들고 그 테이블 안에서 각 hook에 들어가는 chain을 모아 선언하는 것이 적절해 보임)

 

룰 동작 확인

시스템을 떠나는 hook output에 chain output을 적용해 놓았으므로 시스템에서 8.8.8.8 로 향하는 패켓을 발생하면 위 룰이 동작하는지 아닌지 확인할 수 있습니다. 8.8.8.8로 향하는 ping 을 시도 합니다. 

salsal@r3:~$
salsal@r3:~$ ping -c 2 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=63 time=32.8 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=63 time=37.0 ms

--- 8.8.8.8 ping statistics ---

그러면 아래와 같이 ping 8.8.8.8 이전과 이후 counter packet bytes의 변화를 볼 수 있습니다. 

salsal@r3:~$ sudo nft list chain filter output
[sudo] password for salsal:
table ip filter {
	chain output {
		type filter hook output priority 0; policy accept;
		ip daddr 8.8.8.8 counter packets 0 bytes 0
	}
}
salsal@r3:~$
salsal@r3:~$ ping -c 2 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=63 time=32.8 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=63 time=37.0 ms

--- 8.8.8.8 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 32.871/34.950/37.029/2.079 ms
salsal@r3:~$ sudo nft list chain filter output
table ip filter {
	chain output {
		type filter hook output priority 0; policy accept;
		ip daddr 8.8.8.8 counter packets 2 bytes 168
	}
}

룰을 특정 위치에 추가하기

룰을 특정 위치에 추가하려면 이미 있는 룰의 handle 번호를 알아야 합니다. nft -a list 명령어를 이용하여 알아낼 수 있습니다. 

salsal@r3:~$ sudo nft -a list chain ip filter output
table ip filter {
	chain output {
		type filter hook output priority 0; policy accept;
		ip daddr 8.8.8.8 counter packets 2 bytes 168 # handle 6
		ip daddr 10.10.10.10 counter packets 3 bytes 252 # handle 7
		ip daddr 10.100.100.100 counter packets 1 bytes 84 # handle 8
	}
}

여기에서 10.10.200.200 으로 향하는 패켓을 세는 rule을 handle 7번 뒤에 추가해 보겠습니다. nft add rule을 이용하며 handle 번호를 position 번호로 지정하면 됩니다. 

salsal@r3:~$ sudo nft add rule ip filter output position 7 ip daddr 10.10.200.200 counter packets 0
salsal@r3:~$ sudo nft -a list chain ip filter output
table ip filter {
	chain output {
		type filter hook output priority 0; policy accept;
		ip daddr 8.8.8.8 counter packets 2 bytes 168 # handle 6
		ip daddr 10.10.10.10 counter packets 3 bytes 252 # handle 7
		ip daddr 10.10.200.200 counter packets 0 bytes 0 # handle 9
		ip daddr 10.100.100.100 counter packets 1 bytes 84 # handle 8
	}
}
salsal@r3:~$

handle 7번 앞에 추가하려면 nft insert rule을 position과 함께 이용하면 됩니다. 

salsal@r3:~$ sudo nft insert rule ip filter output position 7 ip daddr 10.10.20.20 counter packets 0
salsal@r3:~$ sudo nft -a list chain ip filter output
table ip filter {
	chain output {
		type filter hook output priority 0; policy accept;
		ip daddr 8.8.8.8 counter packets 2 bytes 168 # handle 6
		ip daddr 10.10.20.20 counter packets 0 bytes 0 # handle 10
		ip daddr 10.10.10.10 counter packets 3 bytes 252 # handle 7
		ip daddr 10.10.200.200 counter packets 0 bytes 0 # handle 9
		ip daddr 10.100.100.100 counter packets 1 bytes 84 # handle 8
	}
}

룰 삭제

룰을 지우려면 nft delete rule을 이용하며 handle 번호를 지정합니다. 

salsal@r3:~$ sudo nft delete rule ip filter output handle 9

salsal@r3:~$ sudo nft -a list chain ip filter output
table ip filter {
	chain output {
		type filter hook output priority 0; policy accept;
		ip daddr 8.8.8.8 counter packets 2 bytes 168 # handle 6
		ip daddr 10.10.20.20 counter packets 0 bytes 0 # handle 10
		ip daddr 10.10.10.10 counter packets 3 bytes 252 # handle 7
		ip daddr 10.100.100.100 counter packets 1 bytes 84 # handle 8
	}
}

handle 번호 대신 입력된 rule 그대로를 지우는 기능은 아직 (2021년8월) 이용할 수 없으나, 지원될 예정인 듯 합니다. 

# 삭제할 때 지원하지 않는 형태 
#
# nft delete rule ip filter output ip daddr 10.10.20.20 counter

salsal@r3:~$ sudo nft delete rule ip filter output ip daddr 10.10.20.20 counter
Error: syntax error, unexpected ip, expecting handle
delete rule ip filter output ip daddr 10.10.20.20 counter
                             ^^

체인에 있는 모든 룰 삭제

# flush ruleset을 이용할 수 있습니다. 
# table, chain을 모두 지웁니다. 

salsal@r3:~$ sudo nft list ruleset
table ip filter {
	chain output {
		type filter hook output priority 0; policy accept;
		ip daddr 17.7.7.7 counter packets 0 bytes 0
		ip daddr 16.6.6.6 counter packets 0 bytes 0
		ip daddr 19.9.9.9 counter packets 0 bytes 0
	}
}
salsal@r3:~$ sudo nft flush ruleset
salsal@r3:~$ sudo nft list ruleset
salsal@r3:~$

## table을 지정해 flush할 수도 있습니다. 
# chain 안의 rule만 지웁니다. 

salsal@r3:~$ sudo nft -a list chain ip filter output
table ip filter {
	chain output {
		type filter hook output priority 0; policy accept;
		ip daddr 8.8.8.8 counter packets 2 bytes 168 # handle 6
		ip daddr 10.10.20.20 counter packets 0 bytes 0 # handle 10
		ip daddr 10.10.10.10 counter packets 3 bytes 252 # handle 7
		ip daddr 10.100.100.100 counter packets 1 bytes 84 # handle 8
	}
}

salsal@r3:~$ sudo nft flush table ip filter

salsal@r3:~$ sudo nft -a list chain ip filter output
table ip filter {
	chain output {
		type filter hook output priority 0; policy accept;
	}
}

## 아래와 같이 chain을 지정해 flush할 수도 있습니다. 
# chain 안의 rule만 지웁니다. 

salsal@r3:~$ sudo nft add rule ip filter output ip daddr 8.8.8.8 counter packets 0
salsal@r3:~$ sudo nft add rule ip filter output ip daddr 9.9.9.9 counter packets 0
salsal@r3:~$ sudo nft list chain ip filter output
table ip filter {
	chain output {
		type filter hook output priority 0; policy accept;
		ip daddr 8.8.8.8 counter packets 0 bytes 0
		ip daddr 9.9.9.9 counter packets 0 bytes 0
	}
}

salsal@r3:~$ sudo nft flush chain ip filter output

salsal@r3:~$ sudo nft list chain ip filter output
table ip filter {
	chain output {
		type filter hook output priority 0; policy accept;
	}
}


salsal@r3:~$ sudo nft flush rule ip filter output
Error: syntax error, unexpected rule
flush rule ip filter output
      ^^^^
salsal@r3:~$ sudo nft flush rule  filter output
Error: syntax error, unexpected rule
flush rule filter output
      ^^^^

룰을 맨 앞에 추가하기 (prepend)

nft insert rule을 이용하며 position을 지정하지 않으면 됩니다. 

salsal@r3:~$ sudo nft list chain ip filter output
table ip filter {
	chain output {
		type filter hook output priority 0; policy accept;
		ip daddr 8.8.8.8 counter packets 0 bytes 0
		ip daddr 9.9.9.9 counter packets 0 bytes 0
	}
}

salsal@r3:~$ sudo nft insert rule ip filter output ip daddr 7.7.7.7 counter packets 0

salsal@r3:~$ sudo nft list chain ip filter output
table ip filter {
	chain output {
		type filter hook output priority 0; policy accept;
		ip daddr 7.7.7.7 counter packets 0 bytes 0
		ip daddr 8.8.8.8 counter packets 0 bytes 0
		ip daddr 9.9.9.9 counter packets 0 bytes 0
	}
}

룰 변경하기 (replace)

nft replace rule을 이용하면 되며, 변경 대상 rule의 handle 번호를 지정해야 합니다. 

salsal@r3:~$ sudo nft list chain ip filter output -a
table ip filter {
	chain output {
		type filter hook output priority 0; policy accept;
		ip daddr 7.7.7.7 counter packets 0 bytes 0 # handle 15
		ip daddr 8.8.8.8 counter packets 0 bytes 0 # handle 13
		ip daddr 9.9.9.9 counter packets 0 bytes 0 # handle 14
	}
}

salsal@r3:~$ sudo nft replace rule ip filter output handle 13 ip daddr 6.6.6.6 counter packets 0

salsal@r3:~$ sudo nft list chain ip filter output -a
table ip filter {
	chain output {
		type filter hook output priority 0; policy accept;
		ip daddr 7.7.7.7 counter packets 0 bytes 0 # handle 15
		ip daddr 6.6.6.6 counter packets 0 bytes 0 # handle 13
		ip daddr 9.9.9.9 counter packets 0 bytes 0 # handle 14
	}
}

 

이전 글: 체인 설정 / Configuring chains

다음 글: 순식간에 많은 룰 변경 / Atomic rule replacement

'nftables' 카테고리의 다른 글

명령어에서 오류 출력  (0) 2021.08.06
순식간에 많은 룰 변경 / Atomic rule replacement  (0) 2021.08.05
체인 설정 / Configuring chains  (0) 2021.08.05
Ubuntu nftables 설치  (0) 2021.08.05
테이블 설정 / configuring tables  (0) 2021.08.05