본문 바로가기

nftables

Scripting

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

이전 글: 룰셋 갱신 지켜보기 / Monitoring ruleset updates

다음 글: 룰셋 Ruleset debug/tracing

 

많은 사람들이 ruleset을 shell script 안에 저장하고 관리하기를 원합니다. 설명하는 글을 남겨 놓거나, 보기 편하기 때문입니다. 그러나 Shell Script는 순식간에 많은 룰 변경 / Atomic rule replacement에서 설명한 Atomicity를 방해합니다.  nftables은 scripting과 atomicity 둘 다를 만족시킬 수 있는 script 환경을 제공합니다. rule을 담은 파일을 읽어 들이면 됩니다. 

 

% nft -f rule-set-file

 

설명 추가

rule-set-file에 shell script처럼 # 뒤에 설명을 추가하면 됩니다. 

#!/usr/sbin/nft -f

#
# table declaration
#
add table filter

#
# chain declaration
#
add chain filter input { type filter hook input priority 0; policy drop; }

#
# rule declaration
#
add rule filter input ct state established,related counter accept

파일 포함

rule-set-file 안에서 include를 이용하여 다른 파일 내용을 읽어 들여 이용할 수 있습니다. 

#!/usr/sbin/nft -f

# include a single file using the default search path
include "ipv4-nat.ruleset"

# include all files ending in *.nft in the default search path
include "*.nft"

# include all files in a given directory using an absolute path
include "/etc/nftables/"

변수 정의

rule-set-file 안에서 define을 이용하여 변수를 정의하여 사용할 수 있습니다. 

#!/usr/sbin/nft -f

define google_dns = 8.8.8.8

add table filter
add chain filter input { type filter hook input priority 0; }
add rule filter input ip saddr $google_dns counter

집합을 위한 변수도 정의하여 이용할 수 있습니다. 

#!/usr/sbin/nft -f

define ntp_servers = { 84.77.40.132, 176.31.53.99, 81.19.96.148, 138.100.62.8 }

add table filter
add chain filter input { type filter hook input priority 0; }
add rule filter input ip saddr $ntp_servers counter

1개 값을 가지는 집합을 사용하는 것은 추천하지 않습니다. 

# 이런 형태는 비추
define google_dns = { 8.8.8.8 }

# 이런 형태 추천
define google_dns = 8.8.8.8

rule-set-file 형태

nftables output format, scripted config format 2개를 지원합니다. 

 

nftables output format

#!/usr/sbin/nft -f

define ntp_servers = { 84.77.40.132, 176.31.53.99, 81.19.96.148, 138.100.62.8 }

#flush table nat
table ip nat {
	chain prerouting {
		type filter hook prerouting priority 0; policy accept;
                ip saddr $ntp_servers counter
	}

	chain postrouting {
		type filter hook postrouting priority 100; policy accept;
	}
}

 

scripted config format

#!/usr/sbin/nft -f

define ntp_servers = { 84.77.40.132, 176.31.53.99, 81.19.96.148, 138.100.62.8 }

add table filter
add chain filter input { type filter hook input priority 0; }
add rule filter input ip saddr $ntp_servers counter

 

2가지 format을 다 이용해도 됩니다. 

salsal@r3:~$ cat nft.txt
#!/usr/sbin/nft -f

define ntp_servers = { 84.77.40.132, 176.31.53.99, 81.19.96.148, 138.100.62.8 }

flush ruleset

table ip nat {
	chain prerouting {
		type filter hook prerouting priority 0; policy accept;
                ip saddr $ntp_servers counter
	}

	chain postrouting {
		type filter hook postrouting priority 100; policy accept;
	}
}
add rule ip nat prerouting ip daddr 8.8.8.8 counter

salsal@r3:~$ sudo nft -f nft.txt

salsal@r3:~$ sudo nft list ruleset
table ip nat {
	chain prerouting {
		type filter hook prerouting priority 0; policy accept;
		ip saddr { 81.19.96.148, 84.77.40.132, 138.100.62.8, 176.31.53.99 } counter packets 0 bytes 0
		ip daddr 8.8.8.8 counter packets 0 bytes 0
	}

	chain postrouting {
		type filter hook postrouting priority 100; policy accept;
	}
}

 

Python

 

이전 글: 룰셋 갱신 지켜보기 / Monitoring ruleset updates

다음 글: 룰셋 Ruleset debug/tracing