الوقت المناسب من اليوم!
في هذه المقالة أريد أن أخبركم كيف قمت بتنفيذ (
يتكون إنشاء الاتصال من عدة خطوات:
- بدء عقدة وانتظار أن تصبح العقدة البعيدة جاهزة؛
- تحديد عنوان IP الخارجي ومنفذ UDP؛
- نقل عنوان IP خارجي ومنفذ UDP إلى مضيف بعيد؛
- الحصول على عنوان IP خارجي ومنفذ UDP من مضيف بعيد؛
- تنظيم نفق IPIP؛
- مراقبة الاتصال؛
- في حالة فقدان الاتصال، قم بحذف نفق 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. موجود
- تحميل وحدة 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