Einföld UDP hola með því að nota IPIP göng sem dæmi

Góður tími dags!

Í þessari grein vil ég segja þér hvernig ég útfærði (einn í viðbót) Bash forskrift til að tengja tvær tölvur staðsettar fyrir aftan NAT með UDP gatatækni með Ubuntu/Debian OS sem dæmi.

Að koma á tengingu samanstendur af nokkrum skrefum:

  1. Ræsir hnút og bíður eftir að ytri hnúturinn verði tilbúinn;
  2. Ákvörðun ytri IP tölu og UDP tengi;
  3. Flytja ytri IP tölu og UDP tengi til ytri hýsils;
  4. Að fá ytri IP tölu og UDP tengi frá ytri hýsil;
  5. Skipulag IPIP jarðganga;
  6. Tengingareftirlit;
  7. Ef tengingin rofnar skaltu eyða IPIP göngunum.

Ég hugsaði lengi og hugsa enn hvað hægt er að nota til að skiptast á gögnum á milli hnúta, það einfaldasta og fljótlegasta fyrir mig í augnablikinu er að vinna í gegnum Yandex.disk.

  • Í fyrsta lagi er það auðvelt í notkun - þú þarft 3 aðgerðir: búa til, lesa, eyða. Með krullu er þetta:
    Búa til:

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

    Lestu:

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

    Eyða:

    curl -s -X DELETE --user "$usename:$password" https://webdav.yandex.ru/$folder
  • Í öðru lagi er auðvelt að setja upp:
    apt install curl

Til að ákvarða ytri IP tölu og UDP tengi skaltu nota stun-client skipunina:

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

Uppsetning með skipun:

apt install stun-client

Til að skipuleggja göng eru venjuleg stýrikerfisverkfæri úr iproute2 pakkanum notuð. Er til mörg jarðgöng sem hægt er að hækka með stöðluðum aðferðum (L2TPv3, GRE, osfrv.), en ég valdi IPIP vegna þess að það skapar lágmarks viðbótarálag á kerfið. Ég prófaði L2TPv3 yfir UDP og varð fyrir vonbrigðum, hraðinn lækkaði 10 sinnum, en þetta gætu verið ýmsar takmarkanir tengdar veitendum eða eitthvað annað. Þar sem IPIP göngin starfa á IP stigi eru FOU göngin notuð til að starfa á UDP höfn stigi. Til að skipuleggja IPIP göng þarftu:

— hlaðið FOU einingunni:

modprobe fou

— hlustaðu á staðbundna höfn:

ip fou add port $localport ipproto 4

— búa til göng:

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

— hækka tengi ganganna:

ip link set up dev fou$name

— úthlutaðu innri staðbundnum og innri ytri IP tölum í göngunum:

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

Eyða göngum:

ip link del dev fou$name

ip fou del port $localport

Fylgst er með ástandi ganganna með því að pinga reglulega innri IP tölu ytri hnútganganna með skipuninni:

ping -c 1 $peerip -s 0

Reglubundið ping er nauðsynlegt fyrst og fremst til að viðhalda rásinni, annars, þegar göngin eru aðgerðalaus, getur NAT töflurnar á beinum verið hreinsaðar og þá verður tengingin rofin.

Ef pingið hverfur, þá er IPIP göngunum eytt og bíður þess að vera reiðubúinn frá ytri gestgjafanum.

Handritið sjálft:

#!/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

Variables notandanafn, lykilorð и mappa ætti að vera eins á báðum hliðum, en ábending - mismunandi, til dæmis: 10.0.0.1 og 10.0.0.2. Tíminn á hnútunum verður að vera samstilltur. Þú getur keyrt handritið svona:

nohup script.sh &

Ég vil vekja athygli á því að IPIP göngin eru óörugg út frá því að umferðin er ekki dulkóðuð, en það er auðvelt að leysa það með IPsec yfir Þessi grein, fannst mér það einfalt og skiljanlegt.

Ég hef notað þetta handrit til að tengjast vinnutölvu í nokkrar vikur núna og hef ekki tekið eftir neinum vandamálum. Þægilegt hvað varðar að stilla það og gleyma því.

Kannski munt þú hafa athugasemdir og tillögur, ég mun vera feginn að hlusta.

Svara með tilvísun!

Heimild: www.habr.com

Bæta við athugasemd