تثقيب UDP بسيط باستخدام نفق IPIP كمثال

الوقت المناسب من اليوم!

في هذه المقالة أريد أن أخبركم كيف قمت بتنفيذ (أكثر واحد) برنامج نصي Bash لتوصيل جهازي كمبيوتر موجودين خلف NAT باستخدام تقنية ثقب UDP باستخدام نظام التشغيل Ubuntu/Debian كمثال.

يتكون إنشاء الاتصال من عدة خطوات:

  1. بدء عقدة وانتظار أن تصبح العقدة البعيدة جاهزة؛
  2. تحديد عنوان IP الخارجي ومنفذ UDP؛
  3. نقل عنوان IP خارجي ومنفذ UDP إلى مضيف بعيد؛
  4. الحصول على عنوان IP خارجي ومنفذ UDP من مضيف بعيد؛
  5. تنظيم نفق IPIP؛
  6. مراقبة الاتصال؛
  7. في حالة فقدان الاتصال، قم بحذف نفق IPIP.

لقد فكرت لفترة طويلة وما زلت أفكر في ما يمكن استخدامه لتبادل البيانات بين العقد، والأبسط والأسرع بالنسبة لي في الوقت الحالي هو العمل من خلال Yandex.disk.

  • أولاً، إنه سهل الاستخدام - تحتاج إلى 3 إجراءات: الإنشاء والقراءة والحذف. مع الضفيرة هذا هو:
    خلق:

    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

يلزم إجراء اختبار ping بشكل دوري في المقام الأول للحفاظ على القناة، وإلا، عندما يكون النفق خاملاً، فقد يتم مسح جداول 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

إضافة تعليق