Барои мисол сӯрохиҳои оддии UDP бо истифода аз нақби IPIP

Рӯзи нағз!

Дар ин мақола ман мехоҳам ба шумо бигӯям, ки ман чӣ гуна амалӣ кардам (боз як) скрипти Bash барои пайваст кардани ду компютер дар паси NAT бо истифода аз технологияи сӯрохиҳои UDP бо истифода аз Ubuntu/Debian OS ҳамчун мисол.

Таъсиси пайвастшавӣ аз якчанд марҳила иборат аст:

  1. Оғози гиреҳ ва интизори омода шудани гиреҳи дурдаст;
  2. Муайян кардани суроғаи IP берунӣ ва порти UDP;
  3. Интиқоли суроғаи IP берунӣ ва порти UDP ба ҳости дурдаст;
  4. Гирифтани суроғаи IP-и беруна ва порти UDP аз ҳости дурдаст;
  5. Ташкили нақби IPIP;
  6. Мониторинги пайвастшавӣ;
  7. Агар пайвастшавӣ гум шавад, нақби IPIP-ро нест кунед.

Ман муддати тӯлонӣ фикр мекардам ва ҳоло ҳам фикр мекунам, ки чӣ метавонад барои табодули маълумот байни гиреҳҳо истифода шавад, дар айни замон барои ман соддатарин ва зудтарин кор тавассути Yandex.disk аст.

  • Аввалан, истифодаи он осон аст - ба шумо 3 амал лозим аст: эҷод кардан, хондан, нест кардан. Бо curl ин аст:
    Эҷод кунед:

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

    Хондан:

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

    Нест кардан:

    curl -s -X DELETE --user "$usename:$password" https://webdav.yandex.ru/$folder
  • Дуюм, насб кардан осон аст:
    apt install curl

Барои муайян кардани суроғаи IP берунӣ ва порти UDP, фармони stun-client -ро истифода баред:

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

Насбкунӣ бо фармон:

apt install stun-client

Барои ташкили нақб, асбобҳои стандартии OS аз бастаи iproute2 истифода мешаванд. вуҷуд дорад туннельхои бисьёре ки онро бо истифода аз воситаҳои стандартӣ (L2TPv3, GRE ва ғайра) эҳё кардан мумкин аст, аммо ман IPIP-ро интихоб кардам, зеро он бори ҳадди ақали иловагиро дар система эҷод мекунад. Ман L2TPv3-ро бар UDP кӯшиш кардам ва ноумед шудам, суръат 10 маротиба паст шуд, аммо инҳо метавонанд маҳдудиятҳои мухталифи марбут ба провайдерҳо ё чизи дигар бошанд. Азбаски нақби IPIP дар сатҳи IP кор мекунад, нақби FOU барои кор дар сатҳи бандари UDP истифода мешавад. Барои ташкили нақби IPIP ба шумо лозим аст:

— модули FOU-ро бор кунед:

modprobe fou

— ба порти маҳаллӣ гӯш диҳед:

ip fou add port $localport ipproto 4

— нақб созед:

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

— баланд бардоштани интерфейси нақб:

ip link set up dev fou$name

— таъин кардани суроғаҳои IP-и дохилӣ ва дохилии дурдасти нақб:

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

Нест кардани нақб:

ip link del dev fou$name

ip fou del port $localport

Ҳолати нақб тавассути пинг кардани суроғаи IP-и дохилии нақби гиреҳи дурдаст бо фармони:

ping -c 1 $peerip -s 0

Пинги даврӣ пеш аз ҳама барои нигоҳ доштани канал лозим аст, дар акси ҳол, вақте ки нақб бекор аст, ҷадвалҳои NAT дар роутерҳо тоза карда мешаванд ва сипас пайвастшавӣ канда мешавад.

Агар пинг нопадид шавад, он гоҳ нақби IPIP нест карда мешавад ва интизори омодагии ҳости дурдаст аст.

Худи скрипт:

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

Тағйирёбандаҳо Логин, гузарвожа и феҳрист бояд дар хар ду тараф як хел бошад, вале intip - гуногун, масалан: 10.0.0.1 ва 10.0.0.2. Вақт дар гиреҳҳо бояд ҳамоҳанг карда шавад. Шумо метавонед скриптро чунин иҷро кунед:

nohup script.sh &

Ман мехоҳам таваҷҷӯҳи шуморо ба он ҷалб намоям, ки нақби IPIP аз нуқтаи назари он, ки трафик рамзгузорӣ нашудааст, хатарнок аст, аммо ин метавонад бо истифода аз IPsec ба осонӣ ҳал карда шавад. ин мақола, ба назари ман содда ва фахмо менамуд.

Ман ин скриптро барои пайваст шудан ба компютери корӣ дар тӯли чанд ҳафта истифода мебарам ва ягон мушкилотро мушоҳида накардаам. Аз ҷиҳати танзим ва фаромӯш кардани он қулай аст.

Шояд шумо фикру мулоҳизаҳо ва пешниҳодҳо дошта бошед, ман аз шунидани он шод хоҳам шуд.

Ташаккур барои таваҷҷӯҳатон!

Манбаъ: will.com

Илова Эзоҳ