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 14create_ns() { 15 ip netns add peer${1} 16} 17 18setup_ns() { 19 MODE="P2P" 20 21 if [ ${1} -eq 0 ]; then 22 MODE="MP" 23 for p in $(seq 1 ${NUM_PEERS}); do 24 ip link add veth${p} netns peer0 type veth peer name veth${p} netns peer${p} 25 26 ip -n peer0 addr add 10.10.${p}.1/24 dev veth${p} 27 ip -n peer0 link set veth${p} up 28 29 ip -n peer${p} addr add 10.10.${p}.2/24 dev veth${p} 30 ip -n peer${p} link set veth${p} up 31 done 32 fi 33 34 ip netns exec peer${1} ${OVPN_CLI} new_iface tun${1} $MODE 35 ip -n peer${1} addr add ${2} dev tun${1} 36 ip -n peer${1} link set tun${1} up 37} 38 39add_peer() { 40 if [ "${PROTO}" == "UDP" ]; then 41 if [ ${1} -eq 0 ]; then 42 ip netns exec peer0 ${OVPN_CLI} new_multi_peer tun0 1 ${UDP_PEERS_FILE} 43 44 for p in $(seq 1 ${NUM_PEERS}); do 45 ip netns exec peer0 ${OVPN_CLI} new_key tun0 ${p} 1 0 ${ALG} 0 \ 46 data64.key 47 done 48 else 49 ip netns exec peer${1} ${OVPN_CLI} new_peer tun${1} ${1} 1 10.10.${1}.1 1 50 ip netns exec peer${1} ${OVPN_CLI} new_key tun${1} ${1} 1 0 ${ALG} 1 \ 51 data64.key 52 fi 53 else 54 if [ ${1} -eq 0 ]; then 55 (ip netns exec peer0 ${OVPN_CLI} listen tun0 1 ${TCP_PEERS_FILE} && { 56 for p in $(seq 1 ${NUM_PEERS}); do 57 ip netns exec peer0 ${OVPN_CLI} new_key tun0 ${p} 1 0 \ 58 ${ALG} 0 data64.key 59 done 60 }) & 61 sleep 5 62 else 63 ip netns exec peer${1} ${OVPN_CLI} connect tun${1} ${1} 10.10.${1}.1 1 \ 64 data64.key 65 fi 66 fi 67} 68 69cleanup() { 70 # some ovpn-cli processes sleep in background so they need manual poking 71 killall $(basename ${OVPN_CLI}) 2>/dev/null || true 72 73 # netns peer0 is deleted without erasing ifaces first 74 for p in $(seq 1 10); do 75 ip -n peer${p} link set tun${p} down 2>/dev/null || true 76 ip netns exec peer${p} ${OVPN_CLI} del_iface tun${p} 2>/dev/null || true 77 done 78 for p in $(seq 1 10); do 79 ip -n peer0 link del veth${p} 2>/dev/null || true 80 done 81 for p in $(seq 0 10); do 82 ip netns del peer${p} 2>/dev/null || true 83 done 84} 85 86if [ "${PROTO}" == "UDP" ]; then 87 NUM_PEERS=${NUM_PEERS:-$(wc -l ${UDP_PEERS_FILE} | awk '{print $1}')} 88else 89 NUM_PEERS=${NUM_PEERS:-$(wc -l ${TCP_PEERS_FILE} | awk '{print $1}')} 90fi 91 92 93