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
'nftables' 카테고리의 다른 글
Output text modifier (0) | 2021.08.06 |
---|---|
룰셋 Ruleset debug/tracing (0) | 2021.08.06 |
룰셋 갱신 지켜보기 / Monitoring ruleset updates (0) | 2021.08.06 |
룰셋 레벨 명령 / Operations at ruleset level (0) | 2021.08.06 |
룰 표현 / Building rules through expressions (0) | 2021.08.06 |