Vrima e thjeshtë UDP duke përdorur një tunel IPIP si shembull

Diten e mire!

Në këtë artikull dua t'ju tregoj se si e zbatova (nje me shume) një skript Bash për lidhjen e dy kompjuterëve të vendosur prapa NAT duke përdorur teknologjinë e hapjes së vrimave UDP duke përdorur Ubuntu/Debian OS si shembull.

Krijimi i një lidhjeje përbëhet nga disa hapa:

  1. Nisja e një nyje dhe pritja që nyja e largët të jetë gati;
  2. Përcaktimi i adresës së jashtme IP dhe portit UDP;
  3. Transferimi i një adrese IP të jashtme dhe një port UDP në një host të largët;
  4. Marrja e një adrese IP të jashtme dhe një port UDP nga një host në distancë;
  5. Organizimi i një tuneli IPIP;
  6. Monitorimi i lidhjes;
  7. Nëse lidhja humbet, fshini tunelin IPIP.

Mendova për një kohë të gjatë dhe ende mendoj se çfarë mund të përdoret për të shkëmbyer të dhëna midis nyjeve, më e thjeshta dhe më e shpejta për mua për momentin është puna përmes Yandex.disk.

  • Së pari, është e lehtë për t'u përdorur - keni nevojë për 3 veprime: krijoni, lexoni, fshini. Me kaçurrela kjo është:
    Krijo:

    curl -s -X MKCOL --user "$usename:$password" https://webdav.yandex.ru/$folder

    Lexoni:

    curl -s --user "$usename:$password" -X PROPFIND -H "Depth: 1" https://webdav.yandex.ru/$folder

    Fshij:

    curl -s -X DELETE --user "$usename:$password" https://webdav.yandex.ru/$folder
  • Së dyti, është e lehtë për t'u instaluar:
    apt install curl

Për të përcaktuar adresën IP të jashtme dhe portën UDP, përdorni komandën stun-client:

stun stun.sipnet.ru -v -p $1 2>&1 | grep "MappedAddress"

Instalimi me komandë:

apt install stun-client

Për të organizuar një tunel, përdoren mjete standarde OS nga paketa iproute2. ekziston shumë tunele të cilat mund të ngrihen duke përdorur mjete standarde (L2TPv3, GRE, etj.), por unë zgjodha IPIP sepse krijon ngarkesë minimale shtesë në sistem. Provova L2TPv3 mbi UDP dhe u zhgënjeva, shpejtësia ra 10 herë, por këto mund të jenë kufizime të ndryshme që lidhen me ofruesit ose diçka tjetër. Meqenëse tuneli IPIP funksionon në nivel IP, tuneli FOU përdoret për të operuar në nivelin e portit UDP. Për të organizuar një tunel IPIP ju duhet:

— ngarkoni modulin FOU:

modprobe fou

- dëgjoni portin lokal:

ip fou add port $localport ipproto 4

- krijoni një tunel:

ip link add name fou$name type ipip remote $remoteip local $localip encap fou  encap-sport $localport encap-dport $remoteport

— ngrini ndërfaqen e tunelit:

ip link set up dev fou$name

— caktoni adresat IP të brendshme lokale dhe të brendshme të largëta të tunelit:

ip addr add $intIP peer $peerip dev fou$name

Fshi një tunel:

ip link del dev fou$name

ip fou del port $localport

Gjendja e tunelit monitorohet duke shtypur periodikisht adresën IP të brendshme të tunelit të nyjes së largët me komandën:

ping -c 1 $peerip -s 0

Ping periodik është i nevojshëm kryesisht për të ruajtur kanalin, përndryshe, kur tuneli është i papunë, tabelat NAT në ruter mund të pastrohen dhe më pas lidhja do të prishet.

Nëse ping zhduket, atëherë tuneli IPIP fshihet dhe pret gatishmërinë nga hosti i largët.

Vetë skenari:

#!/bin/bash
username="[email protected]"
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 0

variabla Emri i përdoruesit, Fjalëkalimi и dosje duhet të jetë e njëjtë në të dyja anët, por majë - të ndryshme, për shembull: 10.0.0.1 dhe 10.0.0.2. Koha në nyje duhet të sinkronizohet. Ju mund ta ekzekutoni skriptin si kjo:

nohup script.sh &

Unë do të doja të tërhiqja vëmendjen tuaj për faktin se tuneli IPIP është i pasigurt nga pikëpamja e faktit se trafiku nuk është i koduar, por kjo mund të zgjidhet lehtësisht duke përdorur IPsec mbi Ky artikull, më dukej e thjeshtë dhe e kuptueshme.

Unë e kam përdorur këtë skript për t'u lidhur me një kompjuter pune prej disa javësh dhe nuk kam vërejtur ndonjë problem. I përshtatshëm për sa i përket vendosjes dhe harresës së tij.

Ndoshta do të keni komente dhe sugjerime, do të jem i lumtur t'i dëgjoj.

Спасибо за внимание!

Burimi: www.habr.com

Shto një koment