Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/tests/net/ipsec Add ATF for IPv6 NAT-T.



details:   https://anonhg.NetBSD.org/src/rev/9089f628b0c9
branches:  trunk
changeset: 446069:9089f628b0c9
user:      knakahara <knakahara%NetBSD.org@localhost>
date:      Thu Nov 22 04:51:41 2018 +0000

description:
Add ATF for IPv6 NAT-T.

We use IPv6 NAT-T to avoid IPsec slowing down caused by dropping ESP packets
by some Customer Premises Equipments (CPE). I implement ATF to test such
situation.

I think it can also work with nat66, but I have not tested to the fine details.

diffstat:

 tests/net/ipsec/natt_terminator.c |   37 +++++++-
 tests/net/ipsec/t_ipsec_natt.sh   |  149 +++++++++++++++++++++++++++++++++----
 2 files changed, 164 insertions(+), 22 deletions(-)

diffs (truncated from 304 to 300 lines):

diff -r 0702448b1db3 -r 9089f628b0c9 tests/net/ipsec/natt_terminator.c
--- a/tests/net/ipsec/natt_terminator.c Thu Nov 22 04:48:34 2018 +0000
+++ b/tests/net/ipsec/natt_terminator.c Thu Nov 22 04:51:41 2018 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: natt_terminator.c,v 1.1 2017/10/30 15:59:23 ozaki-r Exp $      */
+/*     $NetBSD: natt_terminator.c,v 1.2 2018/11/22 04:51:41 knakahara Exp $    */
 
 /*-
  * Copyright (c) 2017 Internet Initiative Japan Inc.
@@ -41,6 +41,14 @@
 #include <stdlib.h>
 #include <unistd.h>
 
+static void
+usage(void)
+{
+       const char *prog = "natt_terminator";
+
+       fprintf(stderr, "Usage: %s [-46] <addr> <port>\n", prog);
+}
+
 int
 main(int argc, char **argv)
 {
@@ -49,17 +57,34 @@
        int s, e;
        const char *addr, *port;
        int option;
+       int c, family = AF_INET;
 
-       if (argc != 3) {
-               fprintf(stderr, "Usage: %s <addr> <port>\n", argv[0]);
+       while ((c = getopt(argc, argv, "46")) != -1) {
+               switch (c) {
+               case '4':
+                       family = AF_INET;
+                       break;
+               case '6':
+                       family = AF_INET6;
+                       break;
+               default:
+                       usage();
+                       return 1;
+               }
+       }
+       argc -= optind;
+       argv += optind;
+
+       if (argc != 2) {
+               usage();
                return 1;
        }
 
-       addr = argv[1];
-       port = argv[2];
+       addr = argv[0];
+       port = argv[1];
 
        memset(&hints, 0, sizeof(hints));
-       hints.ai_family = AF_INET;
+       hints.ai_family = family;
        hints.ai_socktype = SOCK_DGRAM;
        hints.ai_protocol = IPPROTO_UDP;
        hints.ai_flags = 0;
diff -r 0702448b1db3 -r 9089f628b0c9 tests/net/ipsec/t_ipsec_natt.sh
--- a/tests/net/ipsec/t_ipsec_natt.sh   Thu Nov 22 04:48:34 2018 +0000
+++ b/tests/net/ipsec/t_ipsec_natt.sh   Thu Nov 22 04:51:41 2018 +0000
@@ -1,4 +1,4 @@
-#      $NetBSD: t_ipsec_natt.sh,v 1.1 2017/10/30 15:59:23 ozaki-r Exp $
+#      $NetBSD: t_ipsec_natt.sh,v 1.2 2018/11/22 04:51:41 knakahara Exp $
 #
 # Copyright (c) 2017 Internet Initiative Japan Inc.
 # All rights reserved.
@@ -31,11 +31,12 @@
 BUS_LOCAL=./bus_ipsec_natt_local
 BUS_NAT=./bus_ipsec_natt_nat
 BUS_REMOTE=./bus_ipsec_natt_remote
+BUS_GLOBAL=./bus_ipsec_natt_global
 
 DEBUG=${DEBUG:-false}
 HIJACKING_NPF="${HIJACKING},blanket=/dev/npf"
 
-setup_servers()
+setup_servers_ipv4()
 {
 
        rump_server_crypto_start $SOCK_LOCAL netipsec
@@ -47,6 +48,22 @@
        rump_server_add_iface $SOCK_REMOTE shmif0 $BUS_NAT
 }
 
+setup_servers_ipv6()
+{
+
+       rump_server_crypto_start $SOCK_LOCAL netipsec netinet6 ipsec
+       rump_server_crypto_start $SOCK_REMOTE netipsec netinet6 ipsec
+       rump_server_add_iface $SOCK_LOCAL shmif0 $BUS_GLOBAL
+       rump_server_add_iface $SOCK_REMOTE shmif0 $BUS_GLOBAL
+}
+
+setup_servers()
+{
+       local proto=$1
+
+       setup_servers_$proto
+}
+
 setup_sp()
 {
        local proto=$1
@@ -151,17 +168,24 @@
 start_natt_terminator()
 {
        local sock=$1
-       local ip=$2
-       local port=$3
-       local pidsfile=$4
+       local proto=$2
+       local ip=$3
+       local port=$4
+       local pidsfile=$5
        local backup=$RUMP_SERVER
-       local pid=
+       local pid= opt=
        local terminator="$(atf_get_srcdir)/natt_terminator"
 
+       if [ "$proto" = "ipv6" ]; then
+           opt="-6"
+       else
+           opt="-4"
+       fi
+
        export RUMP_SERVER=$sock
 
        env LD_PRELOAD=/usr/lib/librumphijack.so \
-           $terminator $ip $port &
+           $terminator $opt $ip $port &
        pid=$!
        if [ ! -f $PIDSFILE ]; then
                touch $PIDSFILE
@@ -189,7 +213,7 @@
        rm -f $PIDSFILE
 }
 
-test_ipsec_natt_transport()
+test_ipsec_natt_transport_ipv4()
 {
        local algo=$1
        local ip_local=10.0.1.2
@@ -204,7 +228,7 @@
        local algo_args="$(generate_algo_args esp-udp $algo)"
        local pid= port=
 
-       setup_servers
+       setup_servers ipv4
 
        export RUMP_SERVER=$SOCK_LOCAL
        atf_check -s exit:0 rump.sysctl -q -w net.inet.ip.dad_count=0
@@ -278,7 +302,7 @@
            cat $outfile
 
        # Launch a nc server as a terminator of NAT-T on outside the NAPT
-       start_natt_terminator $SOCK_REMOTE $ip_remote 4500
+       start_natt_terminator $SOCK_REMOTE ipv4 $ip_remote 4500
        echo zzz > $file_send
 
        export RUMP_SERVER=$SOCK_LOCAL
@@ -288,7 +312,7 @@
            nc -u -w 3 -p 4500 $ip_remote 4500 < $file_send
        # Launch a nc server as a terminator of NAT-T on inside the NAPT,
        # taking over port 4500 of the local host.
-       start_natt_terminator $SOCK_LOCAL $ip_local 4500
+       start_natt_terminator $SOCK_LOCAL ipv4 $ip_local 4500
 
        # We need to keep the servers for NAT-T
 
@@ -337,14 +361,106 @@
        stop_natt_terminators
 }
 
+test_ipsec_natt_transport_ipv6_without_nat()
+{
+       local algo=$1
+       local ip_local_phys=fc00::1
+       local ip_local_ipsecif=fc00:1111::1
+       local ip_remote_phys=fc00::2
+       local ip_remote_ipsecif=fc00:2222::1
+       local outfile=./out
+       local npffile=./npf.conf
+       local file_send=./file.send
+       local file_recv=./file.recv
+       local algo_args="$(generate_algo_args esp-udp $algo)"
+       local pid=
+       local port=4500
+
+       setup_servers ipv6
+
+       export RUMP_SERVER=$SOCK_LOCAL
+       atf_check -s exit:0 rump.sysctl -q -w net.inet6.ip6.dad_count=0
+       atf_check -s exit:0 rump.ifconfig shmif0 inet6 $ip_local_phys/64
+
+       export RUMP_SERVER=$SOCK_REMOTE
+       atf_check -s exit:0 rump.sysctl -q -w net.inet6.ip6.dad_count=0
+       atf_check -s exit:0 rump.ifconfig shmif0 inet6 $ip_remote_phys/64
+
+       extract_new_packets $BUS_GLOBAL > $outfile
+
+       export RUMP_SERVER=$SOCK_LOCAL
+       atf_check -s exit:0 -o ignore rump.ping6 -c 1 -n -X 3 $ip_remote_phys
+
+       extract_new_packets $BUS_GLOBAL > $outfile
+       $DEBUG && cat $outfile
+       atf_check -s exit:0 \
+           -o match:"$ip_local_phys > $ip_remote_phys: ICMP6, echo request" \
+           cat $outfile
+       atf_check -s exit:0 \
+           -o match:"$ip_remote_phys > $ip_local_phys: ICMP6, echo reply" \
+           cat $outfile
+
+       # Create ESP-UDP ipsecif(4) connections
+       export RUMP_SERVER=$SOCK_LOCAL
+       atf_check -s exit:0 rump.ifconfig ipsec0 create
+       atf_check -s exit:0 rump.ifconfig ipsec0 link0 # enable nat-t
+       atf_check -s exit:0 rump.ifconfig ipsec0 link2 # ensure IPv6 forward
+       atf_check -s exit:0 rump.ifconfig ipsec0 tunnel $ip_local_phys $ip_remote_phys
+       atf_check -s exit:0 rump.ifconfig ipsec0 inet6 $ip_local_ipsecif
+       atf_check -s exit:0 -o ignore \
+           rump.route -n add -inet6 $ip_remote_ipsecif $ip_local_ipsecif
+       start_natt_terminator $SOCK_LOCAL ipv6 $ip_local_phys $port
+
+       add_sa "esp-udp" "$algo_args" $ip_local_phys $ip_remote_phys \
+           $ip_local_phys 10000 $port
+
+       export RUMP_SERVER=$SOCK_REMOTE
+       atf_check -s exit:0 rump.ifconfig ipsec0 create
+       atf_check -s exit:0 rump.ifconfig ipsec0 link0 # enable nat-t
+       atf_check -s exit:0 rump.ifconfig ipsec0 link2 # ensure IPv6 forward
+       atf_check -s exit:0 rump.ifconfig ipsec0 tunnel $ip_remote_phys $ip_local_phys
+       atf_check -s exit:0 rump.ifconfig ipsec0 inet6 $ip_remote_ipsecif
+       atf_check -s exit:0 -o ignore \
+           rump.route -n add -inet6 $ip_local_ipsecif $ip_remote_ipsecif
+       start_natt_terminator $SOCK_REMOTE ipv6 $ip_remote_phys $port
+
+       # ping should still work
+       export RUMP_SERVER=$SOCK_LOCAL
+       atf_check -s exit:0 -o ignore rump.ping6 -c 1 -n -X 5 $ip_remote_ipsecif
+
+       # Check UDP encapsulation
+       extract_new_packets $BUS_GLOBAL > $outfile
+       $DEBUG && cat $outfile
+
+       atf_check -s exit:0 \
+           -o match:"${ip_local_phys}\.$port > ${ip_remote_phys}\.4500: UDP-encap" \
+           cat $outfile
+       atf_check -s exit:0 \
+           -o match:"${ip_remote_phys}\.4500 > ${ip_local_phys}\.$port: UDP-encap" \
+           cat $outfile
+
+       # Kill the NAT-T terminator
+       stop_natt_terminators
+       export RUMP_SERVER=$SOCK_REMOTE
+       stop_natt_terminators
+}
+
+test_ipsec_natt_transport_ipv6()
+{
+       local algo=$1
+
+       test_ipsec_natt_transport_ipv6_without_nat $algo
+}
+
 add_test_ipsec_natt_transport()
 {
-       local algo=$1
+       local proto=$1
+       local algo=$2
        local _algo=$(echo $algo | sed 's/-//g')
        local name= desc=
 
-       desc="Test IPsec NAT-T ($algo)"
-       name="ipsec_natt_transport_${_algo}"
+       desc="Test IPsec $proto NAT-T ($algo)"
+       name="ipsec_natt_transport_${proto}_${_algo}"
 
        atf_test_case ${name} cleanup
        eval "
@@ -353,7 +469,7 @@
                atf_set require.progs rump_server setkey nc
            }
            ${name}_body() {
-               test_ipsec_natt_transport $algo
+               test_ipsec_natt_transport_$proto $algo
                rump_server_destroy_ifaces
            }
            ${name}_cleanup() {
@@ -371,6 +487,7 @@
        local algo=
 
        for algo in $ESP_ENCRYPTION_ALGORITHMS_MINIMUM; do
-               add_test_ipsec_natt_transport $algo



Home | Main Index | Thread Index | Old Index