t_ipsec_pfil.sh revision 1.1 1 1.1 knakahar # $NetBSD: t_ipsec_pfil.sh,v 1.1 2019/01/17 02:49:11 knakahara Exp $
2 1.1 knakahar #
3 1.1 knakahar # Copyright (c) 2019 Internet Initiative Japan Inc.
4 1.1 knakahar # All rights reserved.
5 1.1 knakahar #
6 1.1 knakahar # Redistribution and use in source and binary forms, with or without
7 1.1 knakahar # modification, are permitted provided that the following conditions
8 1.1 knakahar # are met:
9 1.1 knakahar # 1. Redistributions of source code must retain the above copyright
10 1.1 knakahar # notice, this list of conditions and the following disclaimer.
11 1.1 knakahar # 2. Redistributions in binary form must reproduce the above copyright
12 1.1 knakahar # notice, this list of conditions and the following disclaimer in the
13 1.1 knakahar # documentation and/or other materials provided with the distribution.
14 1.1 knakahar #
15 1.1 knakahar # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
16 1.1 knakahar # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
17 1.1 knakahar # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
18 1.1 knakahar # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
19 1.1 knakahar # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20 1.1 knakahar # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21 1.1 knakahar # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22 1.1 knakahar # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23 1.1 knakahar # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24 1.1 knakahar # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25 1.1 knakahar # POSSIBILITY OF SUCH DAMAGE.
26 1.1 knakahar #
27 1.1 knakahar
28 1.1 knakahar SOCK_ROUTER1=unix://router1
29 1.1 knakahar SOCK_ROUTER2=unix://router2
30 1.1 knakahar ROUTER1_LANIP=192.168.1.1
31 1.1 knakahar ROUTER1_LANNET=192.168.1.0/24
32 1.1 knakahar ROUTER1_WANIP=10.0.0.1
33 1.1 knakahar ROUTER1_IPSECIP=172.16.1.1
34 1.1 knakahar ROUTER2_LANIP=192.168.2.1
35 1.1 knakahar ROUTER2_LANNET=192.168.2.0/24
36 1.1 knakahar ROUTER2_WANIP=10.0.0.2
37 1.1 knakahar ROUTER2_IPSECIP=172.16.2.1
38 1.1 knakahar
39 1.1 knakahar DEBUG=${DEBUG:-false}
40 1.1 knakahar TIMEOUT=7
41 1.1 knakahar HIJACKING_NPF="${HIJACKING},blanket=/dev/npf"
42 1.1 knakahar
43 1.1 knakahar setup_router()
44 1.1 knakahar {
45 1.1 knakahar local sock=$1
46 1.1 knakahar local lan=$2
47 1.1 knakahar local wan=$3
48 1.1 knakahar
49 1.1 knakahar rump_server_add_iface $sock shmif0 bus0
50 1.1 knakahar rump_server_add_iface $sock shmif1 bus1
51 1.1 knakahar
52 1.1 knakahar export RUMP_SERVER=${sock}
53 1.1 knakahar atf_check -s exit:0 rump.sysctl -q -w net.inet.ip.dad_count=0
54 1.1 knakahar
55 1.1 knakahar atf_check -s exit:0 rump.ifconfig shmif0 inet ${lan} netmask 0xffffff00
56 1.1 knakahar atf_check -s exit:0 rump.ifconfig shmif0 up
57 1.1 knakahar # Ensure shmif0 is running
58 1.1 knakahar atf_check -s exit:0 -o ignore rump.ping -n -c 1 -w $TIMEOUT ${lan}
59 1.1 knakahar $DEBUG && rump.ifconfig shmif0
60 1.1 knakahar
61 1.1 knakahar atf_check -s exit:0 rump.ifconfig shmif1 inet ${wan} netmask 0xff000000
62 1.1 knakahar atf_check -s exit:0 rump.ifconfig shmif1 up
63 1.1 knakahar # Ensure shmif1 is running
64 1.1 knakahar atf_check -s exit:0 -o ignore rump.ping -n -c 1 -w $TIMEOUT ${wan}
65 1.1 knakahar $DEBUG && rump.ifconfig shmif1
66 1.1 knakahar
67 1.1 knakahar unset RUMP_SERVER
68 1.1 knakahar }
69 1.1 knakahar
70 1.1 knakahar setup_if_ipsec()
71 1.1 knakahar {
72 1.1 knakahar local addr=$1
73 1.1 knakahar local remote=$2
74 1.1 knakahar local src=$3
75 1.1 knakahar local dst=$4
76 1.1 knakahar local peernet=$5
77 1.1 knakahar
78 1.1 knakahar atf_check -s exit:0 rump.ifconfig ipsec0 create
79 1.1 knakahar atf_check -s exit:0 rump.ifconfig ipsec0 tunnel $src $dst
80 1.1 knakahar atf_check -s exit:0 rump.ifconfig ipsec0 inet ${addr}/32 $remote
81 1.1 knakahar atf_check -s exit:0 -o ignore rump.route add -inet $peernet $addr
82 1.1 knakahar
83 1.1 knakahar $DEBUG && rump.ifconfig ipsec0
84 1.1 knakahar $DEBUG && rump.route -nL show -inet
85 1.1 knakahar }
86 1.1 knakahar
87 1.1 knakahar get_if_ipsec_unique()
88 1.1 knakahar {
89 1.1 knakahar local src=$1
90 1.1 knakahar local proto=$2
91 1.1 knakahar local unique=""
92 1.1 knakahar
93 1.1 knakahar unique=`$HIJACKING setkey -DP | grep -A2 "^${src}.*(${proto})$" | grep unique | sed 's/.*unique#//'`
94 1.1 knakahar
95 1.1 knakahar echo $unique
96 1.1 knakahar }
97 1.1 knakahar
98 1.1 knakahar setup_if_ipsec_sa()
99 1.1 knakahar {
100 1.1 knakahar local src=$1
101 1.1 knakahar local dst=$2
102 1.1 knakahar local inid=$3
103 1.1 knakahar local outid=$4
104 1.1 knakahar local proto=$5
105 1.1 knakahar local algo=$6
106 1.1 knakahar
107 1.1 knakahar local tmpfile=./tmp
108 1.1 knakahar local inunique=""
109 1.1 knakahar local outunique=""
110 1.1 knakahar local algo_args="$(generate_algo_args $proto $algo)"
111 1.1 knakahar
112 1.1 knakahar inunique=`get_if_ipsec_unique $dst "ipv4"`
113 1.1 knakahar atf_check -s exit:0 test "X$inunique" != "X"
114 1.1 knakahar outunique=`get_if_ipsec_unique $src "ipv4"`
115 1.1 knakahar atf_check -s exit:0 test "X$outunique" != "X"
116 1.1 knakahar
117 1.1 knakahar cat > $tmpfile <<-EOF
118 1.1 knakahar add $dst $src $proto $inid -u $inunique $algo_args;
119 1.1 knakahar add $src $dst $proto $outid -u $outunique $algo_args;
120 1.1 knakahar EOF
121 1.1 knakahar $DEBUG && cat $tmpfile
122 1.1 knakahar atf_check -s exit:0 -o empty $HIJACKING setkey -c < $tmpfile
123 1.1 knakahar $DEBUG && $HIJACKING setkey -D
124 1.1 knakahar $DEBUG && $HIJACKING setkey -DP
125 1.1 knakahar }
126 1.1 knakahar
127 1.1 knakahar setup_tunnel()
128 1.1 knakahar {
129 1.1 knakahar local proto=$1
130 1.1 knakahar local algo=$2
131 1.1 knakahar
132 1.1 knakahar local addr= remote= src= dst= peernet=
133 1.1 knakahar
134 1.1 knakahar export RUMP_SERVER=$SOCK_ROUTER1
135 1.1 knakahar addr=$ROUTER1_IPSECIP
136 1.1 knakahar remote=$ROUTER2_IPSECIP
137 1.1 knakahar src=$ROUTER1_WANIP
138 1.1 knakahar dst=$ROUTER2_WANIP
139 1.1 knakahar peernet=$ROUTER2_LANNET
140 1.1 knakahar setup_if_ipsec $addr $remote $src $dst $peernet
141 1.1 knakahar setup_if_ipsec_sa $src $dst "10000" "10001" $proto $algo
142 1.1 knakahar
143 1.1 knakahar export RUMP_SERVER=$SOCK_ROUTER2
144 1.1 knakahar addr=$ROUTER2_IPSECIP
145 1.1 knakahar remote=$ROUTER1_IPSECIP
146 1.1 knakahar src=$ROUTER2_WANIP
147 1.1 knakahar dst=$ROUTER1_WANIP
148 1.1 knakahar peernet=$ROUTER1_LANNET
149 1.1 knakahar setup_if_ipsec $addr $remote $src $dst $peernet
150 1.1 knakahar setup_if_ipsec_sa $src $dst "10001" "10000" $proto $algo
151 1.1 knakahar
152 1.1 knakahar # Ensure ipsecif(4) settings have completed.
153 1.1 knakahar export RUMP_SERVER=$SOCK_ROUTER1
154 1.1 knakahar atf_check -s exit:0 -o ignore \
155 1.1 knakahar rump.ping -n -w $TIMEOUT -c 1 -I $ROUTER1_LANIP \
156 1.1 knakahar $ROUTER2_LANIP
157 1.1 knakahar
158 1.1 knakahar export RUMP_SERVER=$SOCK_ROUTER2
159 1.1 knakahar atf_check -s exit:0 -o ignore \
160 1.1 knakahar rump.ping -n -w $TIMEOUT -c 1 -I $ROUTER2_LANIP \
161 1.1 knakahar $ROUTER1_LANIP
162 1.1 knakahar
163 1.1 knakahar unset RUMP_SERVER
164 1.1 knakahar }
165 1.1 knakahar
166 1.1 knakahar ipsecif_pfil_setup()
167 1.1 knakahar {
168 1.1 knakahar local proto=$1
169 1.1 knakahar local algo=$2
170 1.1 knakahar
171 1.1 knakahar rump_server_crypto_npf_start $SOCK_ROUTER1 netipsec ipsec
172 1.1 knakahar rump_server_crypto_npf_start $SOCK_ROUTER2 netipsec ipsec
173 1.1 knakahar
174 1.1 knakahar setup_router $SOCK_ROUTER1 $ROUTER1_LANIP $ROUTER1_WANIP
175 1.1 knakahar setup_router $SOCK_ROUTER2 $ROUTER2_LANIP $ROUTER2_WANIP
176 1.1 knakahar
177 1.1 knakahar setup_tunnel $proto $algo
178 1.1 knakahar }
179 1.1 knakahar
180 1.1 knakahar prepare_file()
181 1.1 knakahar {
182 1.1 knakahar local file=$1
183 1.1 knakahar local data="0123456789"
184 1.1 knakahar
185 1.1 knakahar touch $file
186 1.1 knakahar for i in `seq 1 512`
187 1.1 knakahar do
188 1.1 knakahar echo $data >> $file
189 1.1 knakahar done
190 1.1 knakahar }
191 1.1 knakahar
192 1.1 knakahar build_npf_conf()
193 1.1 knakahar {
194 1.1 knakahar local outfile=$1
195 1.1 knakahar local subnet=$2
196 1.1 knakahar local direction=$3
197 1.1 knakahar
198 1.1 knakahar local reverse=
199 1.1 knakahar if [ "X${direction}" = "Xin" ] ; then
200 1.1 knakahar reverse="out"
201 1.1 knakahar else
202 1.1 knakahar reverse="in"
203 1.1 knakahar fi
204 1.1 knakahar
205 1.1 knakahar cat > $outfile <<-EOF
206 1.1 knakahar set bpf.jit off
207 1.1 knakahar \$if = inet4(ipsec0)
208 1.1 knakahar \$subnet = { $subnet }
209 1.1 knakahar
210 1.1 knakahar procedure "log0" {
211 1.1 knakahar log: npflog0
212 1.1 knakahar }
213 1.1 knakahar
214 1.1 knakahar group default {
215 1.1 knakahar block $direction on \$if proto tcp from \$subnet apply "log0"
216 1.1 knakahar pass $reverse on \$if proto tcp from \$subnet
217 1.1 knakahar pass in on \$if proto icmp from 0.0.0.0/0
218 1.1 knakahar pass out on \$if proto icmp from 0.0.0.0/0
219 1.1 knakahar pass final on shmif0 all
220 1.1 knakahar pass final on shmif1 all
221 1.1 knakahar }
222 1.1 knakahar EOF
223 1.1 knakahar }
224 1.1 knakahar
225 1.1 knakahar ipsecif_pfil_test()
226 1.1 knakahar {
227 1.1 knakahar local outfile=./out
228 1.1 knakahar local npffile=./npf.conf
229 1.1 knakahar local file_send=./file.send
230 1.1 knakahar local file_recv=./file.recv
231 1.1 knakahar
232 1.1 knakahar local subnet="172.16.0.0/16"
233 1.1 knakahar
234 1.1 knakahar # Try TCP communications just in case.
235 1.1 knakahar start_nc_server $SOCK_ROUTER2 8888 $file_recv ipv4
236 1.1 knakahar prepare_file $file_send
237 1.1 knakahar export RUMP_SERVER=$SOCK_ROUTER1
238 1.1 knakahar atf_check -s exit:0 $HIJACKING nc -w 3 $ROUTER2_IPSECIP 8888 < $file_send
239 1.1 knakahar atf_check -s exit:0 diff -q $file_send $file_recv
240 1.1 knakahar stop_nc_server
241 1.1 knakahar
242 1.1 knakahar # Setup npf to block *out* direction for ipsecif(4).
243 1.1 knakahar build_npf_conf $npffile $subnet "out"
244 1.1 knakahar $DEBUG && cat $npffile
245 1.1 knakahar
246 1.1 knakahar export RUMP_SERVER=$SOCK_ROUTER1
247 1.1 knakahar atf_check -s exit:0 $HIJACKING_NPF npfctl reload $npffile
248 1.1 knakahar atf_check -s exit:0 $HIJACKING_NPF npfctl start
249 1.1 knakahar $DEBUG && ${HIJACKING},"blanket=/dev/npf" npfctl show
250 1.1 knakahar
251 1.1 knakahar # ping should still work
252 1.1 knakahar export RUMP_SERVER=$SOCK_ROUTER1
253 1.1 knakahar atf_check -s exit:0 -o ignore \
254 1.1 knakahar rump.ping -n -w $TIMEOUT -c 1 -I $ROUTER1_LANIP \
255 1.1 knakahar $ROUTER2_LANIP
256 1.1 knakahar
257 1.1 knakahar export RUMP_SERVER=$SOCK_ROUTER2
258 1.1 knakahar atf_check -s exit:0 -o ignore \
259 1.1 knakahar rump.ping -n -w $TIMEOUT -c 1 -I $ROUTER2_LANIP \
260 1.1 knakahar $ROUTER1_LANIP
261 1.1 knakahar
262 1.1 knakahar # TCP communications should be blocked.
263 1.1 knakahar start_nc_server $SOCK_ROUTER2 8888 $file_recv ipv4
264 1.1 knakahar prepare_file $file_send
265 1.1 knakahar export RUMP_SERVER=$SOCK_ROUTER1
266 1.1 knakahar atf_check -s exit:1 -o ignore $HIJACKING nc -w 3 $ROUTER2_IPSECIP 8888 < $file_send
267 1.1 knakahar stop_nc_server
268 1.1 knakahar
269 1.1 knakahar atf_check -s exit:0 $HIJACKING_NPF npfctl stop
270 1.1 knakahar $DEBUG && ${HIJACKING},"blanket=/dev/npf" npfctl show
271 1.1 knakahar
272 1.1 knakahar # Setup npf to block *in* direction for ipsecif(4).
273 1.1 knakahar build_npf_conf $npffile $subnet "in"
274 1.1 knakahar $DEBUG && cat $npffile
275 1.1 knakahar
276 1.1 knakahar export RUMP_SERVER=$SOCK_ROUTER2
277 1.1 knakahar atf_check -s exit:0 $HIJACKING_NPF npfctl reload $npffile
278 1.1 knakahar atf_check -s exit:0 $HIJACKING_NPF npfctl start
279 1.1 knakahar $DEBUG && ${HIJACKING},"blanket=/dev/npf" npfctl show
280 1.1 knakahar
281 1.1 knakahar # ping should still work.
282 1.1 knakahar export RUMP_SERVER=$SOCK_ROUTER1
283 1.1 knakahar atf_check -s exit:0 -o ignore \
284 1.1 knakahar rump.ping -n -w $TIMEOUT -c 1 -I $ROUTER1_LANIP \
285 1.1 knakahar $ROUTER2_LANIP
286 1.1 knakahar
287 1.1 knakahar export RUMP_SERVER=$SOCK_ROUTER2
288 1.1 knakahar atf_check -s exit:0 -o ignore \
289 1.1 knakahar rump.ping -n -w $TIMEOUT -c 1 -I $ROUTER2_LANIP \
290 1.1 knakahar $ROUTER1_LANIP
291 1.1 knakahar
292 1.1 knakahar # TCP communications should be blocked.
293 1.1 knakahar start_nc_server $SOCK_ROUTER2 8888 $file_recv ipv4
294 1.1 knakahar prepare_file $file_send
295 1.1 knakahar export RUMP_SERVER=$SOCK_ROUTER1
296 1.1 knakahar atf_check -s exit:1 -o ignore $HIJACKING nc -w 3 $ROUTER2_IPSECIP 8888 < $file_send
297 1.1 knakahar stop_nc_server
298 1.1 knakahar
299 1.1 knakahar atf_check -s exit:0 $HIJACKING_NPF npfctl stop
300 1.1 knakahar $DEBUG && ${HIJACKING},"blanket=/dev/npf" npfctl show
301 1.1 knakahar
302 1.1 knakahar
303 1.1 knakahar unset RUMP_SERVER
304 1.1 knakahar }
305 1.1 knakahar
306 1.1 knakahar ipsecif_pfil_teardown()
307 1.1 knakahar {
308 1.1 knakahar
309 1.1 knakahar export RUMP_SERVER=$SOCK_ROUTER1
310 1.1 knakahar atf_check -s exit:0 rump.ifconfig ipsec0 deletetunnel
311 1.1 knakahar atf_check -s exit:0 rump.ifconfig ipsec0 destroy
312 1.1 knakahar $HIJACKING setkey -F
313 1.1 knakahar
314 1.1 knakahar export RUMP_SERVER=$SOCK_ROUTER2
315 1.1 knakahar atf_check -s exit:0 rump.ifconfig ipsec0 deletetunnel
316 1.1 knakahar atf_check -s exit:0 rump.ifconfig ipsec0 destroy
317 1.1 knakahar $HIJACKING setkey -F
318 1.1 knakahar
319 1.1 knakahar unset RUMP_SERVER
320 1.1 knakahar }
321 1.1 knakahar
322 1.1 knakahar add_test()
323 1.1 knakahar {
324 1.1 knakahar local proto=$1
325 1.1 knakahar local algo=$2
326 1.1 knakahar local _algo=$(echo $algo | sed 's/-//g')
327 1.1 knakahar
328 1.1 knakahar name="ipsecif_pfil_${proto}_${_algo}"
329 1.1 knakahar desc="Does ipsecif filter tests"
330 1.1 knakahar
331 1.1 knakahar atf_test_case ${name} cleanup
332 1.1 knakahar eval "${name}_head() {
333 1.1 knakahar atf_set descr \"${desc}\"
334 1.1 knakahar atf_set require.progs rump_server setkey
335 1.1 knakahar }
336 1.1 knakahar ${name}_body() {
337 1.1 knakahar ipsecif_pfil_setup ${proto} ${algo}
338 1.1 knakahar ipsecif_pfil_test
339 1.1 knakahar ipsecif_pfil_teardown
340 1.1 knakahar rump_server_destroy_ifaces
341 1.1 knakahar }
342 1.1 knakahar ${name}_cleanup() {
343 1.1 knakahar \$DEBUG && dump
344 1.1 knakahar cleanup
345 1.1 knakahar }"
346 1.1 knakahar atf_add_test_case ${name}
347 1.1 knakahar }
348 1.1 knakahar
349 1.1 knakahar add_test_allalgo()
350 1.1 knakahar {
351 1.1 knakahar local desc=$1
352 1.1 knakahar
353 1.1 knakahar for algo in $ESP_ENCRYPTION_ALGORITHMS_MINIMUM; do
354 1.1 knakahar add_test esp $algo
355 1.1 knakahar done
356 1.1 knakahar
357 1.1 knakahar # ah does not support yet
358 1.1 knakahar }
359 1.1 knakahar
360 1.1 knakahar atf_init_test_cases()
361 1.1 knakahar {
362 1.1 knakahar
363 1.1 knakahar add_test_allalgo ipsecif_pfil
364 1.1 knakahar }
365