Tere pÀevast!
Selles artiklis tahan rÀÀkida, kuidas ma rakendasin () Bash skripti kahe arvuti ĂŒhendamiseks, mis asuvad NAT-i taga, kasutades UDP hole punching tehnoloogiat Ubuntu/Debiani operatsioonisĂŒsteemi nĂ€itel.
Ăhenduse loomine koosneb mitmest etapist:
- Node kÀivitamine ja kaugkiibi valmiduse ootamine;
- VÀline IP-aadress ja UDP-port mÀÀramine;
- VĂ€list IP-aadressi ja UDP-porti edastamine kaugkiibile;
- VÀline IP-aadress ja UDP-port kaugkiibilt vastuvÔtmine;
- IPIP-tunneli loomine;
- Ăhenduse jĂ€lgimine;
- Ăhenduse katkestamise korral IPIP tunneli eemaldamine.
MÔtlesin kaua ja mÔtlen endiselt, mida kasutada sÔnumite vahetamiseks node'ide vahel, praegu tundub mulle kÔige lihtsam ja kiirem variandina kasutada Yandex.Disc.
- Esiteks, see on kasutamislihtsus â vajate kolme toimingut: loomine, lugemine, kustutamine. Curl'i abil on see:
Loo:curl -s -X MKCOL --user "$usename:$password" https://webdav.yandex.ru/$folderLoe:
curl -s --user "$usename:$password" -X PROPFIND -H "Depth: 1" https://webdav.yandex.ru/$folderKusta:
curl -s -X DELETE --user "$usename:$password" https://webdav.yandex.ru/$folder - Teiseks, see on lihtne seadistada:
apt install curl
VÀlise IP-aadressi ja UDP-pordi mÀÀramiseks kasutage stun-client kÀsku:
stun stun.sipnet.ru -v -p $1 2>&1 | grep "MappedAddress"Installimine kÀsuga:
apt install stun-clientTunnelite korraldamiseks kasutatakse operatsioonisĂŒsteemi standardilisi tööriistu paketist iproute2. On olemas mida saab ĂŒles tĂ”sta standardsete tööriistadega (L2TPv3, GRE jne), aga valisin IPIP, kuna see tekitab sĂŒsteemile minimaalselt lisakoormust. Olen proovinud L2TPv3 UDP peal ja pettunud, kiirus langes kĂŒmme korda, kuid see vĂ”ib olla seotud pakkumise vĂ”i millegi muuga. Kuna IPIP-tunnel töötab IP-tasandil, kasutatakse UDP-portide tasandil töötamiseks FOU-tunnelit. IPIP-tunneli loomiseks on vaja:
â laadida FOU moodul:
modprobe fouâ kuulata kohalikku porti:
ip fou add port $localport ipproto 4â luua tunnel:
ip link add name fou$name type ipip remote $remoteip local $localip encap fou encap-sport $localport encap-dport $remoteportâ tĂ”sta tunnelite ĂŒhendus ĂŒles:
ip link set up dev fou$nameâ mÀÀrata tunneli sisemine kohaliku ja kaug-IP-aadress:
ip addr add $intIP peer $peerip dev fou$nameTunnel kustutatakse:
ip link del dev fou$nameip fou del port $localportTunnel'i seisundi jÀlgimine toimub perioodilise pingiga kauguspunkti tunnel'i sisemise IP-aadressi abil, kÀsuga:
ping -c 1 $peerip -s 0Perioodiline ping on vajalik eelkĂ”ige kanali sĂ€ilitamiseks, vastasel juhul vĂ”ivad marsruutijates NAT-tabelid tĂŒhjeneda, mis pĂ”hjustab ĂŒhenduse katkestamise.
Kui ping kaob, siis IPIP-tunnel eemaldatakse ja ootab kauguspunkti valmidust.
Tegelik skript:
#!/bin/bash
username="username@yandex.ru"
password="password"
folder="vpnid"
intip="10.0.0.1"
localport=`shuf -i 10000-65000 -n 1`
cid=`shuf -i 10000-99999 -n 1`
tid=`shuf -i 10-99 -n 1`
function yaread {
curl -s --user "$1:$2" -X PROPFIND -H "Depth: 1" https://webdav.yandex.ru/$3 | sed 's/></>n</g' | grep "displayname" | sed 's/<d:displayname>//g' | sed 's/</d:displayname>//g' | grep -v $3 | grep -v $4 | sort -r
}
function yacreate {
curl -s -X MKCOL --user "$1:$2" https://webdav.yandex.ru/$3
}
function yadelete {
curl -s -X DELETE --user "$1:$2" https://webdav.yandex.ru/$3
}
function myipport {
stun stun.sipnet.ru -v -p $1 2>&1 | grep "MappedAddress" | sort | uniq | awk '{print $3}' | head -n1
}
function tunnel-up {
modprobe fou
ip fou add port $4 ipproto 4
ip link add name fou$7 type ipip remote $1 local $3 encap fou encap-sport $4 encap-dport $2
ip link set up dev fou$7
ip addr add $6 peer $5 dev fou$7
}
function tunnel-check {
sleep 10
pings=0
until [[ $pings == 4 ]]; do
if ping -c 1 $1 -s 0 &>/dev/null;
then echo -n .; n=0
else echo -n !; ((pings++))
fi
sleep 15
done
}
function tunnel-down {
ip link del dev fou$1
ip fou del port $2
}
trap 'echo -e "nDisconnecting..." && yadelete $username $password $folder; tunnel-down $tunnelid $localport; echo "IPIP tunnel disconnected!"; exit 1' 1 2 3 8 9 14 15
until [[ -n $end ]]; do
yacreate $username $password $folder
until [[ -n $ip ]]; do
mydate=`date +%s`
timeout="60"
list=`yaread $username $password $folder $cid | head -n1`
yacreate $username $password $folder/$mydate:$cid
for l in $list; do
if [ `echo $l | sed 's/:/ /g' | awk {'print $1'}` -ge $(($mydate-65)) ]; then
#echo $list
myipport=`myipport $localport`
yacreate $username $password $folder/$mydate:$cid:$myipport:$intip:$tid
timeout=$(( $timeout + `echo $l | sed 's/:/ /g' | awk {'print $1'}` - $mydate + 3 ))
ip=`echo $l | sed 's/:/ /g' | awk '{print $3}'`
port=`echo $l | sed 's/:/ /g' | awk '{print $4}'`
peerip=`echo $l | sed 's/:/ /g' | awk '{print $5}'`
peerid=`echo $l | sed 's/:/ /g' | awk '{print $6}'`
if [[ -n $peerid ]]; then tunnelid=$(($peerid*$tid)); fi
fi
done
if ( [[ -z "$ip" ]] && [ "$timeout" -gt 0 ] ) ; then
echo -n "!"
sleep $timeout
fi
done
localip=`ip route get $ip | head -n1 | sed 's|.*src ||' | cut -d' ' -f1`
tunnel-up $ip $port $localip $localport $peerip $intip $tunnelid
tunnel-check $peerip
tunnel-down $tunnelid $localport
yadelete $username $password $folder
unset ip port myipport
done
exit 0Muutujad username, password ja kaust peavad olema mĂ”lemal pool samad, kuid intip on erinevad, nĂ€iteks: 10.0.0.1 ja 10.0.0.2. Kauguspunktide kellaaeg peab olema sĂŒnkroonitud. Skripti saab kĂ€ivitada jĂ€rgmiselt:
nohup script.sh &Tahan tĂ€helepanu juhtida, et IPIP-tunnel ei ole turvaline, sest liiklus ei ole krĂŒpteeritud, kuid selle vĂ”ib lihtsalt lahendada IPsec'i abil , ta nĂ€ib mulle lihtne ja arusaadav.
Olen seda skripti kasutanud tööarvutile ĂŒhendamiseks juba mitu nĂ€dalat ja mingeid probleeme pole tĂ€hele pannud. Mugav on see, et seadistasin ja unustasin.
VÔib-olla on teil mingeid mÀrkusi ja ettepanekuid, olen avatud kuulama.
AitÀh tÀhelepanu eest!
Allikas: habr.com
