उदाहरण के तौर पर आईपीआईपी सुरंग का उपयोग करके सरल यूडीपी छेद छिद्रण

दिन का अच्छा समय!

इस लेख में मैं आपको बताना चाहता हूं कि मैंने इसे कैसे लागू किया (एक और) उदाहरण के तौर पर उबंटू/डेबियन ओएस का उपयोग करके यूडीपी होल पंचिंग तकनीक का उपयोग करके NAT के पीछे दो कंप्यूटरों को जोड़ने के लिए एक बैश स्क्रिप्ट।

कनेक्शन स्थापित करने में कई चरण होते हैं:

  1. एक नोड शुरू करना और रिमोट नोड के तैयार होने की प्रतीक्षा करना;
  2. बाहरी आईपी पता और यूडीपी पोर्ट का निर्धारण;
  3. किसी बाहरी आईपी पते और यूडीपी पोर्ट को किसी दूरस्थ होस्ट पर स्थानांतरित करना;
  4. किसी दूरस्थ होस्ट से बाहरी आईपी पता और यूडीपी पोर्ट प्राप्त करना;
  5. आईपीआईपी सुरंग का संगठन;
  6. कनेक्शन की निगरानी;
  7. यदि कनेक्शन खो गया है, तो आईपीआईपी सुरंग हटा दें।

मैंने लंबे समय तक सोचा और अब भी सोचता हूं कि नोड्स के बीच डेटा का आदान-प्रदान करने के लिए क्या उपयोग किया जा सकता है, इस समय मेरे लिए सबसे सरल और तेज़ 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

बाहरी आईपी पता और यूडीपी पोर्ट निर्धारित करने के लिए, स्टन-क्लाइंट कमांड का उपयोग करें:

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

आदेश के साथ स्थापना:

apt install stun-client

सुरंग को व्यवस्थित करने के लिए, iproute2 पैकेज से मानक OS उपकरण का उपयोग किया जाता है। मौजूद कई सुरंगें जिसे मानक साधनों (L2TPv3, GRE, आदि) का उपयोग करके बढ़ाया जा सकता है, लेकिन मैंने IPIP को चुना क्योंकि यह सिस्टम पर न्यूनतम अतिरिक्त भार पैदा करता है। मैंने यूडीपी पर एल2टीपीवी3 को आज़माया और निराश हुआ, गति 10 गुना कम हो गई, लेकिन ये प्रदाताओं या कुछ और से संबंधित विभिन्न प्रतिबंध हो सकते हैं। चूँकि IPIP सुरंग IP स्तर पर संचालित होती है, FOU सुरंग का उपयोग UDP पोर्ट स्तर पर संचालित करने के लिए किया जाता है। आईपीआईपी सुरंग को व्यवस्थित करने के लिए आपको चाहिए:

- 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 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 तालिकाएँ साफ़ हो सकती हैं और फिर कनेक्शन टूट जाएगा।

यदि पिंग गायब हो जाता है, तो आईपीआईपी सुरंग हटा दी जाती है और दूरस्थ होस्ट से तैयारी की प्रतीक्षा की जाती है।

स्क्रिप्ट स्वयं:

#!/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

एक टिप्पणी जोड़ें