IPIP சுரங்கப்பாதையை உதாரணமாகப் பயன்படுத்தி எளிய UDP துளை குத்துதல்

நல்ல நாள்!

இந்த கட்டுரையில் நான் எப்படி செயல்படுத்தினேன் என்பதை உங்களுக்கு சொல்ல விரும்புகிறேன் (இன்னும் ஒரு) உபுண்டு/டெபியன் OS ஐப் பயன்படுத்தி UDP ஹோல் குத்தும் தொழில்நுட்பத்தைப் பயன்படுத்தி NATக்குப் பின்னால் அமைந்துள்ள இரண்டு கணினிகளை இணைப்பதற்கான ஒரு பாஷ் ஸ்கிரிப்ட்.

இணைப்பை நிறுவுவது பல படிகளைக் கொண்டுள்ளது:

  1. ஒரு முனையைத் தொடங்கி, ரிமோட் முனை தயாராகும் வரை காத்திருக்கிறது;
  2. வெளிப்புற IP முகவரி மற்றும் UDP போர்ட்டை தீர்மானித்தல்;
  3. வெளிப்புற IP முகவரி மற்றும் UDP போர்ட்டை ரிமோட் ஹோஸ்டுக்கு மாற்றுதல்;
  4. ரிமோட் ஹோஸ்டிலிருந்து வெளிப்புற ஐபி முகவரி மற்றும் யுடிபி போர்ட்டைப் பெறுதல்;
  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 தொகுப்பிலிருந்து நிலையான 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 அட்டவணைகள் அழிக்கப்படலாம், பின்னர் இணைப்பு துண்டிக்கப்படும்.

பிங் மறைந்துவிட்டால், ஐபிஐபி சுரங்கப்பாதை நீக்கப்பட்டு ரிமோட் ஹோஸ்டிலிருந்து தயாராக இருக்கும்.

ஸ்கிரிப்ட் தானே:

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

கருத்தைச் சேர்