1 1.2 tih # $NetBSD: t_tunnel.sh,v 1.2 2020/08/29 07:22:49 tih Exp $ 2 1.1 riastrad # 3 1.1 riastrad # Copyright (c) 2018 Ryota Ozaki <ozaki.ryota (at] gmail.com> 4 1.1 riastrad # All rights reserved. 5 1.1 riastrad # 6 1.1 riastrad # Redistribution and use in source and binary forms, with or without 7 1.1 riastrad # modification, are permitted provided that the following conditions 8 1.1 riastrad # are met: 9 1.1 riastrad # 1. Redistributions of source code must retain the above copyright 10 1.1 riastrad # notice, this list of conditions and the following disclaimer. 11 1.1 riastrad # 2. Redistributions in binary form must reproduce the above copyright 12 1.1 riastrad # notice, this list of conditions and the following disclaimer in the 13 1.1 riastrad # documentation and/or other materials provided with the distribution. 14 1.1 riastrad # 15 1.1 riastrad # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 16 1.1 riastrad # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 17 1.1 riastrad # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 18 1.1 riastrad # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 19 1.1 riastrad # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 20 1.1 riastrad # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 21 1.1 riastrad # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 22 1.1 riastrad # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 23 1.1 riastrad # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 24 1.1 riastrad # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 25 1.1 riastrad # POSSIBILITY OF SUCH DAMAGE. 26 1.1 riastrad # 27 1.1 riastrad 28 1.1 riastrad BUS_LOCAL=bus_local 29 1.1 riastrad BUS_TUN=bus_tun 30 1.1 riastrad BUS_PEER=bus_peer 31 1.1 riastrad SOCK_LOCAL=unix://wg_local 32 1.1 riastrad SOCK_TUN_LOCAL=unix://wg_tun_local 33 1.1 riastrad SOCK_TUN_PEER=unix://wg_tun_peer 34 1.1 riastrad SOCK_PEER=unix://wg_peer 35 1.1 riastrad 36 1.1 riastrad escape_key() 37 1.1 riastrad { 38 1.1 riastrad 39 1.1 riastrad echo $1 | sed 's/\+/\\+/g' | sed 's|\/|\\/|g' 40 1.1 riastrad } 41 1.1 riastrad 42 1.1 riastrad setup_servers() 43 1.1 riastrad { 44 1.1 riastrad 45 1.1 riastrad rump_server_start $SOCK_LOCAL netinet6 46 1.1 riastrad rump_server_add_iface $SOCK_LOCAL shmif0 $BUS_LOCAL 47 1.1 riastrad 48 1.1 riastrad rump_server_crypto_start $SOCK_TUN_LOCAL netinet6 wg 49 1.1 riastrad rump_server_add_iface $SOCK_TUN_LOCAL shmif0 $BUS_LOCAL 50 1.1 riastrad rump_server_add_iface $SOCK_TUN_LOCAL shmif1 $BUS_TUN 51 1.1 riastrad 52 1.1 riastrad rump_server_crypto_start $SOCK_TUN_PEER netinet6 wg 53 1.1 riastrad rump_server_add_iface $SOCK_TUN_PEER shmif0 $BUS_PEER 54 1.1 riastrad rump_server_add_iface $SOCK_TUN_PEER shmif1 $BUS_TUN 55 1.1 riastrad 56 1.1 riastrad rump_server_start $SOCK_PEER netinet6 57 1.1 riastrad rump_server_add_iface $SOCK_PEER shmif0 $BUS_PEER 58 1.1 riastrad } 59 1.1 riastrad 60 1.1 riastrad setup_edge() 61 1.1 riastrad { 62 1.1 riastrad local ifconfig="atf_check -s exit:0 rump.ifconfig" 63 1.1 riastrad local proto=$1 64 1.1 riastrad local ip=$2 65 1.1 riastrad local prefix=$3 66 1.1 riastrad local gw=$4 67 1.1 riastrad local ip_bad=$5 68 1.1 riastrad local alias= 69 1.1 riastrad 70 1.1 riastrad atf_check -s exit:0 rump.sysctl -q -w net.inet.ip.dad_count=0 71 1.1 riastrad atf_check -s exit:0 rump.sysctl -q -w net.inet6.ip6.dad_count=0 72 1.1 riastrad $ifconfig shmif0 $proto $ip/$prefix 73 1.1 riastrad atf_check -s exit:0 -o ignore rump.route add -$proto default $gw 74 1.1 riastrad 75 1.1 riastrad if [ -z "$ip_bad" ]; then 76 1.1 riastrad return 77 1.1 riastrad fi 78 1.1 riastrad 79 1.1 riastrad if [ $proto = inet ]; then 80 1.1 riastrad alias="alias" 81 1.1 riastrad fi 82 1.1 riastrad 83 1.1 riastrad $ifconfig shmif0 $proto $ip_bad/$prefix $alias 84 1.1 riastrad } 85 1.1 riastrad 86 1.1 riastrad setup_ip() 87 1.1 riastrad { 88 1.1 riastrad local ifconfig="atf_check -s exit:0 rump.ifconfig" 89 1.1 riastrad local proto=$1 90 1.1 riastrad local ip=$2 91 1.1 riastrad local prefix=$3 92 1.1 riastrad 93 1.1 riastrad $ifconfig shmif0 $proto $ip/$prefix 94 1.1 riastrad } 95 1.1 riastrad setup_router() 96 1.1 riastrad { 97 1.1 riastrad 98 1.1 riastrad atf_check -s exit:0 rump.sysctl -q -w net.inet.ip.forwarding=1 99 1.1 riastrad atf_check -s exit:0 rump.sysctl -q -w net.inet6.ip6.forwarding=1 100 1.1 riastrad atf_check -s exit:0 rump.sysctl -q -w net.inet.ip.dad_count=0 101 1.1 riastrad atf_check -s exit:0 rump.sysctl -q -w net.inet6.ip6.dad_count=0 102 1.1 riastrad } 103 1.1 riastrad 104 1.1 riastrad setup_wg() 105 1.1 riastrad { 106 1.1 riastrad local ifconfig="atf_check -s exit:0 rump.ifconfig" 107 1.1 riastrad local wgconfig="atf_check -s exit:0 $HIJACKING wgconfig" 108 1.1 riastrad local proto=$1 109 1.1 riastrad local ip=$2 110 1.1 riastrad local prefix=$3 111 1.1 riastrad local port=$4 112 1.1 riastrad local key_priv="$5" 113 1.1 riastrad local privfile=./tmp 114 1.1 riastrad 115 1.1 riastrad $ifconfig wg0 create 116 1.1 riastrad $ifconfig wg0 $proto $ip/$prefix 117 1.1 riastrad $DEBUG && rump.netstat -nr 118 1.1 riastrad echo $key_priv > $privfile 119 1.1 riastrad $wgconfig wg0 set private-key $privfile 120 1.1 riastrad $wgconfig wg0 set listen-port $port 121 1.1 riastrad rm -f $privfile 122 1.1 riastrad $ifconfig wg0 up 123 1.1 riastrad 124 1.1 riastrad check_conf_port wg0 $port 125 1.1 riastrad check_conf_privkey wg0 "$key_priv" 126 1.1 riastrad } 127 1.1 riastrad 128 1.1 riastrad setup_wg_route() 129 1.1 riastrad { 130 1.1 riastrad local proto=$1 131 1.1 riastrad local subnet=$2 132 1.1 riastrad local subnet_bad=$3 133 1.1 riastrad 134 1.1 riastrad atf_check -s exit:0 -o ignore rump.route add -$proto -net $subnet -link wg0 -iface 135 1.1 riastrad if [ -n "$subnet_bad" ]; then 136 1.1 riastrad atf_check -s exit:0 -o ignore rump.route add -$proto -net $subnet_bad -link wg0 -iface 137 1.1 riastrad fi 138 1.1 riastrad } 139 1.1 riastrad 140 1.1 riastrad prepare_file() 141 1.1 riastrad { 142 1.1 riastrad local file=$1 143 1.1 riastrad local data="0123456789" 144 1.1 riastrad 145 1.1 riastrad touch $file 146 1.1 riastrad for i in `seq 1 200` 147 1.1 riastrad do 148 1.1 riastrad echo $data >> $file 149 1.1 riastrad done 150 1.1 riastrad } 151 1.1 riastrad 152 1.1 riastrad test_tcp() 153 1.1 riastrad { 154 1.1 riastrad local proto=$1 155 1.1 riastrad local ip_peer=$2 156 1.1 riastrad local _proto= 157 1.1 riastrad 158 1.1 riastrad prepare_file ./file_send 159 1.1 riastrad 160 1.1 riastrad if [ $proto = inet ]; then 161 1.1 riastrad _proto=ipv4 162 1.1 riastrad else 163 1.1 riastrad _proto=ipv6 164 1.1 riastrad fi 165 1.1 riastrad start_nc_server $SOCK_PEER 1234 ./file_recv $_proto 166 1.1 riastrad 167 1.1 riastrad export RUMP_SERVER=$SOCK_LOCAL 168 1.1 riastrad # Send a file to the server 169 1.1 riastrad # XXX Need a bit longer timeout value because the packet processing 170 1.1 riastrad # of the implementation is quite inefficient... 171 1.1 riastrad atf_check -s exit:0 $HIJACKING \ 172 1.1 riastrad nc -N -w 20 $ip_peer 1234 < ./file_send 173 1.1 riastrad $DEBUG && extract_new_packets $BUS > ./out 174 1.1 riastrad $DEBUG && cat ./out 175 1.1 riastrad stop_nc_server 176 1.1 riastrad $DEBUG && ls -s ./file_send ./file_recv 177 1.1 riastrad $DEBUG && wc -l ./file_send 178 1.1 riastrad $DEBUG && wc -l ./file_recv 179 1.1 riastrad $DEBUG && diff -u ./file_send ./file_recv 180 1.1 riastrad atf_check -s exit:0 diff -q ./file_send ./file_recv 181 1.1 riastrad rm -f ./out ./file_recv ./file_send 182 1.1 riastrad } 183 1.1 riastrad 184 1.1 riastrad wg_tunnel_common() 185 1.1 riastrad { 186 1.1 riastrad local outer_proto=$1 187 1.1 riastrad local inner_proto=$2 188 1.1 riastrad local ifconfig="atf_check -s exit:0 rump.ifconfig" 189 1.1 riastrad local wgconfig="atf_check -s exit:0 $HIJACKING wgconfig" 190 1.1 riastrad local port=51820 191 1.1 riastrad local ip_local= ip_peer= 192 1.1 riastrad local ip_wg_local= ip_wg_peer= 193 1.1 riastrad local outer_prefix= outer_prefixall= 194 1.1 riastrad local inner_prefix= inner_prefixall= 195 1.1 riastrad 196 1.1 riastrad if [ $outer_proto = inet ]; then 197 1.1 riastrad ip_tun_local_tun=192.168.10.1 198 1.1 riastrad ip_tun_peer_tun=192.168.10.2 199 1.1 riastrad outer_prefix=24 200 1.1 riastrad outer_prefixall=32 201 1.1 riastrad else 202 1.1 riastrad ip_tun_local_tun=fc00:10::1 203 1.1 riastrad ip_tun_peer_tun=fc00:10::2 204 1.1 riastrad outer_prefix=64 205 1.1 riastrad outer_prefixall=128 206 1.1 riastrad fi 207 1.1 riastrad 208 1.1 riastrad if [ $inner_proto = inet ]; then 209 1.1 riastrad ip_local=192.168.1.2 210 1.1 riastrad ip_tun_local=192.168.1.1 211 1.1 riastrad ip_wg_local=10.0.0.1 212 1.1 riastrad ip_wg_peer=10.0.0.2 213 1.1 riastrad ip_tun_peer=192.168.2.1 214 1.1 riastrad ip_peer=192.168.2.2 215 1.1 riastrad ip_peer_bad=192.168.3.2 216 1.1 riastrad inner_prefix=24 217 1.1 riastrad inner_prefixall=32 218 1.1 riastrad subnet_local=192.168.1.0/24 219 1.1 riastrad subnet_peer=192.168.2.0/24 220 1.1 riastrad subnet_peer_bad=192.168.3.0/24 221 1.1 riastrad else 222 1.1 riastrad ip_tun_local=fc00:1::1 223 1.1 riastrad ip_local=fc00:1::2 224 1.1 riastrad ip_wg_local=fd00::1 225 1.1 riastrad ip_wg_peer=fd00::2 226 1.1 riastrad ip_tun_peer=fc00:2::1 227 1.1 riastrad ip_peer=fc00:2::2 228 1.1 riastrad ip_peer_bad=fc00:3::2 229 1.1 riastrad inner_prefix=64 230 1.1 riastrad inner_prefixall=128 231 1.1 riastrad subnet_local=fc00:1::/64 232 1.1 riastrad subnet_peer=fc00:2::/64 233 1.1 riastrad subnet_peer_bad=fc00:3::/64 234 1.1 riastrad fi 235 1.1 riastrad 236 1.1 riastrad setup_servers 237 1.1 riastrad 238 1.1 riastrad # It sets key_priv_local key_pub_local key_priv_peer key_pub_peer 239 1.1 riastrad generate_keys 240 1.1 riastrad 241 1.1 riastrad export RUMP_SERVER=$SOCK_LOCAL 242 1.1 riastrad setup_edge $inner_proto $ip_local $inner_prefix $ip_tun_local 243 1.1 riastrad 244 1.1 riastrad export RUMP_SERVER=$SOCK_TUN_LOCAL 245 1.1 riastrad setup_router 246 1.1 riastrad $ifconfig shmif0 $inner_proto $ip_tun_local/$inner_prefix 247 1.1 riastrad $ifconfig shmif1 $outer_proto $ip_tun_local_tun/$outer_prefix 248 1.1 riastrad setup_wg $inner_proto $ip_wg_local $inner_prefix $port "$key_priv_local" 249 1.1 riastrad setup_wg_route $inner_proto $subnet_peer $subnet_peer_bad 250 1.1 riastrad 251 1.1 riastrad export RUMP_SERVER=$SOCK_TUN_PEER 252 1.1 riastrad setup_router 253 1.1 riastrad $ifconfig shmif0 $inner_proto $ip_tun_peer/$inner_prefix 254 1.1 riastrad $ifconfig shmif1 $outer_proto $ip_tun_peer_tun/$outer_prefix 255 1.1 riastrad setup_wg $inner_proto $ip_wg_peer $inner_prefix $port "$key_priv_peer" 256 1.1 riastrad setup_wg_route $inner_proto $subnet_local 257 1.1 riastrad 258 1.1 riastrad export RUMP_SERVER=$SOCK_PEER 259 1.1 riastrad setup_edge $inner_proto $ip_peer $inner_prefix $ip_tun_peer $ip_peer_bad 260 1.1 riastrad 261 1.1 riastrad export RUMP_SERVER=$SOCK_TUN_LOCAL 262 1.1 riastrad add_peer wg0 peer0 $key_pub_peer $ip_tun_peer_tun:$port \ 263 1.1 riastrad $ip_wg_peer/$inner_prefixall,$subnet_peer 264 1.1 riastrad 265 1.1 riastrad export RUMP_SERVER=$SOCK_TUN_PEER 266 1.1 riastrad add_peer wg0 peer0 $key_pub_local $ip_tun_local_tun:$port \ 267 1.1 riastrad $ip_wg_local/$inner_prefixall,$subnet_local 268 1.1 riastrad 269 1.1 riastrad export RUMP_SERVER=$SOCK_TUN_LOCAL 270 1.2 tih atf_check -s exit:0 -o match:"latest-handshake: \(never\)" \ 271 1.1 riastrad $HIJACKING wgconfig wg0 show peer peer0 272 1.1 riastrad 273 1.1 riastrad export RUMP_SERVER=$SOCK_LOCAL 274 1.1 riastrad check_ping $inner_proto $ip_peer 275 1.1 riastrad 276 1.1 riastrad export RUMP_SERVER=$SOCK_TUN_LOCAL 277 1.2 tih atf_check -s exit:0 -o not-match:"latest-handshake: \(never\)" \ 278 1.1 riastrad $HIJACKING wgconfig wg0 show peer peer0 279 1.1 riastrad 280 1.1 riastrad export RUMP_SERVER=$SOCK_LOCAL 281 1.1 riastrad # ping fails because the subnet of the IP is not allowed 282 1.1 riastrad check_ping_fail $inner_proto $ip_peer_bad 283 1.1 riastrad 284 1.1 riastrad # 285 1.1 riastrad # Test TCP stream over the tunnel 286 1.1 riastrad # 287 1.1 riastrad test_tcp $inner_proto $ip_peer 288 1.1 riastrad 289 1.1 riastrad export RUMP_SERVER=$SOCK_TUN_LOCAL 290 1.1 riastrad $ifconfig wg0 destroy 291 1.1 riastrad export RUMP_SERVER=$SOCK_TUN_PEER 292 1.1 riastrad $ifconfig wg0 destroy 293 1.1 riastrad } 294 1.1 riastrad 295 1.1 riastrad add_tunnel_test() 296 1.1 riastrad { 297 1.1 riastrad local inner=$1 298 1.1 riastrad local outer=$2 299 1.1 riastrad local ipv4=inet 300 1.1 riastrad local ipv6=inet6 301 1.1 riastrad 302 1.1 riastrad name="wg_tunnel_${inner}_over_${outer}" 303 1.1 riastrad fulldesc="Test wg(4) with ${inner} over ${outer}" 304 1.1 riastrad 305 1.1 riastrad eval inner=\$$inner 306 1.1 riastrad eval outer=\$$outer 307 1.1 riastrad 308 1.1 riastrad atf_test_case ${name} cleanup 309 1.1 riastrad eval " 310 1.1 riastrad ${name}_head() { 311 1.1 riastrad atf_set descr \"${fulldesc}\" 312 1.1 riastrad atf_set require.progs rump_server wgconfig wg-keygen 313 1.1 riastrad } 314 1.1 riastrad ${name}_body() { 315 1.1 riastrad wg_tunnel_common $outer $inner 316 1.1 riastrad rump_server_destroy_ifaces 317 1.1 riastrad } 318 1.1 riastrad ${name}_cleanup() { 319 1.1 riastrad \$DEBUG && dump 320 1.1 riastrad cleanup 321 1.1 riastrad }" 322 1.1 riastrad atf_add_test_case ${name} 323 1.1 riastrad } 324 1.1 riastrad 325 1.1 riastrad atf_init_test_cases() 326 1.1 riastrad { 327 1.1 riastrad 328 1.1 riastrad add_tunnel_test ipv4 ipv4 329 1.1 riastrad add_tunnel_test ipv4 ipv6 330 1.1 riastrad add_tunnel_test ipv6 ipv4 331 1.1 riastrad add_tunnel_test ipv6 ipv6 332 1.1 riastrad } 333