Pûçek qulikê ya hêsan a UDP-ê wekî mînakek tunelek IPIP bikar tîne

Roja baş e!

Di vê gotarê de ez dixwazim ji we re vebêjim ka min çawa bicîh kir (yekî din) skrîptek Bash ji bo girêdana du komputerên li pişt NAT-ê bi karanîna teknolojiya qulikê ya UDP-ê wekî mînakek Ubuntu/Debian OS-ê bikar tîne.

Damezrandina pêwendiyê ji çend gavan pêk tê:

  1. Destpêkirina nodek û li benda amadebûna girêka dûr;
  2. Diyarkirina navnîşana IP-ya derve û porta UDP;
  3. Veguheztina navnîşana IP-ya derveyî û porta UDP-ê ji mêvandarek dûr re;
  4. Bidestxistina navnîşana IP-ya derveyî û porta UDP ji mêvandarek dûr;
  5. Rêxistinkirina tunelek IPIP;
  6. Çavdêriya girêdanê;
  7. Ger girêdan winda bibe, tunela IPIP-ê jêbirin.

Ez demek dirêj fikirîm û hîn jî difikirim ka çi dikare were bikar anîn da ku daneyan di navbera girêkan de biguhezîne, ya herî hêsan û bilez ji bo min di vê gavê de xebitandina Yandex.disk e.

  • Pêşîn, karanîna wê hêsan e - hûn hewceyê 3 çalakiyan in: çêbikin, xwendin, jêbirin. Bi curl ev e:
    Xûliqandin:

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

    Xwendin:

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

    Jêbirin:

    curl -s -X DELETE --user "$usename:$password" https://webdav.yandex.ru/$folder
  • Ya duyemîn, sazkirina wê hêsan e:
    apt install curl

Ji bo destnîşankirina navnîşana IP-ya derveyî û porta UDP, emrê stun-client bikar bînin:

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

Sazkirin bi fermanê:

apt install stun-client

Ji bo organîzekirina tunelek, amûrên standard OS-ê yên ji pakêta iproute2 têne bikar anîn. Heye gelek tunel ku dikare bi karanîna rêgezên standard (L2TPv3, GRE, hwd.) were bilind kirin, lê min IPIP hilbijart ji ber ku ew barek zêde ya hindiktirîn li ser pergalê diafirîne. Min L2TPv3 li ser UDP ceriband û dilşikestî bûm, lez 10 carî daket, lê dibe ku ev cûrbecûr sînorkirinên bi pêşkêşkeran an tiştek din ve girêdayî bin. Ji ber ku tunela IPIP di asta IP-ê de dixebite, tunela FOU tê bikar anîn ku di asta porta UDP de bixebite. Ji bo organîzekirina tunelek IPIP hûn hewce ne:

- Modula FOU bar bikin:

modprobe fou

- li porta herêmî guhdarî bikin:

ip fou add port $localport ipproto 4

- tunelek çêbikin:

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

- pêwendiya tunelê bilind bikin:

ip link set up dev fou$name

- Navnîşanên IP-ya dûr ên navxweyî û navxweyî yên tunelê destnîşan bikin:

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

Tunelek jêbirin:

ip link del dev fou$name

ip fou del port $localport

Rewşa tunelê bi pîngkirina periyodîk navnîşana IP-ya navxweyî ya tunela girêka dûr bi fermanê tê şopandin:

ping -c 1 $peerip -s 0

Ping-ya periyodîk di serî de ji bo domandina kanalê hewce ye, wekî din, dema ku tunel bêkar be, dibe ku tabloyên NAT-ê li ser routeran werin paqij kirin û dûv re têkilî dê qut bibe.

Ger ping winda bibe, wê hingê tunela IPIP-ê tê jêbirin û li benda amadebûna mêvandarê dûr dimîne.

Nivîs bi xwe:

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

Guhêrbar navê bikarhêner, şîfre и peldanka divê li her du aliyan yek be, lê intip - cuda, wek nimûne: 10.0.0.1 û 10.0.0.2. Dema li ser girêkan divê were hevdem kirin. Hûn dikarin skrîptê bi vî rengî bimeşînin:

nohup script.sh &

Ez dixwazim bala we bikişînim ser vê yekê ku tunela IPIP-ê ji hêla rastiya ku seyrûsefer ne şîfrekirî ye ne ewle ye, lê ev bi hêsanî dikare bi karanîna IPsec-ê re were çareser kirin. vê gotara, ji min re hêsan û têgihîştî xuya bû.

Min ev çend hefte ye ku ez vê skrîptê bikar tînim ku bi PC-ya xebatê ve girêbidim û min tu pirsgirêk nedît. Di warê danîn û jibîrkirina wê de rehet e.

Dibe ku hûn şîrove û pêşniyarên we hebin, ez ê kêfxweş bibim ku guhdarî bikim.

Ji bo baldariya te spas!

Source: www.habr.com

Add a comment