2 # SPDX-License-Identifier: GPL-2.0
4 # Check that audit logs generated for nft commands are as expected.
9 nft --version >/dev/null 2>&1 || {
10 echo "SKIP: missing nft tool"
14 # Run everything in a separate network namespace
15 [ "${1}" != "run" ] && { unshare -n "${0}" run; exit $?; }
17 # give other scripts a chance to finish - audit_logread sees all activity
22 echo "logging into $logfile"
23 ./audit_logread >"$logfile" &
25 trap 'kill $logread_pid; rm -f $logfile $rulefile' EXIT
28 do_test() { # (cmd, log)
29 echo -n "testing for cmd: $1 ... "
31 $1 >/dev/null || exit 1
33 res=$(diff -a -u <(echo "$2") - <&3)
34 [ $? -eq 0 ] && { echo "OK"; return; }
36 grep -v '^\(---\|+++\|@@\)' <<< "$res"
42 # adding tables, chains and rules
44 for table in t1 t2; do
45 do_test "nft add table $table" \
46 "table=$table family=2 entries=1 op=nft_register_table"
48 do_test "nft add chain $table c1" \
49 "table=$table family=2 entries=1 op=nft_register_chain"
51 do_test "nft add chain $table c2; add chain $table c3" \
52 "table=$table family=2 entries=2 op=nft_register_chain"
54 cmd="add rule $table c1 counter"
57 "table=$table family=2 entries=1 op=nft_register_rule"
59 do_test "nft $cmd; $cmd" \
60 "table=$table family=2 entries=2 op=nft_register_rule"
64 for chain in c2 c3; do
66 cmd+="$sep add rule $table $chain counter"
71 "table=$table family=2 entries=6 op=nft_register_rule"
74 for ((i = 0; i < 500; i++)); do
75 echo "add rule t2 c3 counter accept comment \"rule $i\""
77 do_test "nft -f $rulefile" \
78 'table=t2 family=2 entries=500 op=nft_register_rule'
80 # adding sets and elements
82 settype='type inet_service; counter'
83 setelem='{ 22, 80, 443 }'
84 setblock="{ $settype; elements = $setelem; }"
85 do_test "nft add set t1 s $setblock" \
86 "table=t1 family=2 entries=4 op=nft_register_set"
88 do_test "nft add set t1 s2 $setblock; add set t1 s3 { $settype; }" \
89 "table=t1 family=2 entries=5 op=nft_register_set"
91 do_test "nft add element t1 s3 $setelem" \
92 "table=t1 family=2 entries=3 op=nft_register_setelem"
96 do_test 'nft add counter t1 c1' \
97 'table=t1 family=2 entries=1 op=nft_register_obj'
99 do_test 'nft add counter t2 c1; add counter t2 c2' \
100 'table=t2 family=2 entries=2 op=nft_register_obj'
102 for ((i = 3; i <= 500; i++)); do
103 echo "add counter t2 c$i"
105 do_test "nft -f $rulefile" \
106 'table=t2 family=2 entries=498 op=nft_register_obj'
108 # adding/updating quotas
110 do_test 'nft add quota t1 q1 { 10 bytes }' \
111 'table=t1 family=2 entries=1 op=nft_register_obj'
113 do_test 'nft add quota t2 q1 { 10 bytes }; add quota t2 q2 { 10 bytes }' \
114 'table=t2 family=2 entries=2 op=nft_register_obj'
116 for ((i = 3; i <= 500; i++)); do
117 echo "add quota t2 q$i { 10 bytes }"
119 do_test "nft -f $rulefile" \
120 'table=t2 family=2 entries=498 op=nft_register_obj'
122 # changing the quota value triggers obj update path
123 do_test 'nft add quota t1 q1 { 20 bytes }' \
124 'table=t1 family=2 entries=1 op=nft_register_obj'
128 do_test 'nft reset rules t1 c2' \
129 'table=t1 family=2 entries=3 op=nft_reset_rule'
131 do_test 'nft reset rules table t1' \
132 'table=t1 family=2 entries=3 op=nft_reset_rule
133 table=t1 family=2 entries=3 op=nft_reset_rule
134 table=t1 family=2 entries=3 op=nft_reset_rule'
136 do_test 'nft reset rules t2 c3' \
137 'table=t2 family=2 entries=189 op=nft_reset_rule
138 table=t2 family=2 entries=188 op=nft_reset_rule
139 table=t2 family=2 entries=126 op=nft_reset_rule'
141 do_test 'nft reset rules t2' \
142 'table=t2 family=2 entries=3 op=nft_reset_rule
143 table=t2 family=2 entries=3 op=nft_reset_rule
144 table=t2 family=2 entries=186 op=nft_reset_rule
145 table=t2 family=2 entries=188 op=nft_reset_rule
146 table=t2 family=2 entries=129 op=nft_reset_rule'
148 do_test 'nft reset rules' \
149 'table=t1 family=2 entries=3 op=nft_reset_rule
150 table=t1 family=2 entries=3 op=nft_reset_rule
151 table=t1 family=2 entries=3 op=nft_reset_rule
152 table=t2 family=2 entries=3 op=nft_reset_rule
153 table=t2 family=2 entries=3 op=nft_reset_rule
154 table=t2 family=2 entries=180 op=nft_reset_rule
155 table=t2 family=2 entries=188 op=nft_reset_rule
156 table=t2 family=2 entries=135 op=nft_reset_rule'
158 # resetting sets and elements
163 relem+="${elem[((i - 1))]}"
164 do_test "nft reset element t1 s { $relem }" \
165 "table=t1 family=2 entries=$i op=nft_reset_setelem"
168 do_test 'nft reset set t1 s' \
169 'table=t1 family=2 entries=3 op=nft_reset_setelem'
173 do_test 'nft reset counter t1 c1' \
174 'table=t1 family=2 entries=1 op=nft_reset_obj'
176 do_test 'nft reset counters t1' \
177 'table=t1 family=2 entries=1 op=nft_reset_obj'
179 do_test 'nft reset counters t2' \
180 'table=t2 family=2 entries=342 op=nft_reset_obj
181 table=t2 family=2 entries=158 op=nft_reset_obj'
183 do_test 'nft reset counters' \
184 'table=t1 family=2 entries=1 op=nft_reset_obj
185 table=t2 family=2 entries=341 op=nft_reset_obj
186 table=t2 family=2 entries=159 op=nft_reset_obj'
190 do_test 'nft reset quota t1 q1' \
191 'table=t1 family=2 entries=1 op=nft_reset_obj'
193 do_test 'nft reset quotas t1' \
194 'table=t1 family=2 entries=1 op=nft_reset_obj'
196 do_test 'nft reset quotas t2' \
197 'table=t2 family=2 entries=315 op=nft_reset_obj
198 table=t2 family=2 entries=185 op=nft_reset_obj'
200 do_test 'nft reset quotas' \
201 'table=t1 family=2 entries=1 op=nft_reset_obj
202 table=t2 family=2 entries=314 op=nft_reset_obj
203 table=t2 family=2 entries=186 op=nft_reset_obj'
207 readarray -t handles < <(nft -a list chain t1 c1 | \
208 sed -n 's/.*counter.* handle \(.*\)$/\1/p')
210 do_test "nft delete rule t1 c1 handle ${handles[0]}" \
211 'table=t1 family=2 entries=1 op=nft_unregister_rule'
213 cmd='delete rule t1 c1 handle'
214 do_test "nft $cmd ${handles[1]}; $cmd ${handles[2]}" \
215 'table=t1 family=2 entries=2 op=nft_unregister_rule'
217 do_test 'nft flush chain t1 c2' \
218 'table=t1 family=2 entries=3 op=nft_unregister_rule'
220 do_test 'nft flush table t2' \
221 'table=t2 family=2 entries=509 op=nft_unregister_rule'
225 do_test 'nft delete chain t2 c2' \
226 'table=t2 family=2 entries=1 op=nft_unregister_chain'
228 # deleting sets and elements
230 do_test 'nft delete element t1 s { 22 }' \
231 'table=t1 family=2 entries=1 op=nft_unregister_setelem'
233 do_test 'nft delete element t1 s { 80, 443 }' \
234 'table=t1 family=2 entries=2 op=nft_unregister_setelem'
236 do_test 'nft flush set t1 s2' \
237 'table=t1 family=2 entries=3 op=nft_unregister_setelem'
239 do_test 'nft delete set t1 s2' \
240 'table=t1 family=2 entries=1 op=nft_unregister_set'
242 do_test 'nft delete set t1 s3' \
243 'table=t1 family=2 entries=1 op=nft_unregister_set'