Lihtne UDP-augu mulgustamine, kasutades nÀitena IPIP-tunnelit

Hea kellaaeg!

Selles artiklis tahan teile rÀÀkida, kuidas ma rakendasin (ĂŒks veel) Bash-skript kahe arvuti ĂŒhendamiseks NAT-i taga UDP augustamistehnoloogia abil, kasutades operatsioonisĂŒsteemi nĂ€itena Ubuntu/Debian.

Ühenduse loomine koosneb mitmest etapist:

  1. SÔlme kÀivitamine ja kaugsÔlme valmisoleku ootamine;
  2. VÀlise IP-aadressi ja UDP-pordi mÀÀramine;
  3. VĂ€lise IP-aadressi ja UDP-pordi edastamine kaughostile;
  4. VĂ€lise IP-aadressi ja UDP-pordi hankimine kaughostilt;
  5. IPIP tunneli organiseerimine;
  6. Ühenduse jĂ€lgimine;
  7. Kui ĂŒhendus katkeb, kustutage IPIP-tunnel.

MÔtlesin kaua ja mÔtlen siiani, millega saab sÔlmede vahel andmeid vahetada, minu jaoks on hetkel kÔige lihtsam ja kiirem töö Yandex.diski kaudu.

  • Esiteks on seda lihtne kasutada - vajate 3 toimingut: looge, lugege, kustutage. Curl puhul on see:
    Loo:
    curl -s -X MKCOL --user "$usename:$password" https://webdav.yandex.ru/$folder

    Loe:

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

    Kustuta:

    curl -s -X DELETE --user "$usename:$password" https://webdav.yandex.ru/$folder
  • Teiseks on seda lihtne paigaldada:
    apt install curl

VÀlise IP-aadressi ja UDP-pordi mÀÀramiseks kasutage kÀsku stun-client:

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

Paigaldamine kÀsuga:

apt install stun-client

Tunneli korraldamiseks kasutatakse standardseid OS-i tööriistu paketist iproute2. Olemas palju tunneleid mida saab tĂ”sta standardsete vahenditega (L2TPv3, GRE jne), kuid valisin IPIP, kuna see tekitab sĂŒsteemile minimaalse lisakoormuse. Proovisin L2TPv3 ĂŒle UDP ja olin pettunud, kiirus langes 10 korda, kuid need vĂ”ivad olla erinevad pakkujatega seotud piirangud vĂ”i midagi muud. Kuna IPIP-tunnel töötab IP-tasemel, kasutatakse FOU-tunnelit töötamiseks UDP-pordi tasemel. IPIP-tunneli korraldamiseks vajate:

— laadige FOU moodul:

modprobe fou

— kuulake kohalikku porti:

ip fou add port $localport ipproto 4

— tunneli loomine:

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

— tĂ”sta tunneli liidest:

ip link set up dev fou$name

— mÀÀrata tunneli sisemised kohalikud ja sisemised kaug-IP-aadressid:

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

Tunneli kustutamine:

ip link del dev fou$name

ip fou del port $localport

Tunneli olekut jÀlgitakse, pingides perioodiliselt kaugsÔlme tunneli sisemist IP-aadressi kÀsuga:

ping -c 1 $peerip -s 0

Perioodilist pingi on vaja eelkĂ”ige kanali hooldamiseks, vastasel juhul vĂ”idakse tunneli jĂ”udeolekul ruuterite NAT-tabelid tĂŒhjendada ja siis ĂŒhendus katkeda.

Kui ping kaob, siis IPIP-tunnel kustutatakse ja ootab kaughosti valmisolekut.

Skript ise:

#!/bin/bash
username="username@yandex.ru"
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

Muutujad kasutajanimi, parool Đž kausta peaks olema mĂ”lemal kĂŒljel sama, kuid piiluma - erinevad, nĂ€iteks: 10.0.0.1 ja 10.0.0.2. SĂ”lmede aeg peab olema sĂŒnkroonitud. Saate skripti kĂ€ivitada jĂ€rgmiselt:

nohup script.sh &

Juhin teie tĂ€helepanu asjaolule, et IPIP tunnel on ebaturvaline, kuna liiklus ei ole krĂŒptitud, kuid seda saab hĂ”lpsasti lahendada IPsec ĂŒle see artikkel, tundus see mulle lihtne ja arusaadav.

Olen seda skripti kasutanud tööarvutiga ĂŒhenduse loomiseks juba mitu nĂ€dalat ja pole probleeme mĂ€rganud. Mugav selle seadistamise ja unustamise poolest.

VÔib-olla on teil kommentaare ja ettepanekuid, kuulan hea meelega.

TÀnan teid tÀhelepanu eest!

Allikas: www.habr.com

Ostke DDoS-kaitsega saitide jaoks usaldusvÀÀrne hostimine, VPS VDS-serverid đŸ”„ Osta usaldusvÀÀrne veebimajutus DDoS-kaitsega, VPS VDS serverid | ProHoster