Eenvoudige UDP-gatpons met 'n IPIP-tonnel as voorbeeld

Goeie tyd van die dag!

In hierdie artikel wil ek jou vertel hoe ek (nog een) 'n Bash-skrif vir die koppeling van twee rekenaars agter NAT deur UDP-gatponstegnologie te gebruik met die Ubuntu/Debian-bedryfstelsel as 'n voorbeeld.

Die vestiging van 'n verbinding bestaan ​​uit verskeie stappe:

  1. Begin 'n nodus en wag vir die afgeleë nodus om gereed te wees;
  2. Bepaling van die eksterne IP-adres en UDP-poort;
  3. Die oordrag van 'n eksterne IP-adres en UDP-poort na 'n afgeleë gasheer;
  4. Verkryging van 'n eksterne IP-adres en UDP-poort vanaf 'n afgeleë gasheer;
  5. Organisasie van 'n IPIP-tonnel;
  6. Verbindingsmonitering;
  7. As die verbinding verloor word, vee die IPIP-tonnel uit.

Ek het lank gedink en dink steeds wat gebruik kan word om data tussen nodusse uit te ruil, die eenvoudigste en vinnigste vir my op die oomblik werk deur Yandex.disk.

  • Eerstens is dit maklik om te gebruik - jy benodig 3 aksies: skep, lees, verwyder. Met krul is dit:
    Skep:

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

    Lees:

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

    Vee uit:

    curl -s -X DELETE --user "$usename:$password" https://webdav.yandex.ru/$folder
  • Tweedens is dit maklik om te installeer:
    apt install curl

Om die eksterne IP-adres en UDP-poort te bepaal, gebruik die stun-client-opdrag:

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

Installasie met opdrag:

apt install stun-client

Om 'n tonnel te organiseer, word standaard OS-nutsgoed van die iproute2-pakket gebruik. Bestaan baie tonnels wat opgewek kan word met behulp van standaardmiddels (L2TPv3, GRE, ens.), maar ek het IPIP gekies omdat dit minimale bykomende las op die stelsel skep. Ek het L2TPv3 oor UDP probeer en was teleurgesteld, die spoed het 10 keer gedaal, maar dit kan verskeie beperkings wees wat verband hou met verskaffers of iets anders. Aangesien die IPIP-tonnel op die IP-vlak werk, word die FOU-tonnel gebruik om op die UDP-poortvlak te werk. Om 'n IPIP-tonnel te organiseer, benodig jy:

— laai die FOU-module:

modprobe fou

- luister na plaaslike hawe:

ip fou add port $localport ipproto 4

- skep 'n tonnel:

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

- verhoog die tonnel-koppelvlak:

ip link set up dev fou$name

- ken interne plaaslike en interne afgeleë IP-adresse van die tonnel toe:

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

Vee 'n tonnel uit:

ip link del dev fou$name

ip fou del port $localport

Die tonneltoestand word gemonitor deur die interne IP-adres van die afgeleë nodustonnel periodiek te ping met die opdrag:

ping -c 1 $peerip -s 0

Periodieke ping is hoofsaaklik nodig om die kanaal in stand te hou, anders, wanneer die tonnel ledig is, kan die NAT-tabelle op die routers uitgevee word en dan sal die verbinding verbreek word.

As die ping verdwyn, word die IPIP-tonnel uitgevee en wag vir gereedheid van die afgeleë gasheer.

Eintlik die skrif self:

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

veranderlikes Gebruikersnaam, Wagwoord и gids moet dieselfde wees aan beide kante, maar loer - verskillend, byvoorbeeld: 10.0.0.1 en 10.0.0.2. Die tyd op die nodusse moet gesinchroniseer word. Jy kan die skrip soos volg laat loop:

nohup script.sh &

Ek wil u aandag daarop vestig dat die IPIP tonnel onveilig is uit die oogpunt van die feit dat die verkeer nie geïnkripteer is nie, maar dit kan maklik opgelos word deur gebruik te maak van IPsec oor Hierdie artikel, dit het vir my eenvoudig en verstaanbaar gelyk.

Ek gebruik hierdie skrif al vir 'n paar weke om aan 'n werkrekenaar te koppel en het geen probleme opgemerk nie. Gerieflik in terme van stel dit en vergeet dit.

Miskien sal jy kommentaar en voorstelle hê, ek sal bly wees om te luister.

Skep 'n nuwe weergawe!

Bron: will.com

Voeg 'n opmerking