مثال کے طور پر IPIP سرنگ کا استعمال کرتے ہوئے سادہ UDP ہول پنچنگ

اچھا دن!

اس آرٹیکل میں میں آپ کو بتانا چاہتا ہوں کہ میں نے کیسے لاگو کیا (ایک اور) مثال کے طور پر Ubuntu/Debian OS کا استعمال کرتے ہوئے UDP ہول پنچنگ ٹیکنالوجی کا استعمال کرتے ہوئے NAT کے پیچھے واقع دو کمپیوٹرز کو جوڑنے کے لیے Bash اسکرپٹ۔

کنکشن قائم کرنا کئی مراحل پر مشتمل ہے:

  1. نوڈ شروع کرنا اور ریموٹ نوڈ کے تیار ہونے کا انتظار کرنا؛
  2. بیرونی IP ایڈریس اور UDP پورٹ کا تعین کرنا؛
  3. ایک بیرونی IP ایڈریس اور UDP پورٹ کو دور دراز کے میزبان کو منتقل کرنا؛
  4. ریموٹ میزبان سے بیرونی IP ایڈریس اور UDP پورٹ حاصل کرنا؛
  5. آئی پی آئی پی سرنگ کی تنظیم؛
  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 کا انتخاب کیا کیونکہ یہ سسٹم پر کم سے کم اضافی بوجھ پیدا کرتا ہے۔ میں نے 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

ریموٹ نوڈ ٹنل کے اندرونی آئی پی ایڈریس کو وقفے وقفے سے کمانڈ کے ساتھ پنگ کرکے سرنگ کی حالت کی نگرانی کی جاتی ہے:

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 over کا استعمال کرتے ہوئے آسانی سے حل کیا جا سکتا ہے۔ یہ مضمون، یہ میرے لئے آسان اور قابل فہم لگ رہا تھا۔

میں اس اسکرپٹ کو کام کے پی سی سے منسلک کرنے کے لیے کئی ہفتوں سے استعمال کر رہا ہوں اور مجھے کوئی پریشانی محسوس نہیں ہوئی۔ اسے ترتیب دینے اور بھولنے کے لحاظ سے آسان ہے۔

شاید آپ کے تبصرے اور مشورے ہوں، مجھے سن کر خوشی ہوگی۔

آپ کا شکریہ!

ماخذ: www.habr.com

نیا تبصرہ شامل کریں