Мысал ретінде IPIP туннелі арқылы қарапайым UDP тесігі

Қайырлы күн!

Бұл мақалада мен қалай жүзеге асырғанымды айтқым келеді (тағы бір) мысал ретінде Ubuntu/Debian ОЖ көмегімен UDP тескіш технологиясын пайдаланып, NAT артындағы екі компьютерді қосуға арналған Bash сценарийі.

Байланысты орнату бірнеше кезеңнен тұрады:

  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

Туннельді ұйымдастыру үшін 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

Айнымалылар пайдаланушы аты, пароль и папка екі жақта бірдей болуы керек, бірақ кіріс - әртүрлі, мысалы: 10.0.0.1 және 10.0.0.2. Түйіндердегі уақыт синхрондалу керек. Сценарийді келесідей іске қосуға болады:

nohup script.sh &

Мен сіздің назарыңызды IPIP туннелі трафик шифрланбағандықтан қауіпті екеніне аударғым келеді, бірақ оны IPsec арқылы оңай шешуге болады. Бұл мақала, бұл маған қарапайым және түсінікті болып көрінді.

Мен бірнеше апта бойы жұмыс компьютеріне қосылу үшін осы сценарийді пайдаланып жүрмін және ешқандай проблемаларды байқамадым. Оны орнату және оны ұмыту тұрғысынан ыңғайлы.

Мүмкін сізде ескертулер мен ұсыныстар болады, мен қуана тыңдаймын.

Назарларыңызға рахмет!

Ақпарат көзі: www.habr.com

пікір қалдыру