common.sh 3.0 KB

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