Punching poll UDP simplí ag baint úsáide as tollán IPIP mar shampla

Dea-am den lá!

San Airteagal seo ba mhaith liom a insint duit conas a chuir mé i bhfeidhm (ceann amháin eile) script Bash chun dhá ríomhaire a nascadh taobh thiar de NAT ag baint úsáide as teicneolaíocht pollta poll UDP ag baint úsáide as an Ubuntu / Debian OS mar shampla.

Tá roinnt céimeanna i gceist le nasc a bhunú:

  1. Nód a thosú agus ag fanacht leis an nód iargúlta a bheith réidh;
  2. An seoladh IP seachtrach agus an calafort UDP a chinneadh;
  3. Seoladh IP seachtrach agus calafort UDP a aistriú chuig óstach cianda;
  4. Seoladh IP seachtrach agus calafort UDP a fháil ó chianóstach;
  5. Eagrú tollán IPIP;
  6. Monatóireacht ar nasc;
  7. Má chailltear an nasc, scrios an tollán IPIP.

Shíl mé ar feadh i bhfad agus fós ag smaoineamh cad is féidir a úsáid chun sonraí a mhalartú idir nóid, is é an ceann is simplí agus is tapúla dom faoi láthair ag obair trí Yandex.disk.

  • Ar an gcéad dul síos, tá sé éasca le húsáid - tá 3 ghníomh de dhíth ort: cruthaigh, léigh, scrios. Le curl is é seo:
    Cruthaigh:

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

    Léigh:

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

    Scrios:

    curl -s -X DELETE --user "$usename:$password" https://webdav.yandex.ru/$folder
  • Ar an dara dul síos, tá sé éasca a shuiteáil:
    apt install curl

Chun an seoladh IP seachtrach agus an calafort UDP a chinneadh, bain úsáid as an ordú stun-client:

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

Suiteáil le hordú:

apt install stun-client

Chun tollán a eagrú, úsáidtear uirlisí caighdeánacha OS ón bpacáiste iproute2. ann go leor tolláin is féidir a ardú trí úsáid a bhaint as modhanna caighdeánacha (L2TPv3, GRE, etc.), ach roghnaigh mé IPIP toisc go gcruthaíonn sé ualach breise íosta ar an gcóras. Bhain mé triail as L2TPv3 thar UDP agus bhí díomá orm, thit an luas 10 n-uaire, ach d'fhéadfadh siad seo a bheith ina srianta éagsúla a bhaineann le soláthraithe nó rud éigin eile. Ós rud é go n-oibríonn an tollán IPIP ag an leibhéal IP, úsáidtear an tollán FOU chun oibriú ag leibhéal calafoirt an UDP. Chun tollán IPIP a eagrú is gá duit:

— lódáil an modúl FOU:

modprobe fou

— éist le port áitiúil:

ip fou add port $localport ipproto 4

— cruthaigh tollán:

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

— ardaigh comhéadan an tolláin:

ip link set up dev fou$name

— ciansheoltaí IP inmheánacha áitiúla agus inmheánacha an tolláin a shannadh:

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

Scrios tollán:

ip link del dev fou$name

ip fou del port $localport

Déantar monatóireacht ar staid an tolláin trí sheoladh IP inmheánach an tolláin nód cianda a phingeáil go tréimhsiúil leis an ordú:

ping -c 1 $peerip -s 0

Tá gá le ping tréimhsiúil go príomha chun an cainéal a chothabháil, ar shlí eile, nuair a bhíonn an tollán díomhaoin, féadfar na táblaí NAT ar na ródairí a ghlanadh agus ansin déanfar an nasc a bhriseadh.

Má imíonn an ping, scriostar an tollán IPIP agus fanfaidh sé réidh ón óstach iargúlta.

An script fé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

Athróga ainm úsáideora, Focal faire и fillteán chóir a bheith mar an gcéanna ar an dá thaobh, ach intip - difriúil, mar shampla: 10.0.0.1 agus 10.0.0.2. Ní mór an t-am ar na nóid a shioncrónú. Is féidir leat an script a rith mar seo:

nohup script.sh &

Ba mhaith liom d'aird a tharraingt ar an bhfíric go bhfuil an tollán IPIP neamhshábháilte ó thaobh nach bhfuil an trácht criptithe, ach is féidir é seo a réiteach go héasca trí úsáid a bhaint as IPsec thar an t-alt seo, ba chosúil go raibh sé simplí agus intuigthe domsa.

Tá an script seo á úsáid agam chun nascadh le ríomhaire oibre le roinnt seachtainí anuas anois agus níor thug mé faoi deara aon fhadhbanna. Áisiúil ó thaobh é a shocrú agus dearmad a dhéanamh air.

B'fhéidir go mbeidh tuairimí agus moltaí agat, beidh áthas orm éisteacht.

Go raibh maith agat as bhur n-aire!

Foinse: will.com

Add a comment