උදාහරණයක් ලෙස IPIP උමගක් භාවිතා කරමින් සරල UDP සිදුරු සිදුරු කිරීම

සුබ දිනක්!

මෙම ලිපියෙන් මම ඔබට කියන්නට අවශ්ය මම එය ක්රියාත්මක කළ ආකාරය (තව එකක්) උදාහරණයක් ලෙස Ubuntu/Debian OS භාවිතා කරමින් 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 port තීරණය කිරීමට, stun-client විධානය භාවිතා කරන්න:

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

විධානය සමඟ ස්ථාපනය:

apt install stun-client

උමගක් සංවිධානය කිරීම සඳහා, iproute2 පැකේජයෙන් සම්මත OS මෙවලම් භාවිතා කරනු ලැබේ. පවතී බොහෝ උමං මාර්ග සම්මත මාධ්‍යයන් (L2TPv3, GRE, ආදිය) භාවිතයෙන් ඉහළ නැංවිය හැකි නමුත්, මම IPIP තෝරා ගත්තේ එය පද්ධතිය මත අවම අමතර බරක් ඇති කරන බැවිනි. මම UDP හරහා L2TPv3 උත්සාහ කළ අතර බලාපොරොත්තු සුන් විය, වේගය 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

අදහස් එක් කරන්න