UDP zulaketa sinplea IPIP tunel bat erabiliz adibide gisa

Eguneko une ona!

Artikulu honetan nola inplementatu nuen kontatu nahi dizut (bat gehiago) NAT atzean kokatutako bi ordenagailu konektatzeko Bash script bat UDP zulaketa teknologia erabiliz Ubuntu/Debian OS adibide gisa erabiliz.

Konexio bat ezartzeak hainbat urrats ditu:

  1. Nodo bat abiarazi eta urruneko nodoa prest egon arte zain;
  2. Kanpoko IP helbidea eta UDP ataka zehaztea;
  3. Kanpoko IP helbidea eta UDP ataka urruneko ostalari batera transferitzea;
  4. Urrutiko ostalari batetik kanpoko IP helbidea eta UDP ataka lortzea;
  5. IPIP tunel baten antolaketa;
  6. Konexioaren jarraipena;
  7. Konexioa galtzen bada, ezabatu IPIP tunela.

Aspaldi pentsatu nuen eta oraindik pentsatzen dut zer erabil daitekeen nodoen artean datuak trukatzeko, momentu honetan niretzat errazena eta azkarrena Yandex.disk-en bidez lan egitea da.

  • Lehenik eta behin, erabiltzeko erraza da - 3 ekintza behar dituzu: sortu, irakurri, ezabatu. Kizkurrekin hau da:
    Sortu:

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

    Irakurri:

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

    Ezabatu:

    curl -s -X DELETE --user "$usename:$password" https://webdav.yandex.ru/$folder
  • Bigarrenik, erraza da instalatzea:
    apt install curl

Kanpoko IP helbidea eta UDP ataka zehazteko, erabili stun-client komandoa:

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

Instalazioa komandoarekin:

apt install stun-client

Tunel bat antolatzeko, iproute2 paketeko OS tresna estandarrak erabiltzen dira. Existitzen da tunel asko bitarteko estandarrak erabiliz planteatu daitekeena (L2TPv3, GRE, etab.), baina IPIP aukeratu dut sisteman karga gehigarri minimoa sortzen duelako. L2TPv3 UDP bidez probatu nuen eta etsita geratu nintzen, abiadura 10 aldiz jaitsi zen, baina hornitzaileekin edo beste zerbaitekin lotutako hainbat murrizketa izan litezke. IPIP tunelak IP mailan funtzionatzen duenez, FOU tunela UDP ataka mailan funtzionatzeko erabiltzen da. IPIP tunel bat antolatzeko behar duzu:

β€” kargatu FOU modulua:

modprobe fou

β€” Entzun tokiko portua:

ip fou add port $localport ipproto 4

β€” sortu tunela:

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

β€” igo tunelaren interfazea:

ip link set up dev fou$name

β€” esleitu tunelaren barneko tokiko eta barruko urruneko IP helbideak:

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

Ezabatu tunel bat:

ip link del dev fou$name

ip fou del port $localport

Tunelaren egoera kontrolatzen da aldiro urruneko nodoaren tunelaren barne IP helbidearen ping-a komandoarekin:

ping -c 1 $peerip -s 0

Aldizkako ping-a behar da batez ere kanala mantentzeko, bestela, tunela inaktibo dagoenean, bideratzaileetako NAT taulak garbitu daitezke eta orduan konexioa hautsi egingo da.

Ping-a desagertzen bada, IPIP tunela ezabatu egingo da eta urruneko ostalaritik prest egon arte itxarongo da.

Gidoia bera:

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

aldagai erabiltzailea, pasahitza ΠΈ karpeta berdina izan beharko luke bi aldeetan, baina tip - desberdinak, adibidez: 10.0.0.1 eta 10.0.0.2. Nodoetako ordua sinkronizatu behar da. Scripta honela exekutatu dezakezu:

nohup script.sh &

Zure arreta erakarri nahi nuke IPIP tunela segurua ez dela trafikoa zifratuta ez dagoelako ikuspuntutik, baina hau erraz konpondu daiteke IPsec bidez. Artikulu honetan, sinplea eta ulergarria iruditu zitzaidan.

Hainbat aste daramatzat laneko ordenagailu batera konektatzeko script hau erabiltzen eta ez dut arazorik sumatu. Erosoa ezarri eta ahazteari dagokionez.

Beharbada iruzkinak eta iradokizunak izango dituzu, gustura entzungo naiz.

Eskerrik asko zure arreta!

Iturria: www.habr.com

Gehitu iruzkin berria