1#!/bin/bash 2# SPDX-License-Identifier: GPL-2.0 3# Copyright (C) 2020-2025 OpenVPN, Inc. 4# 5# Author: Antonio Quartulli <antonio@openvpn.net> 6 7UDP_PEERS_FILE=${UDP_PEERS_FILE:-udp_peers.txt} 8TCP_PEERS_FILE=${TCP_PEERS_FILE:-tcp_peers.txt} 9OVPN_CLI=${OVPN_CLI:-./ovpn-cli} 10ALG=${ALG:-aes} 11PROTO=${PROTO:-UDP} 12FLOAT=${FLOAT:-0} 13 14LAN_IP="11.11.11.11" 15 16create_ns() { 17 ip netns add peer${1} 18} 19 20setup_ns() { 21 MODE="P2P" 22 23 if [ ${1} -eq 0 ]; then 24 MODE="MP" 25 for p in $(seq 1 ${NUM_PEERS}); do 26 ip link add veth${p} netns peer0 type veth peer name veth${p} netns peer${p} 27 28 ip -n peer0 addr add 10.10.${p}.1/24 dev veth${p} 29 ip -n peer0 addr add fd00:0:0:${p}::1/64 dev veth${p} 30 ip -n peer0 link set veth${p} up 31 32 ip -n peer${p} addr add 10.10.${p}.2/24 dev veth${p} 33 ip -n peer${p} addr add fd00:0:0:${p}::2/64 dev veth${p} 34 ip -n peer${p} link set veth${p} up 35 done 36 fi 37 38 ip netns exec peer${1} ${OVPN_CLI} new_iface tun${1} $MODE 39 ip -n peer${1} addr add ${2} dev tun${1} 40 # add a secondary IP to peer 1, to test a LAN behind a client 41 if [ ${1} -eq 1 -a -n "${LAN_IP}" ]; then 42 ip -n peer${1} addr add ${LAN_IP} dev tun${1} 43 ip -n peer0 route add ${LAN_IP} via $(echo ${2} |sed -e s'!/.*!!') dev tun0 44 fi 45 if [ -n "${3}" ]; then 46 ip -n peer${1} link set mtu ${3} dev tun${1} 47 fi 48 ip -n peer${1} link set tun${1} up 49} 50 51add_peer() { 52 if [ "${PROTO}" == "UDP" ]; then 53 if [ ${1} -eq 0 ]; then 54 ip netns exec peer0 ${OVPN_CLI} new_multi_peer tun0 1 ${UDP_PEERS_FILE} 55 56 for p in $(seq 1 ${NUM_PEERS}); do 57 ip netns exec peer0 ${OVPN_CLI} new_key tun0 ${p} 1 0 ${ALG} 0 \ 58 data64.key 59 done 60 else 61 RADDR=$(awk "NR == ${1} {print \$2}" ${UDP_PEERS_FILE}) 62 RPORT=$(awk "NR == ${1} {print \$3}" ${UDP_PEERS_FILE}) 63 LPORT=$(awk "NR == ${1} {print \$5}" ${UDP_PEERS_FILE}) 64 ip netns exec peer${1} ${OVPN_CLI} new_peer tun${1} ${1} ${LPORT} \ 65 ${RADDR} ${RPORT} 66 ip netns exec peer${1} ${OVPN_CLI} new_key tun${1} ${1} 1 0 ${ALG} 1 \ 67 data64.key 68 fi 69 else 70 if [ ${1} -eq 0 ]; then 71 (ip netns exec peer0 ${OVPN_CLI} listen tun0 1 ${TCP_PEERS_FILE} && { 72 for p in $(seq 1 ${NUM_PEERS}); do 73 ip netns exec peer0 ${OVPN_CLI} new_key tun0 ${p} 1 0 \ 74 ${ALG} 0 data64.key 75 done 76 }) & 77 sleep 5 78 else 79 ip netns exec peer${1} ${OVPN_CLI} connect tun${1} ${1} 10.10.${1}.1 1 \ 80 data64.key 81 fi 82 fi 83} 84 85cleanup() { 86 # some ovpn-cli processes sleep in background so they need manual poking 87 killall $(basename ${OVPN_CLI}) 2>/dev/null || true 88 89 # netns peer0 is deleted without erasing ifaces first 90 for p in $(seq 1 10); do 91 ip -n peer${p} link set tun${p} down 2>/dev/null || true 92 ip netns exec peer${p} ${OVPN_CLI} del_iface tun${p} 2>/dev/null || true 93 done 94 for p in $(seq 1 10); do 95 ip -n peer0 link del veth${p} 2>/dev/null || true 96 done 97 for p in $(seq 0 10); do 98 ip netns del peer${p} 2>/dev/null || true 99 done 100} 101 102if [ "${PROTO}" == "UDP" ]; then 103 NUM_PEERS=${NUM_PEERS:-$(wc -l ${UDP_PEERS_FILE} | awk '{print $1}')} 104else 105 NUM_PEERS=${NUM_PEERS:-$(wc -l ${TCP_PEERS_FILE} | awk '{print $1}')} 106fi 107 108 109