Back to home page

OSCL-LXR

 
 

    


0001 #!/bin/bash
0002 # SPDX-License-Identifier: GPL-2.0
0003 #
0004 # L2TPv3 tunnel between 2 hosts
0005 #
0006 #            host-1          |   router   |     host-2
0007 #                            |            |
0008 #      lo          l2tp      |            |      l2tp           lo
0009 # 172.16.101.1  172.16.1.1   |            | 172.16.1.2    172.16.101.2
0010 #  fc00:101::1   fc00:1::1   |            |   fc00:1::2    fc00:101::2
0011 #                            |            |
0012 #                  eth0      |            |     eth0
0013 #                10.1.1.1    |            |   10.1.2.1
0014 #              2001:db8:1::1 |            | 2001:db8:2::1
0015 
0016 VERBOSE=0
0017 PAUSE_ON_FAIL=no
0018 
0019 which ping6 > /dev/null 2>&1 && ping6=$(which ping6) || ping6=$(which ping)
0020 
0021 ################################################################################
0022 #
0023 log_test()
0024 {
0025         local rc=$1
0026         local expected=$2
0027         local msg="$3"
0028 
0029         if [ ${rc} -eq ${expected} ]; then
0030                 printf "TEST: %-60s  [ OK ]\n" "${msg}"
0031                 nsuccess=$((nsuccess+1))
0032         else
0033                 ret=1
0034                 nfail=$((nfail+1))
0035                 printf "TEST: %-60s  [FAIL]\n" "${msg}"
0036                 if [ "${PAUSE_ON_FAIL}" = "yes" ]; then
0037                         echo
0038                         echo "hit enter to continue, 'q' to quit"
0039                         read a
0040                         [ "$a" = "q" ] && exit 1
0041                 fi
0042         fi
0043 }
0044 
0045 run_cmd()
0046 {
0047         local ns
0048         local cmd
0049         local out
0050         local rc
0051 
0052         ns="$1"
0053         shift
0054         cmd="$*"
0055 
0056         if [ "$VERBOSE" = "1" ]; then
0057                 printf "    COMMAND: $cmd\n"
0058         fi
0059 
0060         out=$(eval ip netns exec ${ns} ${cmd} 2>&1)
0061         rc=$?
0062         if [ "$VERBOSE" = "1" -a -n "$out" ]; then
0063                 echo "    $out"
0064         fi
0065 
0066         [ "$VERBOSE" = "1" ] && echo
0067 
0068         return $rc
0069 }
0070 
0071 ################################################################################
0072 # create namespaces and interconnects
0073 
0074 create_ns()
0075 {
0076         local ns=$1
0077         local addr=$2
0078         local addr6=$3
0079 
0080         [ -z "${addr}" ] && addr="-"
0081         [ -z "${addr6}" ] && addr6="-"
0082 
0083         ip netns add ${ns}
0084 
0085         ip -netns ${ns} link set lo up
0086         if [ "${addr}" != "-" ]; then
0087                 ip -netns ${ns} addr add dev lo ${addr}
0088         fi
0089         if [ "${addr6}" != "-" ]; then
0090                 ip -netns ${ns} -6 addr add dev lo ${addr6}
0091         fi
0092 
0093         ip -netns ${ns} ro add unreachable default metric 8192
0094         ip -netns ${ns} -6 ro add unreachable default metric 8192
0095 
0096         ip netns exec ${ns} sysctl -qw net.ipv4.ip_forward=1
0097         ip netns exec ${ns} sysctl -qw net.ipv6.conf.all.keep_addr_on_down=1
0098         ip netns exec ${ns} sysctl -qw net.ipv6.conf.all.forwarding=1
0099         ip netns exec ${ns} sysctl -qw net.ipv6.conf.default.forwarding=1
0100         ip netns exec ${ns} sysctl -qw net.ipv6.conf.default.accept_dad=0
0101 }
0102 
0103 # create veth pair to connect namespaces and apply addresses.
0104 connect_ns()
0105 {
0106         local ns1=$1
0107         local ns1_dev=$2
0108         local ns1_addr=$3
0109         local ns1_addr6=$4
0110         local ns2=$5
0111         local ns2_dev=$6
0112         local ns2_addr=$7
0113         local ns2_addr6=$8
0114 
0115         ip -netns ${ns1} li add ${ns1_dev} type veth peer name tmp
0116         ip -netns ${ns1} li set ${ns1_dev} up
0117         ip -netns ${ns1} li set tmp netns ${ns2} name ${ns2_dev}
0118         ip -netns ${ns2} li set ${ns2_dev} up
0119 
0120         if [ "${ns1_addr}" != "-" ]; then
0121                 ip -netns ${ns1} addr add dev ${ns1_dev} ${ns1_addr}
0122                 ip -netns ${ns2} addr add dev ${ns2_dev} ${ns2_addr}
0123         fi
0124 
0125         if [ "${ns1_addr6}" != "-" ]; then
0126                 ip -netns ${ns1} addr add dev ${ns1_dev} ${ns1_addr6}
0127                 ip -netns ${ns2} addr add dev ${ns2_dev} ${ns2_addr6}
0128         fi
0129 }
0130 
0131 ################################################################################
0132 # test setup
0133 
0134 cleanup()
0135 {
0136         local ns
0137 
0138         for ns in host-1 host-2 router
0139         do
0140                 ip netns del ${ns} 2>/dev/null
0141         done
0142 }
0143 
0144 setup_l2tp_ipv4()
0145 {
0146         #
0147         # configure l2tpv3 tunnel on host-1
0148         #
0149         ip -netns host-1 l2tp add tunnel tunnel_id 1041 peer_tunnel_id 1042 \
0150                          encap ip local 10.1.1.1 remote 10.1.2.1
0151         ip -netns host-1 l2tp add session name l2tp4 tunnel_id 1041 \
0152                          session_id 1041 peer_session_id 1042
0153         ip -netns host-1 link set dev l2tp4 up
0154         ip -netns host-1 addr add dev l2tp4 172.16.1.1 peer 172.16.1.2
0155 
0156         #
0157         # configure l2tpv3 tunnel on host-2
0158         #
0159         ip -netns host-2 l2tp add tunnel tunnel_id 1042 peer_tunnel_id 1041 \
0160                          encap ip local 10.1.2.1 remote 10.1.1.1
0161         ip -netns host-2 l2tp add session name l2tp4 tunnel_id 1042 \
0162                          session_id 1042 peer_session_id 1041
0163         ip -netns host-2 link set dev l2tp4 up
0164         ip -netns host-2 addr add dev l2tp4 172.16.1.2 peer 172.16.1.1
0165 
0166         #
0167         # add routes to loopback addresses
0168         #
0169         ip -netns host-1 ro add 172.16.101.2/32 via 172.16.1.2
0170         ip -netns host-2 ro add 172.16.101.1/32 via 172.16.1.1
0171 }
0172 
0173 setup_l2tp_ipv6()
0174 {
0175         #
0176         # configure l2tpv3 tunnel on host-1
0177         #
0178         ip -netns host-1 l2tp add tunnel tunnel_id 1061 peer_tunnel_id 1062 \
0179                          encap ip local 2001:db8:1::1 remote 2001:db8:2::1
0180         ip -netns host-1 l2tp add session name l2tp6 tunnel_id 1061 \
0181                          session_id 1061 peer_session_id 1062
0182         ip -netns host-1 link set dev l2tp6 up
0183         ip -netns host-1 addr add dev l2tp6 fc00:1::1 peer fc00:1::2
0184 
0185         #
0186         # configure l2tpv3 tunnel on host-2
0187         #
0188         ip -netns host-2 l2tp add tunnel tunnel_id 1062 peer_tunnel_id 1061 \
0189                          encap ip local 2001:db8:2::1 remote 2001:db8:1::1
0190         ip -netns host-2 l2tp add session name l2tp6 tunnel_id 1062 \
0191                          session_id 1062 peer_session_id 1061
0192         ip -netns host-2 link set dev l2tp6 up
0193         ip -netns host-2 addr add dev l2tp6 fc00:1::2 peer fc00:1::1
0194 
0195         #
0196         # add routes to loopback addresses
0197         #
0198         ip -netns host-1 -6 ro add fc00:101::2/128 via fc00:1::2
0199         ip -netns host-2 -6 ro add fc00:101::1/128 via fc00:1::1
0200 }
0201 
0202 setup()
0203 {
0204         # start clean
0205         cleanup
0206 
0207         set -e
0208         create_ns host-1 172.16.101.1/32 fc00:101::1/128
0209         create_ns host-2 172.16.101.2/32 fc00:101::2/128
0210         create_ns router
0211 
0212         connect_ns host-1 eth0 10.1.1.1/24 2001:db8:1::1/64 \
0213                    router eth1 10.1.1.2/24 2001:db8:1::2/64
0214 
0215         connect_ns host-2 eth0 10.1.2.1/24 2001:db8:2::1/64 \
0216                    router eth2 10.1.2.2/24 2001:db8:2::2/64
0217 
0218         ip -netns host-1 ro add 10.1.2.0/24 via 10.1.1.2
0219         ip -netns host-1 -6 ro add 2001:db8:2::/64 via 2001:db8:1::2
0220 
0221         ip -netns host-2 ro add 10.1.1.0/24 via 10.1.2.2
0222         ip -netns host-2 -6 ro add 2001:db8:1::/64 via 2001:db8:2::2
0223 
0224         setup_l2tp_ipv4
0225         setup_l2tp_ipv6
0226         set +e
0227 }
0228 
0229 setup_ipsec()
0230 {
0231         #
0232         # IPv4
0233         #
0234         run_cmd host-1 ip xfrm policy add \
0235                 src 10.1.1.1 dst 10.1.2.1 dir out \
0236                 tmpl proto esp mode transport
0237 
0238         run_cmd host-1 ip xfrm policy add \
0239                 src 10.1.2.1 dst 10.1.1.1 dir in \
0240                 tmpl proto esp mode transport
0241 
0242         run_cmd host-2 ip xfrm policy add \
0243                 src 10.1.1.1 dst 10.1.2.1 dir in \
0244                 tmpl proto esp mode transport
0245 
0246         run_cmd host-2 ip xfrm policy add \
0247                 src 10.1.2.1 dst 10.1.1.1 dir out \
0248                 tmpl proto esp mode transport
0249 
0250         ip -netns host-1 xfrm state add \
0251                 src 10.1.1.1 dst 10.1.2.1 \
0252                 spi 0x1000 proto esp aead 'rfc4106(gcm(aes))' \
0253                 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f 128 mode transport
0254 
0255         ip -netns host-1 xfrm state add \
0256                 src 10.1.2.1 dst 10.1.1.1 \
0257                 spi 0x1001 proto esp aead 'rfc4106(gcm(aes))' \
0258                 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f 128 mode transport
0259 
0260         ip -netns host-2 xfrm state add \
0261                 src 10.1.1.1 dst 10.1.2.1 \
0262                 spi 0x1000 proto esp aead 'rfc4106(gcm(aes))' \
0263                 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f 128 mode transport
0264 
0265         ip -netns host-2 xfrm state add \
0266                 src 10.1.2.1 dst 10.1.1.1 \
0267                 spi 0x1001 proto esp aead 'rfc4106(gcm(aes))' \
0268                 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f 128 mode transport
0269 
0270         #
0271         # IPV6
0272         #
0273         run_cmd host-1 ip -6 xfrm policy add \
0274                 src 2001:db8:1::1 dst 2001:db8:2::1 dir out \
0275                 tmpl proto esp mode transport
0276 
0277         run_cmd host-1 ip -6 xfrm policy add \
0278                 src 2001:db8:2::1 dst 2001:db8:1::1 dir in \
0279                 tmpl proto esp mode transport
0280 
0281         run_cmd host-2 ip -6 xfrm policy add \
0282                 src 2001:db8:1::1 dst 2001:db8:2::1 dir in \
0283                 tmpl proto esp mode transport
0284 
0285         run_cmd host-2 ip -6 xfrm policy add \
0286                 src 2001:db8:2::1 dst 2001:db8:1::1 dir out \
0287                 tmpl proto esp mode transport
0288 
0289         ip -netns host-1 -6 xfrm state add \
0290                 src 2001:db8:1::1 dst 2001:db8:2::1 \
0291                 spi 0x1000 proto esp aead 'rfc4106(gcm(aes))' \
0292                 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f 128 mode transport
0293 
0294         ip -netns host-1 -6 xfrm state add \
0295                 src 2001:db8:2::1 dst 2001:db8:1::1 \
0296                 spi 0x1001 proto esp aead 'rfc4106(gcm(aes))' \
0297                 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f 128 mode transport
0298 
0299         ip -netns host-2 -6 xfrm state add \
0300                 src 2001:db8:1::1 dst 2001:db8:2::1 \
0301                 spi 0x1000 proto esp aead 'rfc4106(gcm(aes))' \
0302                 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f 128 mode transport
0303 
0304         ip -netns host-2 -6 xfrm state add \
0305                 src 2001:db8:2::1 dst 2001:db8:1::1 \
0306                 spi 0x1001 proto esp aead 'rfc4106(gcm(aes))' \
0307                 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f 128 mode transport
0308 }
0309 
0310 teardown_ipsec()
0311 {
0312         run_cmd host-1 ip xfrm state flush
0313         run_cmd host-1 ip xfrm policy flush
0314         run_cmd host-2 ip xfrm state flush
0315         run_cmd host-2 ip xfrm policy flush
0316 }
0317 
0318 ################################################################################
0319 # generate traffic through tunnel for various cases
0320 
0321 run_ping()
0322 {
0323         local desc="$1"
0324 
0325         run_cmd host-1 ping -c1 -w1 172.16.1.2
0326         log_test $? 0 "IPv4 basic L2TP tunnel ${desc}"
0327 
0328         run_cmd host-1 ping -c1 -w1 -I 172.16.101.1 172.16.101.2
0329         log_test $? 0 "IPv4 route through L2TP tunnel ${desc}"
0330 
0331         run_cmd host-1 ${ping6} -c1 -w1 fc00:1::2
0332         log_test $? 0 "IPv6 basic L2TP tunnel ${desc}"
0333 
0334         run_cmd host-1 ${ping6} -c1 -w1 -I fc00:101::1 fc00:101::2
0335         log_test $? 0 "IPv6 route through L2TP tunnel ${desc}"
0336 }
0337 
0338 run_tests()
0339 {
0340         local desc
0341 
0342         setup
0343         run_ping
0344 
0345         setup_ipsec
0346         run_ping "- with IPsec"
0347         run_cmd host-1 ping -c1 -w1 172.16.1.2
0348         log_test $? 0 "IPv4 basic L2TP tunnel ${desc}"
0349 
0350         run_cmd host-1 ping -c1 -w1 -I 172.16.101.1 172.16.101.2
0351         log_test $? 0 "IPv4 route through L2TP tunnel ${desc}"
0352 
0353         run_cmd host-1 ${ping6} -c1 -w1 fc00:1::2
0354         log_test $? 0 "IPv6 basic L2TP tunnel - with IPsec"
0355 
0356         run_cmd host-1 ${ping6} -c1 -w1 -I fc00:101::1 fc00:101::2
0357         log_test $? 0 "IPv6 route through L2TP tunnel - with IPsec"
0358 
0359         teardown_ipsec
0360         run_ping "- after IPsec teardown"
0361 }
0362 
0363 ################################################################################
0364 # main
0365 
0366 declare -i nfail=0
0367 declare -i nsuccess=0
0368 
0369 while getopts :pv o
0370 do
0371         case $o in
0372                 p) PAUSE_ON_FAIL=yes;;
0373                 v) VERBOSE=$(($VERBOSE + 1));;
0374                 *) exit 1;;
0375         esac
0376 done
0377 
0378 run_tests
0379 cleanup
0380 
0381 printf "\nTests passed: %3d\n" ${nsuccess}
0382 printf "Tests failed: %3d\n"   ${nfail}