• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/bin/sh
2# SPDX-License-Identifier: GPL-2.0-or-later
3# Copyright (c) 2018 Oracle and/or its affiliates. All Rights Reserved.
4# Copyright (c) International Business Machines  Corp., 2001
5#
6#  Author:	Jan 20 2004 Hubert Lin <linux02NOSPAAAM@tw.ibm.com>
7#				       <hubertNOSPAAAM@symbio.com.tw>
8
9TST_CNT=6
10TST_SETUP="init"
11TST_TESTFUNC="test"
12TST_CLEANUP="cleanup"
13TST_NEEDS_TMPDIR=1
14TST_NEEDS_ROOT=1
15TST_NEEDS_CMDS="iptables grep ping telnet"
16
17. tst_test.sh
18
19init()
20{
21	tst_res TINFO "INIT: Inititalizing tests."
22
23	modprobe ip_tables
24	if [ $? -ne 0 ]; then
25		iptables -L > tst_iptables.out 2>&1
26		if [ $? -ne 0 ]; then
27			tst_brk TCONF "no iptables support in kernel."
28		fi
29	fi
30
31	tst_res TINFO "INIT: Flushing all rules."
32	iptables -F -t filter > tst_iptables.out 2>&1
33	iptables -F -t nat > tst_iptables.out 2>&1
34	iptables -F -t mangle > tst_iptables.out 2>&1
35}
36
37cleanup()
38{
39	lsmod | grep "ip_tables" > tst_iptables.out 2>&1
40	if [ $? -eq 0 ]; then
41		iptables -F -t filter > tst_iptables.out 2>&1
42		iptables -F -t nat > tst_iptables.out 2>&1
43		iptables -F -t mangle > tst_iptables.out 2>&1
44		rmmod -v ipt_limit ipt_multiport ipt_LOG ipt_REJECT \
45			 iptable_mangle iptable_nat ip_conntrack \
46			 iptable_filter ip_tables nf_nat_ipv4 nf_nat \
47			 nf_log_ipv4 nf_log_common nf_reject_ipv4 \
48			 nf_conntrack_ipv4 nf_defrag_ipv4 nf_conntrack \
49			 > tst_iptables.out 2>&1
50	fi
51}
52
53test1()
54{
55	local chaincnt=0
56
57	local cmd="iptables -L -t filter"
58	tst_res TINFO "$cmd will list all rules in table filter."
59	$cmd > tst_iptables.out 2>&1
60	if [ $? -ne 0 ]; then
61		tst_res TFAIL "$cmd failed to list rules."
62		cat tst_iptables.out
63		return
64	else
65		chaincnt=$(grep -c Chain tst_iptables.out)
66		if [ $chaincnt -lt 3 ]; then
67			tst_res TFAIL "$cmd failed to list rules."
68			cat tst_iptables.out
69			return
70		else
71			tst_res TINFO "$cmd lists rules."
72		fi
73	fi
74
75	local cmd="iptables -L -t nat"
76	tst_res TINFO "$cmd will list all rules in table nat."
77	$cmd > tst_iptables.out 2>&1
78	if [ $? -ne 0 ]; then
79		tst_res TFAIL "$cmd failed to list rules."
80		cat tst_iptables.out
81		return
82	else
83		chaincnt=$(grep -c Chain tst_iptables.out)
84		if [ $chaincnt -lt 3 ]; then
85			tst_res TFAIL "$cmd failed to list rules."
86			cat tst_iptables.out
87			return
88		else
89			tst_res TINFO "$cmd lists rules."
90		fi
91	fi
92
93	local cmd="iptables -L -t mangle"
94	tst_res TINFO "$cmd will list all rules in table mangle."
95	$cmd > tst_iptables.out 2>&1
96	if [ $? -ne 0 ]; then
97		tst_res TFAIL "$cmd failed to list rules."
98		cat tst_iptables.out
99		return
100	else
101		chaincnt=$(grep -c Chain tst_iptables.out)
102		if [ $chaincnt -lt 5 ]; then
103			tst_res TFAIL "$cmd failed to list rules."
104			cat tst_iptables.out
105		else
106			tst_res TINFO "$cmd lists rules."
107		fi
108	fi
109
110	tst_res TPASS "iptables -L lists rules."
111}
112
113test2()
114{
115	tst_res TINFO "Use iptables to DROP packets from particular IP"
116	tst_res TINFO "Rule to block icmp from 127.0.0.1"
117
118	iptables -A INPUT -s 127.0.0.1 -p icmp -j DROP > tst_iptables.out 2>&1
119	if [ $? -ne 0 ]; then
120		tst_res TFAIL "iptables command failed to append new rule."
121		cat tst_iptables.out
122		return
123	fi
124
125	tst_res TINFO "Pinging 127.0.0.1"
126	ping -c 2 127.0.0.1 > tst_iptables.out 2>&1
127	if [ $? -ne 0 ]; then
128		grep "100% packet loss" tst_iptables.out > tst_iptables.err 2>&1
129		if [ $? -ne 0 ]; then
130			tst_res TFAIL \
131				 "iptables did not block packets from loopback"
132			cat tst_iptables.err
133			return
134		else
135			tst_res TINFO "Ping 127.0.0.1 not successful."
136		fi
137	else
138		tst_res TFAIL "iptables did not block icmp from 127.0.0.1"
139		cat tst_iptables.out
140		return
141	fi
142
143	tst_res TINFO "Deleting icmp DROP from 127.0.0.1 rule."
144	iptables -D INPUT 1 > tst_iptables.out 2>&1
145	if [ $? -ne 0 ]; then
146		tst_res TFAIL "iptables did not remove the rule."
147		cat tst_iptables.out
148		return
149	fi
150	tst_res TINFO "Pinging 127.0.0.1 again"
151	ping -c 2 127.0.0.1 > tst_iptables.out 2>&1
152	if [ $? -ne 0 ]; then
153		tst_res TFAIL "iptables blocking loopback. This is expected" \
154			       "behaviour on certain distributions where" \
155			       "enabling firewall drops all packets by default."
156		cat tst_iptables.out
157		return
158	fi
159	tst_res TINFO "Ping succsess"
160	tst_res TPASS "iptables can DROP packets from particular IP."
161}
162
163test3()
164{
165	tst_res TINFO "Use iptables to REJECT ping request."
166	tst_res TINFO "Rule to reject ping request."
167
168	iptables -A INPUT -p icmp --icmp-type echo-request -d 127.0.0.1 -j \
169		 REJECT > tst_iptables.out 2>&1
170	if [ $? -ne 0 ]; then
171		tst_res TFAIL "iptables command failed to append new rule."
172		cat tst_iptables.out
173		return
174	fi
175
176	tst_res TINFO "Pinging 127.0.0.1"
177	ping -c 2 127.0.0.1 > tst_iptables.out 2>&1
178	if [ $? -ne 0 ]; then
179		grep "100% packet loss" tst_iptables.out > tst_iptables.err 2>&1
180		if [ $? -ne 0 ]; then
181			tst_res TFAIL "iptables did not block ping request."
182			cat tst_iptables.err
183			return
184		else
185			tst_res TINFO "Ping 127.0.0.1 not successful."
186		fi
187	else
188		tst_res TFAIL "iptables did not reject ping request."
189		cat tst_iptables.out
190		return
191	fi
192
193	tst_res TINFO "Deleting icmp request REJECT rule."
194	iptables -D INPUT 1 > tst_iptables.out 2>&1
195	if [ $? -ne 0 ]; then
196		tst_res TFAIL "iptables did not remove the rule."
197		cat tst_iptables.out
198		return
199	fi
200	tst_res TINFO "Pinging 127.0.0.1 again"
201	ping -c 2 127.0.0.1 > tst_iptables.out 2>&1
202	if [ $? -ne 0 ]; then
203		tst_res TFAIL "iptables blocking ping requests. This is" \
204			      "expected behaviour on certain distributions" \
205			      "where enabling firewall drops all packets by" \
206			      "default."
207		cat tst_iptables.out
208		return
209	fi
210	tst_res TINFO "Ping succsess"
211	tst_res TPASS "iptables can REJECT ping requests."
212}
213
214test4()
215{
216	local dport=45886
217	local logprefix="${TCID}$(date +%m%d%H%M%S):"
218
219	tst_res TINFO "Use iptables to log packets to particular port."
220	tst_res TINFO "Rule to log tcp packets to particular port."
221
222	iptables -A INPUT -p tcp -d 127.0.0.1 --dport $dport -j LOG \
223		 --log-prefix "$logprefix" > tst_iptables.out 2>&1
224	if [ $? -ne 0 ]; then
225		tst_res TFAIL "iptables command failed to append new rule."
226		cat tst_iptables.out
227		return
228	fi
229
230	tst_res TINFO "telnet 127.0.0.1 $dport"
231	telnet 127.0.0.1 $dport > tst_iptables.out 2>&1
232	if [ $? -ne 0 ]; then
233		sleep 2
234		dmesg | grep "$logprefix" > tst_iptables.err 2>&1
235		if [ $? -ne 0 ]; then
236			tst_res TFAIL \
237				 "iptables did not log packets to port $dport"
238			cat tst_iptables.err
239			return
240		else
241			tst_res TINFO "Packets to port $dport logged."
242		fi
243	else
244		tst_res TFAIL "telnet to 127.0.0.1 $dport should fail."
245		cat tst_iptables.out
246		return
247	fi
248
249	tst_res TINFO "Deleting the rule to log."
250	iptables -D INPUT 1 > tst_iptables.out 2>&1
251	if [ $? -ne 0 ]; then
252		tst_res TFAIL "iptables did not remove the rule."
253		cat tst_iptables.out
254		return
255	fi
256	tst_res TINFO "iptables logging succsess"
257	tst_res TPASS "iptables can log packets to particular port."
258}
259
260test5()
261{
262	local dport=0
263	local logprefix="${TCID}$(date +%m%d%H%M%S):"
264
265	tst_res TINFO "Use iptables to log packets to multiple ports."
266	tst_res TINFO "Rule to log tcp packets to port 45801 - 45803."
267	iptables -A INPUT -p tcp -d 127.0.0.1 --dport 45801:45803 -j LOG \
268		 --log-prefix "$logprefix" > tst_iptables.out 2>&1
269	if [ $? -ne 0 ]; then
270		tst_res TFAIL "iptables command failed to append new rule."
271		cat tst_iptables.out
272		return
273	fi
274
275	tst_res TINFO "Rule to log tcp packets to port 45804 - 45806."
276	iptables -A INPUT -p tcp -d 127.0.0.1 -m multiport --dports \
277		 45804,45806,45805 -j LOG --log-prefix "$logprefix" \
278		 > tst_iptables.out 2>&1
279	if [ $? -ne 0 ]; then
280		tst_res TFAIL "iptables command failed to append new rule."
281		cat tst_iptables.out
282		return
283	fi
284
285	for dport in 45801 45802 45803 45804 45805 45806; do
286		tst_res TINFO "telnet 127.0.0.1 $dport"
287		telnet 127.0.0.1 $dport > tst_iptables.out 2>&1
288		if [ $? -ne 0 ]; then
289			sleep 2
290			dmesg | grep "$logprefix" | grep "=$dport " \
291				> tst_iptables.err 2>&1
292			if [ $? -ne 0 ]; then
293				tst_res TFAIL "iptables did not log packets" \
294					       "to port $dport"
295				cat tst_iptables.err
296				return
297			else
298				tst_res TINFO "Packets to port $dport logged."
299			fi
300		else
301			tst_res TFAIL "telnet to 127.0.0.1 $dport should fail."
302			cat tst_iptables.out
303			return
304		fi
305	done
306
307	tst_res TINFO "Flushing all rules."
308	iptables -F > tst_iptables.out 2>&1
309	if [ $? -ne 0 ]; then
310		tst_res TFAIL "iptables did not flush all rules."
311		cat tst_iptables.out
312		return
313	fi
314	tst_res TINFO "iptables logging succsess"
315	tst_res TPASS "iptables can log packets to multiple ports."
316}
317
318test6()
319{
320	local logcnt=0
321	local logprefix="${TCID}$(date +%m%d%H%M%S):"
322
323	tst_res TINFO "Use iptables to log ping request with limited rate."
324	tst_res TINFO "Rule to log ping request."
325
326	iptables -A INPUT -p icmp --icmp-type echo-request -d 127.0.0.1 -m \
327		 limit -j LOG --log-prefix "$logprefix" > tst_iptables.out 2>&1
328	if [ $? -ne 0 ]; then
329		tst_res TFAIL "iptables command failed to append new rule."
330		cat tst_iptables.out
331		return
332	fi
333
334	tst_res TINFO "ping 127.0.0.1"
335	ping -c 10 127.0.0.1 > tst_iptables.out 2>&1
336	if [ $? -eq 0 ]; then
337		sleep 2
338		logcnt=$(dmesg | grep -c "$logprefix")
339		if [ $logcnt -ne 5 ]; then
340			tst_res TFAIL "iptables did not log packets with" \
341				      "limited rate."
342			cat tst_iptables.out
343			return
344		else
345			tst_res TINFO "ping requests logged with limited rate."
346		fi
347	else
348		tst_res TFAIL "ping to 127.0.0.1 failed. This is expected" \
349			      "behaviour on certain distributions where" \
350			      "enabling firewall drops all packets by default."
351		cat tst_iptables.out
352		return
353	fi
354
355	tst_res TINFO "Deleting the rule to log."
356	iptables -D INPUT 1 > tst_iptables.out 2>&1
357	if [ $? -ne 0 ]; then
358		tst_res TFAIL "iptables did not remove the rule."
359		cat tst_iptables.out
360		return
361	fi
362	tst_res TINFO "iptables limited logging succsess"
363	tst_res TPASS "iptables can log packets with limited rate."
364}
365
366tst_run
367