#!/usr/bin/env bash set -euo pipefail trap 'kill $(jobs -p)' EXIT SERVER="sir0.dxng.net" PORT=12022 find_free_tun() { used=$(echo "$@" | awk -F: '{print $2}' | grep -o 'tun[0-9]\+' | sed 's/tun//' | sort -n) candidate=0 for n in $used; do if [ "$n" -eq "$candidate" ]; then candidate=$((candidate+1)) else break fi done echo $candidate } LOCAL_TUN=$(find_free_tun "$(ip -o link show)") REMOTE_TUN=$(find_free_tun "$(ssh -np $PORT root@$SERVER ip -o link show)") SERVER_IP="192.168.98.1" CLIENT_IP="192.168.98.$((200+REMOTE_TUN))" echo "[*] Local tun$LOCAL_TUN <-> Remote tun$REMOTE_TUN" echo "[*] Local addr $CLIENT_IP <-> Remote addr $SERVER_IP" ssh -w $LOCAL_TUN:$REMOTE_TUN -p $PORT root@$SERVER -o PermitLocalCommand=yes -o LocalCommand="ip link set tun$LOCAL_TUN up && ip addr add $CLIENT_IP peer $SERVER_IP dev tun$LOCAL_TUN" -o RemoteCommand="ip link set tun$REMOTE_TUN up && ip addr add $SERVER_IP peer $CLIENT_IP dev tun$REMOTE_TUN" & if ping -c 4 $SERVER_IP; then echo "[*] Tunnel established successfully" wait else echo "[*] Tunnel establishment failed, exiting" exit fi