Nümunə olaraq IPIP tunelindən istifadə edərək sadə UDP deşikləri

Günün Yaxşı vaxt!

Bu yazıda sizə necə həyata keçirdiyimi söyləmək istəyirəm (bir daha) NAT arxasında yerləşən iki kompüteri birləşdirmək üçün bir Bash skripti, nümunə olaraq Ubuntu/Debian ƏS-dən istifadə edərək UDP delik açma texnologiyasından istifadə etməklə.

Bağlantının qurulması bir neçə mərhələdən ibarətdir:

  1. Bir qovşağı işə salmaq və uzaq qovşağın hazır olmasını gözləmək;
  2. Xarici IP ünvanının və UDP portunun müəyyən edilməsi;
  3. Xarici IP ünvanını və UDP portunu uzaq hosta köçürmək;
  4. Uzaq hostdan xarici IP ünvanı və UDP portunun alınması;
  5. IPIP tunelinin təşkili;
  6. Bağlantı monitorinqi;
  7. Bağlantı itərsə, IPIP tunelini silin.

Uzun müddət düşündüm və hələ də qovşaqlar arasında məlumat mübadiləsi üçün nəyin istifadə oluna biləcəyini düşünürəm, bu anda mənim üçün ən sadə və sürətli Yandex.disk vasitəsilə işləyir.

  • Birincisi, istifadəsi asandır - sizə 3 hərəkət lazımdır: yaratmaq, oxumaq, silmək. Curl ilə bu:
    Yaradın:

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

    Oxuyun:

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

    Sil:

    curl -s -X DELETE --user "$usename:$password" https://webdav.yandex.ru/$folder
  • İkincisi, quraşdırmaq asandır:
    apt install curl

Xarici IP ünvanını və UDP portunu müəyyən etmək üçün stun-client əmrindən istifadə edin:

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

Komanda ilə quraşdırma:

apt install stun-client

Tuneli təşkil etmək üçün iproute2 paketindən standart OS alətləri istifadə olunur. Mövcuddur çoxlu tunellər standart vasitələrdən (L2TPv3, GRE və s.) istifadə etməklə qaldırıla bilər, lakin mən IPIP-i seçdim, çünki sistemdə minimal əlavə yük yaradır. L2TPv3-ü UDP üzərində sınadım və məyus oldum, sürət 10 dəfə aşağı düşdü, lakin bunlar provayderlərlə və ya başqa bir şeylə bağlı müxtəlif məhdudiyyətlər ola bilər. IPIP tuneli IP səviyyəsində işlədiyi üçün FOU tuneli UDP port səviyyəsində işləmək üçün istifadə olunur. IPIP tunelini təşkil etmək üçün sizə lazımdır:

— FOU modulunu yükləyin:

modprobe fou

— yerli limana qulaq asın:

ip fou add port $localport ipproto 4

- tunel yaratmaq:

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

— tunel interfeysini qaldırın:

ip link set up dev fou$name

— tunelin daxili yerli və daxili uzaq IP ünvanlarını təyin edin:

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

Tuneli silin:

ip link del dev fou$name

ip fou del port $localport

Tunelin vəziyyəti vaxtaşırı olaraq uzaq qovşaq tunelinin daxili IP ünvanını əmrlə pingləməklə izlənilir:

ping -c 1 $peerip -s 0

Dövri ping ilk növbədə kanalı saxlamaq üçün lazımdır, əks halda, tunel boş olduqda, marşrutlaşdırıcılardakı NAT cədvəlləri təmizlənə bilər və sonra əlaqə pozulacaq.

Pinq yox olarsa, IPIP tuneli silinir və uzaq hostdan hazırlığı gözləyir.

Əslində skriptin özü:

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

Dəyişənlər istifadəçi adı, parol и qovluq hər iki tərəfdə eyni olmalıdır, lakin baxmaq - fərqli, məsələn: 10.0.0.1 və 10.0.0.2. Düyünlərdəki vaxt sinxronlaşdırılmalıdır. Skripti belə işlədə bilərsiniz:

nohup script.sh &

Diqqətinizi çəkmək istərdim ki, IPIP tunel trafikin şifrələnməməsi baxımından təhlükəlidir, lakin bu, IPsec üzərindən istifadə etməklə asanlıqla həll edilə bilər. Bu məqalə, mənə sadə və başa düşülən göründü.

Artıq bir neçə həftədir ki, iş kompüterinə qoşulmaq üçün bu skriptdən istifadə edirəm və heç bir problem görməmişəm. Onu qurmaq və unutmaq baxımından əlverişlidir.

Bəlkə şərh və təklifləriniz olacaq, məmnuniyyətlə dinləyəcəm.

Diqqətiniz üçün təşəkkür edirik!

Mənbə: www.habr.com

Добавить комментарий