Home | History | Annotate | Line # | Download | only in if_ipsec
t_ipsec_natt.sh revision 1.2.6.1
      1  1.2.6.1    martin #	$NetBSD: t_ipsec_natt.sh,v 1.2.6.1 2020/11/10 11:44:22 martin Exp $
      2      1.1  knakahar #
      3      1.1  knakahar # Copyright (c) 2018 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.2  knakahar SOCK_LOCAL_A=unix://ipsec_natt_local_a
     29      1.2  knakahar SOCK_LOCAL_B=unix://ipsec_natt_local_b
     30      1.1  knakahar SOCK_NAT=unix://ipsec_natt_nat
     31      1.1  knakahar SOCK_REMOTE=unix://ipsec_natt_remote
     32      1.1  knakahar BUS_LOCAL=./bus_ipsec_natt_local
     33      1.1  knakahar BUS_NAT=./bus_ipsec_natt_nat
     34      1.1  knakahar 
     35      1.1  knakahar DEBUG=${DEBUG:-false}
     36      1.1  knakahar 
     37      1.1  knakahar setup_servers()
     38      1.1  knakahar {
     39      1.1  knakahar 
     40      1.2  knakahar 	rump_server_crypto_start $SOCK_LOCAL_A netipsec ipsec
     41      1.2  knakahar 	rump_server_crypto_start $SOCK_LOCAL_B netipsec ipsec
     42      1.1  knakahar 	rump_server_npf_start $SOCK_NAT
     43      1.1  knakahar 	rump_server_crypto_start $SOCK_REMOTE netipsec ipsec
     44      1.2  knakahar 	rump_server_add_iface $SOCK_LOCAL_A shmif0 $BUS_LOCAL
     45      1.2  knakahar 	rump_server_add_iface $SOCK_LOCAL_B shmif0 $BUS_LOCAL
     46      1.1  knakahar 	rump_server_add_iface $SOCK_NAT shmif0 $BUS_LOCAL
     47      1.1  knakahar 	rump_server_add_iface $SOCK_NAT shmif1 $BUS_NAT
     48      1.1  knakahar 	rump_server_add_iface $SOCK_REMOTE shmif0 $BUS_NAT
     49      1.1  knakahar }
     50      1.1  knakahar 
     51      1.1  knakahar setup_ipsecif()
     52      1.1  knakahar {
     53      1.1  knakahar 	local sock=$1
     54      1.1  knakahar 	local ifid=$2
     55      1.1  knakahar 	local src_ip=$3
     56      1.1  knakahar 	local src_port=$4
     57      1.1  knakahar 	local dst_ip=$5
     58      1.1  knakahar 	local dst_port=$6
     59      1.1  knakahar 	local ipsecif_ip=$7
     60      1.1  knakahar 	local peer_ip=$8
     61      1.1  knakahar 
     62      1.1  knakahar 	export RUMP_SERVER=$sock
     63      1.1  knakahar 	atf_check -s exit:0 rump.ifconfig ipsec$ifid create
     64      1.1  knakahar 	atf_check -s exit:0 rump.ifconfig ipsec$ifid link0 # enable NAT-T
     65      1.1  knakahar 	atf_check -s exit:0 rump.ifconfig ipsec$ifid tunnel ${src_ip},${src_port} ${dst_ip},${dst_port}
     66      1.1  knakahar 	atf_check -s exit:0 rump.ifconfig ipsec$ifid ${ipsecif_ip}/32
     67      1.1  knakahar 	atf_check -s exit:0 -o ignore \
     68      1.1  knakahar 	    rump.route -n add ${peer_ip}/32 $ipsecif_ip
     69      1.1  knakahar }
     70      1.1  knakahar 
     71      1.1  knakahar add_sa()
     72      1.1  knakahar {
     73      1.1  knakahar 	local sock=$1
     74      1.1  knakahar 	local proto=$2
     75      1.1  knakahar 	local algo_args="$3"
     76      1.1  knakahar 	local src_ip=$4
     77      1.1  knakahar 	local src_port=$5
     78      1.1  knakahar 	local dst_ip=$6
     79      1.1  knakahar 	local dst_port=$7
     80      1.1  knakahar 	local out_spi=$8
     81      1.1  knakahar 	local in_spi=$9
     82      1.1  knakahar 	local tmpfile=./tmp
     83      1.1  knakahar 
     84      1.1  knakahar 	export RUMP_SERVER=$sock
     85      1.1  knakahar 	cat > $tmpfile <<-EOF
     86      1.1  knakahar 	add $src_ip [$src_port] $dst_ip [$dst_port] $proto $out_spi -m transport $algo_args;
     87      1.1  knakahar 	add $dst_ip [$dst_port] $src_ip [$src_port] $proto $in_spi -m transport $algo_args;
     88      1.1  knakahar 	EOF
     89      1.1  knakahar 	$DEBUG && cat $tmpfile
     90      1.1  knakahar 	atf_check -s exit:0 -o empty $HIJACKING setkey -c < $tmpfile
     91      1.1  knakahar 	# XXX it can be expired if $lifetime is very short
     92      1.1  knakahar 	#check_sa_entries $SOCK_LOCAL $ip_local $ip_remote
     93      1.1  knakahar }
     94      1.1  knakahar 
     95      1.1  knakahar prepare_file()
     96      1.1  knakahar {
     97      1.1  knakahar 	local file=$1
     98      1.1  knakahar 	local data="0123456789"
     99      1.1  knakahar 
    100      1.1  knakahar 	touch $file
    101      1.1  knakahar 	for i in `seq 1 512`
    102      1.1  knakahar 	do
    103      1.1  knakahar 		echo $data >> $file
    104      1.1  knakahar 	done
    105      1.1  knakahar }
    106      1.1  knakahar 
    107      1.1  knakahar build_npf_conf()
    108      1.1  knakahar {
    109      1.1  knakahar 	local outfile=$1
    110      1.1  knakahar 	local localnet=$2
    111      1.1  knakahar 
    112      1.1  knakahar 	cat > $outfile <<-EOF
    113      1.1  knakahar 	set bpf.jit off
    114      1.1  knakahar 	\$int_if = inet4(shmif0)
    115      1.1  knakahar 	\$ext_if = inet4(shmif1)
    116      1.1  knakahar 	\$localnet = { $localnet }
    117      1.1  knakahar 	map \$ext_if dynamic \$localnet -> \$ext_if
    118      1.1  knakahar 	group "external" on \$ext_if {
    119      1.1  knakahar 		pass stateful out final all
    120      1.1  knakahar 	}
    121      1.1  knakahar 	group "internal" on \$int_if {
    122      1.1  knakahar 		block in all
    123      1.1  knakahar 		pass in final from \$localnet
    124      1.1  knakahar 		pass out final all
    125      1.1  knakahar 	}
    126      1.1  knakahar 	group default {
    127      1.1  knakahar 		pass final on lo0 all
    128      1.1  knakahar 		block all
    129      1.1  knakahar 	}
    130      1.1  knakahar 	EOF
    131      1.1  knakahar }
    132      1.1  knakahar 
    133      1.1  knakahar PIDSFILE=./terminator.pids
    134      1.1  knakahar start_natt_terminator()
    135      1.1  knakahar {
    136      1.1  knakahar 	local sock=$1
    137      1.1  knakahar 	local ip=$2
    138      1.1  knakahar 	local port=$3
    139      1.1  knakahar 	local pidsfile=$4
    140      1.1  knakahar 	local backup=$RUMP_SERVER
    141      1.1  knakahar 	local pid=
    142      1.1  knakahar 	local terminator="$(atf_get_srcdir)/../ipsec/natt_terminator"
    143      1.1  knakahar 
    144      1.1  knakahar 	export RUMP_SERVER=$sock
    145      1.1  knakahar 
    146      1.1  knakahar 	env LD_PRELOAD=/usr/lib/librumphijack.so \
    147      1.1  knakahar 	    $terminator $ip $port &
    148      1.1  knakahar 	pid=$!
    149      1.1  knakahar 	if [ ! -f $PIDSFILE ]; then
    150      1.1  knakahar 		touch $PIDSFILE
    151      1.1  knakahar 	fi
    152      1.1  knakahar 	echo $pid >> $PIDSFILE
    153      1.1  knakahar 
    154      1.1  knakahar 	$DEBUG && rump.netstat -a -f inet
    155      1.1  knakahar 
    156      1.1  knakahar 	export RUMP_SERVER=$backup
    157      1.1  knakahar 
    158      1.1  knakahar 	sleep 1
    159      1.1  knakahar }
    160      1.1  knakahar 
    161      1.1  knakahar stop_natt_terminators()
    162      1.1  knakahar {
    163      1.1  knakahar 	local pid=
    164      1.1  knakahar 
    165      1.1  knakahar 	if [ ! -f $PIDSFILE ]; then
    166      1.1  knakahar 		return
    167      1.1  knakahar 	fi
    168      1.1  knakahar 
    169      1.1  knakahar 	for pid in $(cat $PIDSFILE); do
    170      1.1  knakahar 		kill -9 $pid
    171      1.1  knakahar 	done
    172      1.1  knakahar 	rm -f $PIDSFILE
    173      1.1  knakahar }
    174      1.1  knakahar 
    175      1.1  knakahar check_ping_packets()
    176      1.1  knakahar {
    177      1.1  knakahar 	local sock=$1
    178      1.1  knakahar 	local bus=$2
    179      1.1  knakahar 	local from_ip=$3
    180      1.1  knakahar 	local to_ip=$4
    181      1.1  knakahar 
    182      1.1  knakahar 	local outfile=./out.ping
    183      1.1  knakahar 
    184      1.1  knakahar 	extract_new_packets $bus > $outfile
    185      1.1  knakahar 
    186      1.1  knakahar 	export RUMP_SERVER=$sock
    187      1.1  knakahar 	atf_check -s exit:0 -o ignore rump.ping -c 1 -n -w 3 $to_ip
    188      1.1  knakahar 
    189      1.1  knakahar 	extract_new_packets $bus > $outfile
    190      1.1  knakahar 	$DEBUG && cat $outfile
    191      1.1  knakahar 	atf_check -s exit:0 \
    192      1.1  knakahar 	    -o match:"$from_ip > $to_ip: ICMP echo request" \
    193      1.1  knakahar 	    cat $outfile
    194      1.1  knakahar 	atf_check -s exit:0 \
    195      1.1  knakahar 	    -o match:"$to_ip > $from_ip: ICMP echo reply" \
    196      1.1  knakahar 	    cat $outfile
    197      1.1  knakahar }
    198      1.1  knakahar 
    199      1.1  knakahar check_ping_packets_over_ipsecif()
    200      1.1  knakahar {
    201      1.1  knakahar 	local sock=$1
    202      1.1  knakahar 	local bus=$2
    203      1.1  knakahar 	local to_ip=$3
    204      1.1  knakahar 	local nat_from_ip=$4
    205      1.1  knakahar 	local nat_from_port=$5
    206      1.1  knakahar 	local nat_to_ip=$6
    207      1.1  knakahar 	local nat_to_port=$7
    208      1.1  knakahar 
    209      1.1  knakahar 	local outfile=./out.ping_over_ipsecif
    210      1.1  knakahar 
    211      1.1  knakahar 	extract_new_packets $bus > $outfile
    212      1.1  knakahar 
    213      1.1  knakahar 	export RUMP_SERVER=$sock
    214      1.1  knakahar 	atf_check -s exit:0 -o ignore rump.ping -c 1 -n -w 7 $to_ip
    215      1.1  knakahar 
    216      1.1  knakahar 	# Check both ports and UDP encapsulation
    217      1.1  knakahar 	extract_new_packets $bus > $outfile
    218      1.1  knakahar 	$DEBUG && cat $outfile
    219      1.1  knakahar 	atf_check -s exit:0 \
    220      1.1  knakahar 	    -o match:"${nat_from_ip}\.$nat_from_port > ${nat_to_ip}\.${nat_to_port}: UDP-encap" \
    221      1.1  knakahar 	    cat $outfile
    222      1.1  knakahar 	atf_check -s exit:0 \
    223      1.1  knakahar 	    -o match:"${nat_to_ip}\.${nat_to_port} > ${nat_from_ip}\.${nat_from_port}: UDP-encap" \
    224      1.1  knakahar 	    cat $outfile
    225      1.1  knakahar }
    226      1.1  knakahar 
    227      1.1  knakahar check_tcp_com_prepare()
    228      1.1  knakahar {
    229      1.1  knakahar 	local server_sock=$1
    230      1.1  knakahar 	local client_sock=$2
    231      1.1  knakahar 	local bus=$3
    232      1.1  knakahar 	local to_ip=$4
    233      1.1  knakahar 	local nat_from_ip=$5
    234      1.1  knakahar 	local nat_to_ip=$6
    235      1.1  knakahar 
    236      1.1  knakahar 	local outfile=./out.prepare
    237      1.1  knakahar 	local file_send=./file.send.prepare
    238      1.1  knakahar 	local file_recv=./file.recv.prepare
    239      1.1  knakahar 
    240      1.1  knakahar 	extract_new_packets $bus > $outfile
    241      1.1  knakahar 
    242      1.1  knakahar 	start_nc_server $server_sock 4501 $file_recv ipv4
    243      1.1  knakahar 
    244      1.1  knakahar 	prepare_file $file_send
    245      1.1  knakahar 	export RUMP_SERVER=$client_sock
    246      1.1  knakahar 	atf_check -s exit:0 $HIJACKING nc -w 3 $to_ip 4501 < $file_send
    247      1.1  knakahar 	atf_check -s exit:0 diff -q $file_send $file_recv
    248      1.1  knakahar 	extract_new_packets $bus > $outfile
    249      1.1  knakahar 	$DEBUG && cat $outfile
    250      1.1  knakahar 	atf_check -s exit:0 \
    251      1.1  knakahar 	    -o match:"${nat_from_ip}\.[0-9]+ > ${nat_to_ip}\.4501" \
    252      1.1  knakahar 	    cat $outfile
    253      1.1  knakahar 	atf_check -s exit:0 \
    254      1.1  knakahar 	    -o match:"${nat_to_ip}\.4501 > ${nat_from_ip}\.[0-9]+" \
    255      1.1  knakahar 	    cat $outfile
    256      1.1  knakahar 
    257      1.1  knakahar 	stop_nc_server
    258      1.1  knakahar }
    259      1.1  knakahar 
    260      1.1  knakahar check_tcp_com_over_ipsecif()
    261      1.1  knakahar {
    262      1.1  knakahar 	local server_sock=$1
    263      1.1  knakahar 	local client_sock=$2
    264      1.1  knakahar 	local bus=$3
    265      1.1  knakahar 	local to_ip=$4
    266      1.1  knakahar 	local nat_from_ip=$5
    267      1.1  knakahar 	local nat_from_port=$6
    268      1.1  knakahar 	local nat_to_ip=$7
    269      1.1  knakahar 	local nat_to_port=$8
    270      1.1  knakahar 
    271      1.1  knakahar 	local outfile=./out.ipsecif
    272      1.1  knakahar 	local file_send=./file.send.ipsecif
    273      1.1  knakahar 	local file_recv=./file.recv.ipsecif
    274      1.1  knakahar 
    275      1.1  knakahar 	extract_new_packets $bus > $outfile
    276      1.1  knakahar 
    277      1.1  knakahar 	start_nc_server $server_sock 4501 $file_recv ipv4
    278      1.1  knakahar 	prepare_file $file_send
    279      1.1  knakahar 	export RUMP_SERVER=$client_sock
    280      1.1  knakahar 	atf_check -s exit:0 -o ignore $HIJACKING nc -w 7 $to_ip 4501 < $file_send
    281      1.1  knakahar 	atf_check -s exit:0 diff -q $file_send $file_recv
    282      1.1  knakahar 	stop_nc_server
    283      1.1  knakahar 
    284      1.1  knakahar 	# Check both ports and UDP encapsulation
    285      1.1  knakahar 	extract_new_packets $bus > $outfile
    286      1.1  knakahar 	$DEBUG && cat $outfile
    287      1.1  knakahar 	atf_check -s exit:0 \
    288      1.1  knakahar 	    -o match:"${nat_from_ip}\.$nat_from_port > ${nat_to_ip}\.${nat_to_port}: UDP-encap" \
    289      1.1  knakahar 	    cat $outfile
    290      1.1  knakahar 	atf_check -s exit:0 \
    291      1.1  knakahar 	    -o match:"${nat_to_ip}\.${nat_to_port} > ${nat_from_ip}\.${nat_from_port}: UDP-encap" \
    292      1.1  knakahar 	    cat $outfile
    293      1.1  knakahar }
    294      1.1  knakahar 
    295      1.1  knakahar test_ipsecif_natt_transport()
    296      1.1  knakahar {
    297      1.1  knakahar 	local algo=$1
    298      1.2  knakahar 	local ip_local_a=192.168.0.2
    299      1.2  knakahar 	local ip_local_b=192.168.0.3
    300      1.1  knakahar 	local ip_nat_local=192.168.0.1
    301      1.1  knakahar 	local ip_nat_remote=10.0.0.1
    302      1.1  knakahar 	local ip_remote=10.0.0.2
    303      1.1  knakahar 	local subnet_local=192.168.0.0
    304      1.2  knakahar 	local ip_local_ipsecif_a=172.16.100.1
    305      1.2  knakahar 	local ip_local_ipsecif_b=172.16.110.1
    306      1.2  knakahar 	local ip_remote_ipsecif_a=172.16.10.1
    307      1.2  knakahar 	local ip_remote_ipsecif_b=172.16.11.1
    308      1.1  knakahar 
    309      1.1  knakahar 	local npffile=./npf.conf
    310      1.1  knakahar 	local file_send=./file.send
    311      1.1  knakahar 	local algo_args="$(generate_algo_args esp-udp $algo)"
    312      1.2  knakahar 	local pid= port_a=  port_b=
    313      1.1  knakahar 
    314      1.1  knakahar 	setup_servers
    315      1.1  knakahar 
    316      1.2  knakahar 	export RUMP_SERVER=$SOCK_LOCAL_A
    317      1.1  knakahar 	atf_check -s exit:0 rump.sysctl -q -w net.inet.ip.dad_count=0
    318      1.2  knakahar 	atf_check -s exit:0 rump.ifconfig shmif0 $ip_local_a/24
    319      1.2  knakahar 	atf_check -s exit:0 -o ignore \
    320      1.2  knakahar 	    rump.route -n add default $ip_nat_local
    321      1.2  knakahar 
    322      1.2  knakahar 	export RUMP_SERVER=$SOCK_LOCAL_B
    323      1.2  knakahar 	atf_check -s exit:0 rump.sysctl -q -w net.inet.ip.dad_count=0
    324      1.2  knakahar 	atf_check -s exit:0 rump.ifconfig shmif0 $ip_local_b/24
    325      1.1  knakahar 	atf_check -s exit:0 -o ignore \
    326      1.1  knakahar 	    rump.route -n add default $ip_nat_local
    327      1.1  knakahar 
    328      1.1  knakahar 	export RUMP_SERVER=$SOCK_NAT
    329      1.1  knakahar 	atf_check -s exit:0 rump.sysctl -q -w net.inet.ip.dad_count=0
    330      1.1  knakahar 	atf_check -s exit:0 rump.ifconfig shmif0 $ip_nat_local/24
    331      1.1  knakahar 	atf_check -s exit:0 rump.ifconfig shmif1 $ip_nat_remote/24
    332      1.1  knakahar 	atf_check -s exit:0 rump.sysctl -q -w net.inet.ip.forwarding=1
    333      1.1  knakahar 
    334      1.1  knakahar 	export RUMP_SERVER=$SOCK_REMOTE
    335      1.1  knakahar 	atf_check -s exit:0 rump.sysctl -q -w net.inet.ip.dad_count=0
    336      1.1  knakahar 	atf_check -s exit:0 rump.ifconfig shmif0 $ip_remote/24
    337      1.1  knakahar 	atf_check -s exit:0 -o ignore \
    338      1.1  knakahar 	    rump.route -n add -net $subnet_local $ip_nat_remote
    339      1.1  knakahar 
    340      1.1  knakahar 	# There is no NAT/NAPT. ping should just work.
    341      1.2  knakahar 	check_ping_packets $SOCK_LOCAL_A $BUS_NAT $ip_local_a $ip_remote
    342      1.2  knakahar 	check_ping_packets $SOCK_LOCAL_B $BUS_NAT $ip_local_b $ip_remote
    343      1.1  knakahar 
    344      1.1  knakahar 	# Setup an NAPT with npf
    345      1.1  knakahar 	build_npf_conf $npffile "$subnet_local/24"
    346      1.1  knakahar 
    347      1.1  knakahar 	export RUMP_SERVER=$SOCK_NAT
    348      1.1  knakahar 	atf_check -s exit:0 $HIJACKING_NPF npfctl reload $npffile
    349      1.1  knakahar 	atf_check -s exit:0 $HIJACKING_NPF npfctl start
    350      1.1  knakahar 	$DEBUG && ${HIJACKING},"blanket=/dev/npf" npfctl show
    351      1.1  knakahar 
    352      1.1  knakahar 	# There is an NAPT. ping works but source IP/port are translated
    353      1.2  knakahar 	check_ping_packets $SOCK_LOCAL_A $BUS_NAT $ip_nat_remote $ip_remote
    354      1.2  knakahar 	check_ping_packets $SOCK_LOCAL_B $BUS_NAT $ip_nat_remote $ip_remote
    355      1.1  knakahar 
    356      1.1  knakahar 	# Try TCP communications just in case
    357      1.2  knakahar 	check_tcp_com_prepare $SOCK_REMOTE $SOCK_LOCAL_A $BUS_NAT \
    358      1.2  knakahar 			      $ip_remote $ip_nat_remote $ip_remote
    359      1.2  knakahar 	check_tcp_com_prepare $SOCK_REMOTE $SOCK_LOCAL_B $BUS_NAT \
    360      1.1  knakahar 			      $ip_remote $ip_nat_remote $ip_remote
    361      1.1  knakahar 
    362      1.1  knakahar 	# Launch a nc server as a terminator of NAT-T on outside the NAPT
    363      1.1  knakahar 	start_natt_terminator $SOCK_REMOTE $ip_remote 4500
    364      1.1  knakahar 	echo zzz > $file_send
    365      1.1  knakahar 
    366      1.2  knakahar 	#################### Test for primary ipsecif(4) NAT-T.
    367      1.2  knakahar 
    368      1.2  knakahar 	export RUMP_SERVER=$SOCK_LOCAL_A
    369      1.2  knakahar 	# Send a UDP packet to the remote server at port 4500 from the local
    370      1.2  knakahar 	# host of port 4500. This makes a mapping on the NAPT between them
    371      1.2  knakahar 	atf_check -s exit:0 $HIJACKING \
    372      1.2  knakahar 	    nc -u -w 3 -p 4500 $ip_remote 4500 < $file_send
    373      1.2  knakahar 	# Launch a nc server as a terminator of NAT-T on inside the NAPT,
    374      1.2  knakahar 	# taking over port 4500 of the local host.
    375      1.2  knakahar 	start_natt_terminator $SOCK_LOCAL_A $ip_local_a 4500
    376      1.2  knakahar 
    377      1.2  knakahar 	# We need to keep the servers for NAT-T
    378      1.2  knakahar 
    379      1.2  knakahar 	export RUMP_SERVER=$SOCK_LOCAL_A
    380      1.2  knakahar 	$DEBUG && rump.netstat -na -f inet
    381      1.2  knakahar 	export RUMP_SERVER=$SOCK_REMOTE
    382      1.2  knakahar 	$DEBUG && rump.netstat -na -f inet
    383      1.2  knakahar 
    384      1.2  knakahar 	# Get a translated port number from 4500 on the NAPT
    385      1.2  knakahar 	export RUMP_SERVER=$SOCK_NAT
    386      1.2  knakahar 	$DEBUG && $HIJACKING_NPF npfctl list
    387      1.2  knakahar 	#          192.168.0.2:4500 10.0.0.2:4500  via shmif1:65248
    388  1.2.6.1    martin 	port_a=$(get_natt_port $ip_local_a $ip_nat_remote)
    389      1.2  knakahar 	$DEBUG && echo port_a=$port_a
    390      1.2  knakahar 	if [ -z "$port_a" ]; then
    391  1.2.6.1    martin 		atf_fail "Failed to get a translated port on NAPT"
    392      1.2  knakahar 	fi
    393      1.2  knakahar 
    394      1.2  knakahar 	# Setup ESP-UDP ipsecif(4) for first client under NAPT
    395      1.2  knakahar 	setup_ipsecif $SOCK_LOCAL_A 0 $ip_local_a 4500 $ip_remote 4500 \
    396      1.2  knakahar 		      $ip_local_ipsecif_a $ip_remote_ipsecif_a
    397      1.2  knakahar 	setup_ipsecif $SOCK_REMOTE 0 $ip_remote 4500 $ip_nat_remote $port_a \
    398      1.2  knakahar 		      $ip_remote_ipsecif_a $ip_local_ipsecif_a
    399      1.2  knakahar 
    400      1.2  knakahar 	add_sa $SOCK_LOCAL_A "esp-udp" "$algo_args" \
    401      1.2  knakahar 	       $ip_local_a 4500 $ip_remote 4500 10000 10001
    402      1.2  knakahar 	add_sa $SOCK_REMOTE "esp-udp" "$algo_args" \
    403      1.2  knakahar 	       $ip_remote 4500 $ip_nat_remote $port_a 10001 10000
    404      1.2  knakahar 
    405      1.2  knakahar 	export RUMP_SERVER=$SOCK_LOCAL_A
    406      1.2  knakahar 	# ping should still work
    407      1.2  knakahar 	atf_check -s exit:0 -o ignore rump.ping -c 1 -n -w 3 $ip_remote
    408      1.1  knakahar 
    409      1.2  knakahar 	# Try ping over the ESP-UDP ipsecif(4)
    410      1.2  knakahar 	check_ping_packets_over_ipsecif $SOCK_LOCAL_A $BUS_NAT \
    411      1.2  knakahar 					 $ip_remote_ipsecif_a $ip_nat_remote $port_a $ip_remote 4500
    412      1.2  knakahar 
    413      1.2  knakahar 	# Try TCP communications over the ESP-UDP ipsecif(4)
    414      1.2  knakahar 	check_tcp_com_over_ipsecif $SOCK_REMOTE $SOCK_LOCAL_A $BUS_NAT \
    415      1.2  knakahar 				   $ip_remote_ipsecif_a $ip_nat_remote $port_a $ip_remote 4500
    416      1.2  knakahar 
    417      1.2  knakahar 	#################### Test for secondary ipsecif(4) NAT-T.
    418      1.2  knakahar 
    419      1.2  knakahar 	export RUMP_SERVER=$SOCK_REMOTE
    420      1.2  knakahar 	$HIJACKING setkey -D
    421      1.2  knakahar 	$HIJACKING setkey -DP
    422      1.2  knakahar 
    423      1.2  knakahar 	export RUMP_SERVER=$SOCK_LOCAL_B
    424      1.1  knakahar 	# Send a UDP packet to the remote server at port 4500 from the local
    425      1.1  knakahar 	# host of port 4500. This makes a mapping on the NAPT between them
    426      1.1  knakahar 	atf_check -s exit:0 $HIJACKING \
    427      1.1  knakahar 	    nc -u -w 3 -p 4500 $ip_remote 4500 < $file_send
    428      1.1  knakahar 	# Launch a nc server as a terminator of NAT-T on inside the NAPT,
    429      1.1  knakahar 	# taking over port 4500 of the local host.
    430      1.2  knakahar 	start_natt_terminator $SOCK_LOCAL_B $ip_local_b 4500
    431      1.1  knakahar 
    432      1.1  knakahar 	# We need to keep the servers for NAT-T
    433      1.1  knakahar 
    434      1.2  knakahar 	export RUMP_SERVER=$SOCK_LOCAL_B
    435      1.1  knakahar 	$DEBUG && rump.netstat -na -f inet
    436      1.1  knakahar 	export RUMP_SERVER=$SOCK_REMOTE
    437      1.1  knakahar 	$DEBUG && rump.netstat -na -f inet
    438      1.1  knakahar 
    439      1.1  knakahar 	# Get a translated port number from 4500 on the NAPT
    440      1.1  knakahar 	export RUMP_SERVER=$SOCK_NAT
    441      1.1  knakahar 	$DEBUG && $HIJACKING_NPF npfctl list
    442      1.1  knakahar 	#          192.168.0.2:4500 10.0.0.2:4500  via shmif1:65248
    443  1.2.6.1    martin 	port_b=$(get_natt_port $ip_local_b $ip_nat_remote)
    444      1.2  knakahar 	$DEBUG && echo port_b=$port_b
    445      1.2  knakahar 	if [ -z "$port_b" ]; then
    446  1.2.6.1    martin 		atf_fail "Failed to get a translated port on NAPT"
    447      1.1  knakahar 	fi
    448      1.1  knakahar 
    449      1.1  knakahar 	# Setup ESP-UDP ipsecif(4) for first client under NAPT
    450      1.2  knakahar 	setup_ipsecif $SOCK_LOCAL_B 0 $ip_local_b 4500 $ip_remote 4500 \
    451      1.2  knakahar 		      $ip_local_ipsecif_b $ip_remote_ipsecif_b
    452      1.2  knakahar 	setup_ipsecif $SOCK_REMOTE 1 $ip_remote 4500 $ip_nat_remote $port_b \
    453      1.2  knakahar 		      $ip_remote_ipsecif_b $ip_local_ipsecif_b
    454      1.2  knakahar 
    455      1.2  knakahar 	check_ping_packets_over_ipsecif $SOCK_LOCAL_A $BUS_NAT \
    456      1.2  knakahar 					 $ip_remote_ipsecif_a $ip_nat_remote $port_a $ip_remote 4500
    457      1.1  knakahar 
    458      1.2  knakahar 	add_sa $SOCK_LOCAL_B "esp-udp" "$algo_args" \
    459      1.2  knakahar 	       $ip_local_b 4500 $ip_remote 4500 11000 11001
    460      1.1  knakahar 	add_sa $SOCK_REMOTE "esp-udp" "$algo_args" \
    461      1.2  knakahar 	       $ip_remote 4500 $ip_nat_remote $port_b 11001 11000
    462      1.1  knakahar 
    463      1.2  knakahar 	export RUMP_SERVER=$SOCK_LOCAL_B
    464      1.1  knakahar 	# ping should still work
    465      1.1  knakahar 	atf_check -s exit:0 -o ignore rump.ping -c 1 -n -w 3 $ip_remote
    466      1.1  knakahar 
    467      1.1  knakahar 	# Try ping over the ESP-UDP ipsecif(4)
    468      1.2  knakahar 	check_ping_packets_over_ipsecif $SOCK_LOCAL_B $BUS_NAT \
    469      1.2  knakahar 					 $ip_remote_ipsecif_b $ip_nat_remote $port_b $ip_remote 4500
    470      1.2  knakahar 
    471      1.1  knakahar 
    472      1.1  knakahar 	# Try TCP communications over the ESP-UDP ipsecif(4)
    473      1.2  knakahar 	check_tcp_com_over_ipsecif $SOCK_REMOTE $SOCK_LOCAL_B $BUS_NAT \
    474      1.2  knakahar 				   $ip_remote_ipsecif_b $ip_nat_remote $port_b $ip_remote 4500
    475      1.2  knakahar 
    476      1.2  knakahar 	# Try ping over the ESP-UDP ipsecif(4) for primary again
    477      1.2  knakahar 	check_ping_packets_over_ipsecif $SOCK_LOCAL_A $BUS_NAT \
    478      1.2  knakahar 					 $ip_remote_ipsecif_a $ip_nat_remote $port_a $ip_remote 4500
    479      1.2  knakahar 
    480      1.2  knakahar 	# Try TCP communications over the ESP-UDP ipsecif(4) for primary again
    481      1.2  knakahar 	check_tcp_com_over_ipsecif $SOCK_REMOTE $SOCK_LOCAL_A $BUS_NAT \
    482      1.2  knakahar 				   $ip_remote_ipsecif_a $ip_nat_remote $port_a $ip_remote 4500
    483      1.1  knakahar 
    484      1.1  knakahar 	# Kill the NAT-T terminator
    485      1.1  knakahar 	stop_natt_terminators
    486      1.1  knakahar }
    487      1.1  knakahar 
    488      1.1  knakahar add_test_ipsecif_natt_transport()
    489      1.1  knakahar {
    490      1.1  knakahar 	local algo=$1
    491      1.1  knakahar 	local _algo=$(echo $algo | sed 's/-//g')
    492      1.1  knakahar 	local name= desc=
    493      1.1  knakahar 
    494      1.1  knakahar 	desc="Test ipsecif(4) NAT-T ($algo)"
    495      1.1  knakahar 	name="ipsecif_natt_transport_${_algo}"
    496      1.1  knakahar 
    497      1.1  knakahar 	atf_test_case ${name} cleanup
    498      1.1  knakahar 	eval "
    499      1.1  knakahar 	    ${name}_head() {
    500      1.1  knakahar 	        atf_set descr \"$desc\"
    501      1.1  knakahar 	        atf_set require.progs rump_server setkey nc
    502      1.1  knakahar 	    }
    503      1.1  knakahar 	    ${name}_body() {
    504      1.1  knakahar 	        test_ipsecif_natt_transport $algo
    505      1.1  knakahar 	        rump_server_destroy_ifaces
    506      1.1  knakahar 	    }
    507      1.1  knakahar 	    ${name}_cleanup() {
    508      1.1  knakahar 		stop_nc_server
    509      1.1  knakahar 		stop_natt_terminators
    510      1.1  knakahar 	        \$DEBUG && dump
    511      1.1  knakahar 	        cleanup
    512      1.1  knakahar 	    }
    513      1.1  knakahar 	"
    514      1.1  knakahar 	atf_add_test_case ${name}
    515      1.1  knakahar }
    516      1.1  knakahar 
    517      1.1  knakahar atf_init_test_cases()
    518      1.1  knakahar {
    519      1.1  knakahar 	local algo=
    520      1.1  knakahar 
    521      1.1  knakahar 	for algo in $ESP_ENCRYPTION_ALGORITHMS_MINIMUM; do
    522      1.1  knakahar 		add_test_ipsecif_natt_transport $algo
    523      1.1  knakahar 	done
    524      1.1  knakahar }
    525