هڪ مثال طور IPIP سرنگ استعمال ڪندي سادي UDP سوراخ ڇڪڻ

ڏينهن جو سٺو وقت!

هن آرٽيڪل ۾ آئون توهان کي ٻڌائڻ چاهيان ٿو ته مون ڪيئن لاڳو ڪيو (ٻيو) هڪ بش اسڪرپٽ NAT جي پويان واقع ٻن ڪمپيوٽرن کي ڳنڍڻ لاءِ UDP هول پنچنگ ٽيڪنالاجي استعمال ڪندي مثال طور Ubuntu/Debian OS استعمال ڪندي.

ڪنيڪشن قائم ڪرڻ ڪيترن ئي مرحلن تي مشتمل آهي:

  1. نوڊ شروع ڪرڻ ۽ ريموٽ نوڊ تيار ٿيڻ جو انتظار ڪرڻ؛
  2. خارجي IP پتي ۽ UDP پورٽ جو تعين ڪرڻ؛
  3. ٻاهرين IP پتي ۽ يو ڊي پي پورٽ کي ريموٽ ميزبان ڏانهن منتقل ڪرڻ؛
  4. ريموٽ ميزبان کان ٻاهرين IP پتي ۽ يو ڊي پي پورٽ حاصل ڪرڻ؛
  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 پيڪيج مان معياري OS اوزار استعمال ڪيا ويا آهن. موجود آهي ڪيتريون ئي سرنگون جيڪو معياري مطلب (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 over استعمال ڪندي. اهو مضمون، اهو مون لاءِ سادو ۽ سمجھڻ وارو لڳي رهيو هو.

مان ڪيترن ئي هفتن کان ڪم پي سي سان ڳنڍڻ لاءِ هي اسڪرپٽ استعمال ڪري رهيو آهيان ۽ مون کي ڪا به پريشاني محسوس نه ڪئي آهي. ان کي ترتيب ڏيڻ ۽ وسارڻ جي لحاظ کان آسان.

شايد توھان وٽ رايا ۽ تجويزون آھن، مون کي ٻڌي خوشي ٿيندي.

Спасибо за внимание!

جو ذريعو: www.habr.com

تبصرو شامل ڪريو