1#!/bin/bash 2# SPDX-License-Identifier: GPL-2.0 3# 4# L2TPv3 tunnel between 2 hosts 5# 6# host-1 | router | host-2 7# | | 8# lo l2tp | | l2tp lo 9# 172.16.101.1 172.16.1.1 | | 172.16.1.2 172.16.101.2 10# fc00:101::1 fc00:1::1 | | fc00:1::2 fc00:101::2 11# | | 12# eth0 | | eth0 13# 10.1.1.1 | | 10.1.2.1 14# 2001:db8:1::1 | | 2001:db8:2::1 15 16source lib.sh 17VERBOSE=0 18PAUSE_ON_FAIL=no 19 20which ping6 > /dev/null 2>&1 && ping6=$(which ping6) || ping6=$(which ping) 21 22################################################################################ 23# 24log_test() 25{ 26 log_test_expected "$1" "$2" "$3" 27} 28 29run_cmd() 30{ 31 local ns 32 local cmd 33 local out 34 local rc 35 36 ns="$1" 37 shift 38 cmd="$*" 39 40 if [ "$VERBOSE" = "1" ]; then 41 printf " COMMAND: $cmd\n" 42 fi 43 44 out=$(eval ip netns exec ${ns} ${cmd} 2>&1) 45 rc=$? 46 if [ "$VERBOSE" = "1" -a -n "$out" ]; then 47 echo " $out" 48 fi 49 50 [ "$VERBOSE" = "1" ] && echo 51 52 return $rc 53} 54 55################################################################################ 56# create namespaces and interconnects 57 58create_ns() 59{ 60 local ns=$1 61 local addr=$2 62 local addr6=$3 63 64 [ -z "${addr}" ] && addr="-" 65 [ -z "${addr6}" ] && addr6="-" 66 67 if [ "${addr}" != "-" ]; then 68 ip -netns ${ns} addr add dev lo ${addr} 69 fi 70 if [ "${addr6}" != "-" ]; then 71 ip -netns ${ns} -6 addr add dev lo ${addr6} 72 fi 73 74 ip -netns ${ns} ro add unreachable default metric 8192 75 ip -netns ${ns} -6 ro add unreachable default metric 8192 76 77 ip netns exec ${ns} sysctl -qw net.ipv4.ip_forward=1 78 ip netns exec ${ns} sysctl -qw net.ipv6.conf.all.keep_addr_on_down=1 79 ip netns exec ${ns} sysctl -qw net.ipv6.conf.all.forwarding=1 80 ip netns exec ${ns} sysctl -qw net.ipv6.conf.default.forwarding=1 81 ip netns exec ${ns} sysctl -qw net.ipv6.conf.default.accept_dad=0 82} 83 84# create veth pair to connect namespaces and apply addresses. 85connect_ns() 86{ 87 local ns1=$1 88 local ns1_dev=$2 89 local ns1_addr=$3 90 local ns1_addr6=$4 91 local ns2=$5 92 local ns2_dev=$6 93 local ns2_addr=$7 94 local ns2_addr6=$8 95 96 ip -netns ${ns1} li add ${ns1_dev} type veth peer name tmp 97 ip -netns ${ns1} li set ${ns1_dev} up 98 ip -netns ${ns1} li set tmp netns ${ns2} name ${ns2_dev} 99 ip -netns ${ns2} li set ${ns2_dev} up 100 101 if [ "${ns1_addr}" != "-" ]; then 102 ip -netns ${ns1} addr add dev ${ns1_dev} ${ns1_addr} 103 ip -netns ${ns2} addr add dev ${ns2_dev} ${ns2_addr} 104 fi 105 106 if [ "${ns1_addr6}" != "-" ]; then 107 ip -netns ${ns1} addr add dev ${ns1_dev} ${ns1_addr6} 108 ip -netns ${ns2} addr add dev ${ns2_dev} ${ns2_addr6} 109 fi 110} 111 112################################################################################ 113# test setup 114 115cleanup() 116{ 117 cleanup_ns $host_1 $host_2 $router 118} 119 120setup_l2tp_ipv4() 121{ 122 # 123 # configure l2tpv3 tunnel on host-1 124 # 125 ip -netns $host_1 l2tp add tunnel tunnel_id 1041 peer_tunnel_id 1042 \ 126 encap ip local 10.1.1.1 remote 10.1.2.1 127 ip -netns $host_1 l2tp add session name l2tp4 tunnel_id 1041 \ 128 session_id 1041 peer_session_id 1042 129 ip -netns $host_1 link set dev l2tp4 up 130 ip -netns $host_1 addr add dev l2tp4 172.16.1.1 peer 172.16.1.2 131 132 # 133 # configure l2tpv3 tunnel on host-2 134 # 135 ip -netns $host_2 l2tp add tunnel tunnel_id 1042 peer_tunnel_id 1041 \ 136 encap ip local 10.1.2.1 remote 10.1.1.1 137 ip -netns $host_2 l2tp add session name l2tp4 tunnel_id 1042 \ 138 session_id 1042 peer_session_id 1041 139 ip -netns $host_2 link set dev l2tp4 up 140 ip -netns $host_2 addr add dev l2tp4 172.16.1.2 peer 172.16.1.1 141 142 # 143 # add routes to loopback addresses 144 # 145 ip -netns $host_1 ro add 172.16.101.2/32 via 172.16.1.2 146 ip -netns $host_2 ro add 172.16.101.1/32 via 172.16.1.1 147} 148 149setup_l2tp_ipv6() 150{ 151 # 152 # configure l2tpv3 tunnel on host-1 153 # 154 ip -netns $host_1 l2tp add tunnel tunnel_id 1061 peer_tunnel_id 1062 \ 155 encap ip local 2001:db8:1::1 remote 2001:db8:2::1 156 ip -netns $host_1 l2tp add session name l2tp6 tunnel_id 1061 \ 157 session_id 1061 peer_session_id 1062 158 ip -netns $host_1 link set dev l2tp6 up 159 ip -netns $host_1 addr add dev l2tp6 fc00:1::1 peer fc00:1::2 160 161 # 162 # configure l2tpv3 tunnel on host-2 163 # 164 ip -netns $host_2 l2tp add tunnel tunnel_id 1062 peer_tunnel_id 1061 \ 165 encap ip local 2001:db8:2::1 remote 2001:db8:1::1 166 ip -netns $host_2 l2tp add session name l2tp6 tunnel_id 1062 \ 167 session_id 1062 peer_session_id 1061 168 ip -netns $host_2 link set dev l2tp6 up 169 ip -netns $host_2 addr add dev l2tp6 fc00:1::2 peer fc00:1::1 170 171 # 172 # add routes to loopback addresses 173 # 174 ip -netns $host_1 -6 ro add fc00:101::2/128 via fc00:1::2 175 ip -netns $host_2 -6 ro add fc00:101::1/128 via fc00:1::1 176} 177 178setup() 179{ 180 # start clean 181 cleanup 182 183 set -e 184 setup_ns host_1 host_2 router 185 create_ns $host_1 172.16.101.1/32 fc00:101::1/128 186 create_ns $host_2 172.16.101.2/32 fc00:101::2/128 187 create_ns $router 188 189 connect_ns $host_1 eth0 10.1.1.1/24 2001:db8:1::1/64 \ 190 $router eth1 10.1.1.2/24 2001:db8:1::2/64 191 192 connect_ns $host_2 eth0 10.1.2.1/24 2001:db8:2::1/64 \ 193 $router eth2 10.1.2.2/24 2001:db8:2::2/64 194 195 ip -netns $host_1 ro add 10.1.2.0/24 via 10.1.1.2 196 ip -netns $host_1 -6 ro add 2001:db8:2::/64 via 2001:db8:1::2 197 198 ip -netns $host_2 ro add 10.1.1.0/24 via 10.1.2.2 199 ip -netns $host_2 -6 ro add 2001:db8:1::/64 via 2001:db8:2::2 200 201 setup_l2tp_ipv4 202 setup_l2tp_ipv6 203 set +e 204} 205 206setup_ipsec() 207{ 208 # 209 # IPv4 210 # 211 run_cmd $host_1 ip xfrm policy add \ 212 src 10.1.1.1 dst 10.1.2.1 dir out \ 213 tmpl proto esp mode transport 214 215 run_cmd $host_1 ip xfrm policy add \ 216 src 10.1.2.1 dst 10.1.1.1 dir in \ 217 tmpl proto esp mode transport 218 219 run_cmd $host_2 ip xfrm policy add \ 220 src 10.1.1.1 dst 10.1.2.1 dir in \ 221 tmpl proto esp mode transport 222 223 run_cmd $host_2 ip xfrm policy add \ 224 src 10.1.2.1 dst 10.1.1.1 dir out \ 225 tmpl proto esp mode transport 226 227 ip -netns $host_1 xfrm state add \ 228 src 10.1.1.1 dst 10.1.2.1 \ 229 spi 0x1000 proto esp aead 'rfc4106(gcm(aes))' \ 230 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f 128 mode transport 231 232 ip -netns $host_1 xfrm state add \ 233 src 10.1.2.1 dst 10.1.1.1 \ 234 spi 0x1001 proto esp aead 'rfc4106(gcm(aes))' \ 235 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f 128 mode transport 236 237 ip -netns $host_2 xfrm state add \ 238 src 10.1.1.1 dst 10.1.2.1 \ 239 spi 0x1000 proto esp aead 'rfc4106(gcm(aes))' \ 240 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f 128 mode transport 241 242 ip -netns $host_2 xfrm state add \ 243 src 10.1.2.1 dst 10.1.1.1 \ 244 spi 0x1001 proto esp aead 'rfc4106(gcm(aes))' \ 245 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f 128 mode transport 246 247 # 248 # IPV6 249 # 250 run_cmd $host_1 ip -6 xfrm policy add \ 251 src 2001:db8:1::1 dst 2001:db8:2::1 dir out \ 252 tmpl proto esp mode transport 253 254 run_cmd $host_1 ip -6 xfrm policy add \ 255 src 2001:db8:2::1 dst 2001:db8:1::1 dir in \ 256 tmpl proto esp mode transport 257 258 run_cmd $host_2 ip -6 xfrm policy add \ 259 src 2001:db8:1::1 dst 2001:db8:2::1 dir in \ 260 tmpl proto esp mode transport 261 262 run_cmd $host_2 ip -6 xfrm policy add \ 263 src 2001:db8:2::1 dst 2001:db8:1::1 dir out \ 264 tmpl proto esp mode transport 265 266 ip -netns $host_1 -6 xfrm state add \ 267 src 2001:db8:1::1 dst 2001:db8:2::1 \ 268 spi 0x1000 proto esp aead 'rfc4106(gcm(aes))' \ 269 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f 128 mode transport 270 271 ip -netns $host_1 -6 xfrm state add \ 272 src 2001:db8:2::1 dst 2001:db8:1::1 \ 273 spi 0x1001 proto esp aead 'rfc4106(gcm(aes))' \ 274 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f 128 mode transport 275 276 ip -netns $host_2 -6 xfrm state add \ 277 src 2001:db8:1::1 dst 2001:db8:2::1 \ 278 spi 0x1000 proto esp aead 'rfc4106(gcm(aes))' \ 279 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f 128 mode transport 280 281 ip -netns $host_2 -6 xfrm state add \ 282 src 2001:db8:2::1 dst 2001:db8:1::1 \ 283 spi 0x1001 proto esp aead 'rfc4106(gcm(aes))' \ 284 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f 128 mode transport 285} 286 287teardown_ipsec() 288{ 289 run_cmd $host_1 ip xfrm state flush 290 run_cmd $host_1 ip xfrm policy flush 291 run_cmd $host_2 ip xfrm state flush 292 run_cmd $host_2 ip xfrm policy flush 293} 294 295################################################################################ 296# generate traffic through tunnel for various cases 297 298run_ping() 299{ 300 local desc="$1" 301 302 run_cmd $host_1 ping -c1 -w1 172.16.1.2 303 log_test $? 0 "IPv4 basic L2TP tunnel ${desc}" 304 305 run_cmd $host_1 ping -c1 -w1 -I 172.16.101.1 172.16.101.2 306 log_test $? 0 "IPv4 route through L2TP tunnel ${desc}" 307 308 run_cmd $host_1 ${ping6} -c1 -w1 fc00:1::2 309 log_test $? 0 "IPv6 basic L2TP tunnel ${desc}" 310 311 run_cmd $host_1 ${ping6} -c1 -w1 -I fc00:101::1 fc00:101::2 312 log_test $? 0 "IPv6 route through L2TP tunnel ${desc}" 313} 314 315run_tests() 316{ 317 local desc 318 319 setup 320 run_ping 321 322 setup_ipsec 323 run_ping "- with IPsec" 324 run_cmd $host_1 ping -c1 -w1 172.16.1.2 325 log_test $? 0 "IPv4 basic L2TP tunnel ${desc}" 326 327 run_cmd $host_1 ping -c1 -w1 -I 172.16.101.1 172.16.101.2 328 log_test $? 0 "IPv4 route through L2TP tunnel ${desc}" 329 330 run_cmd $host_1 ${ping6} -c1 -w1 fc00:1::2 331 log_test $? 0 "IPv6 basic L2TP tunnel - with IPsec" 332 333 run_cmd $host_1 ${ping6} -c1 -w1 -I fc00:101::1 fc00:101::2 334 log_test $? 0 "IPv6 route through L2TP tunnel - with IPsec" 335 336 teardown_ipsec 337 run_ping "- after IPsec teardown" 338} 339 340################################################################################ 341# main 342 343declare -i nfail=0 344declare -i nsuccess=0 345 346while getopts :pv o 347do 348 case $o in 349 p) PAUSE_ON_FAIL=yes;; 350 v) VERBOSE=$(($VERBOSE + 1));; 351 *) exit 1;; 352 esac 353done 354 355run_tests 356cleanup 357 358printf "\nTests passed: %3d\n" ${nsuccess} 359printf "Tests failed: %3d\n" ${nfail} 360