ఉదాహరణగా IPIP టన్నెల్‌ని ఉపయోగించి సింపుల్ UDP హోల్ పంచింగ్

రోజు మంచి సమయం!

ఈ వ్యాసంలో నేను ఎలా అమలు చేసాను అని చెప్పాలనుకుంటున్నాను (మరొకసారి) Ubuntu/Debian OSని ఉదాహరణగా ఉపయోగించి UDP హోల్ పంచింగ్ టెక్నాలజీని ఉపయోగించి NAT వెనుక ఉన్న రెండు కంప్యూటర్‌లను కనెక్ట్ చేయడానికి ఒక బాష్ స్క్రిప్ట్.

కనెక్షన్‌ని ఏర్పాటు చేయడం అనేక దశలను కలిగి ఉంటుంది:

  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 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

కమాండ్‌తో రిమోట్ నోడ్ టన్నెల్ యొక్క అంతర్గత 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

వేరియబుల్స్ <span style="font-family: Mandali; "> యూజర్ పేరు </span>, <span style="font-family: Mandali; "> పాస్‌వర్డ్</span> и ఫోల్డర్ రెండు వైపులా ఒకే విధంగా ఉండాలి, కానీ సూచన - భిన్నమైనది, ఉదాహరణకు: 10.0.0.1 మరియు 10.0.0.2. నోడ్స్‌లోని సమయం తప్పనిసరిగా సమకాలీకరించబడాలి. మీరు స్క్రిప్ట్‌ను ఇలా అమలు చేయవచ్చు:

nohup script.sh &

ట్రాఫిక్ గుప్తీకరించబడనందున IPIP సొరంగం సురక్షితం కాదని నేను మీ దృష్టిని ఆకర్షించాలనుకుంటున్నాను, అయితే ఇది IPsecని ఉపయోగించి సులభంగా పరిష్కరించబడుతుంది. ఈ వ్యాసం, ఇది నాకు సరళంగా మరియు అర్థమయ్యేలా అనిపించింది.

నేను చాలా వారాలుగా పని PCకి కనెక్ట్ చేయడానికి ఈ స్క్రిప్ట్‌ని ఉపయోగిస్తున్నాను మరియు ఎటువంటి సమస్యలను గమనించలేదు. దీన్ని సెట్ చేయడం మరియు మరచిపోవడం పరంగా అనుకూలమైనది.

బహుశా మీకు వ్యాఖ్యలు మరియు సూచనలు ఉండవచ్చు, నేను వినడానికి సంతోషిస్తాను.

Спасибо!

మూలం: www.habr.com

ఒక వ్యాఖ్యను జోడించండి