Pulladh toll UDP sìmplidh a’ cleachdadh tunail IPIP mar eisimpleir

Latha math!

San artaigil seo tha mi airson innse dhut mar a chuir mi an gnìomh (aon a bharrachd) sgriobt Bash airson dà choimpiutair a cheangal air cùl NAT a’ cleachdadh teicneòlas punching toll UDP a’ cleachdadh an Ubuntu/Debian OS mar eisimpleir.

Tha stèidheachadh ceangail air a dhèanamh suas de ghrunn cheuman:

  1. A 'tòiseachadh nod agus a' feitheamh ris an nód iomallach a bhith deiseil;
  2. Co-dhùnadh an seòladh IP taobh a-muigh agus port UDP;
  3. A’ gluasad seòladh IP taobh a-muigh agus port UDP gu aoigheachd iomallach;
  4. A’ faighinn seòladh IP taobh a-muigh agus port UDP bho òstair iomallach;
  5. Eagrachadh tunail IPIP;
  6. Sgrùdadh ceangail;
  7. Ma thèid an ceangal a chall, cuir às don tunail IPIP.

Bha mi a 'smaoineachadh airson ùine mhòr agus tha mi fhathast a' smaoineachadh dè a ghabhas cleachdadh airson dàta iomlaid eadar nodan, is e an rud as sìmplidh agus as luaithe dhomhsa an-dràsta ag obair tro Yandex.disk.

  • An toiseach, tha e furasta a chleachdadh - feumaidh tu 3 gnìomhan: cruthaich, leugh, cuir às. Le curl tha seo:
    Cruthaich:

    curl -s -X MKCOL --user "$usename:$password" https://webdav.yandex.ru/$folder

    Leugh:

    curl -s --user "$usename:$password" -X PROPFIND -H "Depth: 1" https://webdav.yandex.ru/$folder

    Cuir às:

    curl -s -X DELETE --user "$usename:$password" https://webdav.yandex.ru/$folder
  • San dàrna àite, tha e furasta a stàladh:
    apt install curl

Gus an seòladh IP taobh a-muigh agus port UDP a dhearbhadh, cleachd an àithne stun-client:

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

Stàladh le òrdugh:

apt install stun-client

Gus tunail a chuir air dòigh, thathas a’ cleachdadh innealan àbhaisteach OS bhon phasgan iproute2. Tha ann iomadh tunail a ghabhas àrdachadh le bhith a’ cleachdadh dòighean àbhaisteach (L2TPv3, GRE, msaa), ach thagh mi IPIP leis gu bheil e a’ cruthachadh glè bheag de luchd a bharrachd air an t-siostam. Dh’ fheuch mi L2TPv3 thairis air UDP agus bha mi tàmailteach, thuit an astar 10 tursan, ach dh’ fhaodadh iad sin a bhith nan diofar chuingealachaidhean co-cheangailte ri solaraichean no rudeigin eile. Leis gu bheil an tunail IPIP ag obair aig ìre IP, thathas a’ cleachdadh an tunail FOU gus obrachadh aig ìre port UDP. Gus tunail IPIP a chuir air dòigh feumaidh tu:

- luchdaich am modal FOU:

modprobe fou

- èist ri port ionadail:

ip fou add port $localport ipproto 4

- cruthaich tunail:

ip link add name fou$name type ipip remote $remoteip local $localip encap fou  encap-sport $localport encap-dport $remoteport

- àrdaich eadar-aghaidh an tunail:

ip link set up dev fou$name

- sònraich seòlaidhean IP iomallach a-staigh agus a-staigh an tunail:

ip addr add $intIP peer $peerip dev fou$name

Sguab às tunail:

ip link del dev fou$name

ip fou del port $localport

Bithear a’ cumail sùil air staid an tunail le bhith a’ putadh bho àm gu àm seòladh IP a-staigh an tunail nód iomallach leis an àithne:

ping -c 1 $peerip -s 0

Tha feum air ping bho àm gu àm gu sònraichte gus an t-sianal a chumail suas, air neo, nuair a tha an tunail leisg, faodar na bùird NAT air na routers a ghlanadh agus an uairsin thèid an ceangal a bhriseadh.

Ma thèid am ping à sealladh, thèid an tunail IPIP a dhubhadh às agus feitheamh ri ullachadh bhon òstair iomallach.

An sgriobt fhèin:

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

Caochlaidhean ainm-cleachdaidh, facal-faire и pasgan bu chòir dha a bhith mar an ceudna air gach taobh, ach snìomh - eadar-dhealaichte, mar eisimpleir: 10.0.0.1 agus 10.0.0.2. Feumaidh an ùine air na nodan a bhith air a shioncronachadh. Faodaidh tu an sgriobt a ruith mar seo:

nohup script.sh &

Bu mhath leam d ’aire a tharraing gu bheil an tunail IPIP mì-shàbhailte leis nach eil an trafaic air a chrioptachadh, ach faodar seo fhuasgladh gu furasta le bhith a’ cleachdadh IPsec thairis. an artaigil seo, bha e coltach riumsa sìmplidh agus so-thuigsinn.

Tha mi air a bhith a’ cleachdadh an sgriobt seo gus ceangal ri PC obrach airson grunn sheachdainean a-nis agus cha do mhothaich mi duilgheadasan sam bith. Goireasach a thaobh a shuidheachadh agus a dhìochuimhneachadh.

Is dòcha gum bi beachdan agus molaidhean agad, bidh mi toilichte èisteachd.

Спасибо за внимание!

Source: www.habr.com

Cuir beachd ann