рдЙрджрд╛рд╣рд░рдг рдореНрд╣рдгреВрди IPIP рдмреЛрдЧрджреНрдпрд╛рдЪрд╛ рд╡рд╛рдкрд░ рдХрд░реВрди рд╕рд╛рдзреЗ UDP рд╣реЛрд▓ рдкрдВрдЪрд┐рдВрдЧ

рд╢реБрдн рджрд┐рд╡рд╕!

рдпрд╛ рд▓реЗрдЦрд╛рдд рдореА рддреБрдореНрд╣рд╛рд▓рд╛ рд╕рд╛рдВрдЧреВ рдЗрдЪреНрдЫрд┐рддреЛ рдХреА рдореА рдХрд╕реЗ рдЕрдВрдорд▓рд╛рдд рдЖрдгрд▓реЗ (рджреБрд╕рд░рд╛) рдЙрджрд╛рд╣рд░рдг рдореНрд╣рдгреВрди рдЙрдмрдВрдЯреВ/рдбреЗрдмрд┐рдпрди рдУрдПрд╕ рд╡рд╛рдкрд░реВрди UDP рд╣реЛрд▓ рдкрдВрдЪрд┐рдВрдЧ рддрдВрддреНрд░рдЬреНрдЮрд╛рди рд╡рд╛рдкрд░реВрди NAT рдЪреНрдпрд╛ рдорд╛рдЧреЗ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рджреЛрди рд╕рдВрдЧрдгрдХрд╛рдВрдирд╛ рдЬреЛрдбрдгреНрдпрд╛рд╕рд╛рдареА рдмреЕрд╢ рд╕реНрдХреНрд░рд┐рдкреНрдЯ.

рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЕрдиреЗрдХ рдЪрд░рдгреЗ рдЕрд╕рддрд╛рдд:

  1. рдиреЛрдб рд╕реБрд░реВ рдХрд░рдгреЗ рдЖрдгрд┐ рд░рд┐рдореЛрдЯ рдиреЛрдб рддрдпрд╛рд░ рд╣реЛрдгреНрдпрд╛рдЪреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдгреЗ;
  2. рдмрд╛рд╣реНрдп IP рдкрддреНрддрд╛ рдЖрдгрд┐ UDP рдкреЛрд░реНрдЯ рдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдгреЗ;
  3. рдмрд╛рд╣реНрдп IP рдкрддреНрддрд╛ рдЖрдгрд┐ UDP рдкреЛрд░реНрдЯ рд░рд┐рдореЛрдЯ рд╣реЛрд╕реНрдЯрд╡рд░ рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рдХрд░рдгреЗ;
  4. рд░рд┐рдореЛрдЯ рд╣реЛрд╕реНрдЯрдХрдбреВрди рдмрд╛рд╣реНрдп IP рдкрддреНрддрд╛ рдЖрдгрд┐ UDP рдкреЛрд░реНрдЯ рдорд┐рд│рд╡рдгреЗ;
  5. рдЖрдпрдкреАрдЖрдпрдкреА рдмреЛрдЧрджреНрдпрд╛рдЪреА рд╕рдВрд╕реНрдерд╛;
  6. рдХрдиреЗрдХреНрд╢рди рдирд┐рд░реАрдХреНрд╖рдг;
  7. рдХрдиреЗрдХреНрд╢рди рд╣рд░рд╡рд▓реНрдпрд╛рд╕, IPIP рдмреЛрдЧрджрд╛ рд╣рдЯрд╡рд╛.

рдореА рдмрд░реНрдпрд╛рдЪ рдХрд╛рд│рд╛рдкрд╛рд╕реВрди рд╡рд┐рдЪрд╛рд░ рдХреЗрд▓рд╛ рдЖрдгрд┐ рдЕрдЬреВрдирд╣реА рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЛ рдХреА рдиреЛрдбреНрд╕рдордзреАрд▓ рдбреЗрдЯрд╛рдЪреА рджреЗрд╡рд╛рдгрдШреЗрд╡рд╛рдг рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдХрд╛рдп рд╡рд╛рдкрд░рд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ, рдпрд╛рдХреНрд╖рдгреА рдорд╛рдЭреНрдпрд╛рд╕рд╛рдареА рд╕рд░реНрд╡рд╛рдд рд╕реЛрдкрд╛ рдЖрдгрд┐ рд╡реЗрдЧрд╡рд╛рди Yandex.disk рджреНрд╡рд╛рд░реЗ рдХрд╛рд░реНрдп рдХрд░рдд рдЖрд╣реЗ.

  • рдкреНрд░рдердо, рддреЗ рд╡рд╛рдкрд░рдгреЗ рд╕реЛрдкреЗ рдЖрд╣реЗ - рдЖрдкрд▓реНрдпрд╛рд▓рд╛ 3 рдХреНрд░рд┐рдпрд╛рдВрдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЖрд╣реЗ: рддрдпрд╛рд░ рдХрд░рд╛, рд╡рд╛рдЪрд╛, рд╣рдЯрд╡рд╛. рдХрд░реНрд▓ рд╕рд╣ рд╣реЗ рдЖрд╣реЗ:
    рддрдпрд╛рд░ рдХрд░рд╛:

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

    рд╡рд╛рдЪрд╛:

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

    рд╣рдЯрд╡рд╛:

    curl -s -X DELETE --user "$usename:$password" https://webdav.yandex.ru/$folder
  • рджреБрд╕рд░реЗ рдореНрд╣рдгрдЬреЗ, рддреЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреЗ рд╕реЛрдкреЗ рдЖрд╣реЗ:
    apt install curl

рдмрд╛рд╣реНрдп IP рдкрддреНрддрд╛ рдЖрдгрд┐ UDP рдкреЛрд░реНрдЯ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, stun-client рдХрдорд╛рдВрдб рд╡рд╛рдкрд░рд╛:

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

рдХрдорд╛рдВрдбрд╕рд╣ рд╕реНрдерд╛рдкрдирд╛:

apt install stun-client

рдмреЛрдЧрджрд╛ рдЖрдпреЛрдЬрд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, iproute2 рдкреЕрдХреЗрдЬрдордзреАрд▓ рдорд╛рдирдХ OS рд╕рд╛рдзрдиреЗ рд╡рд╛рдкрд░рд▓реА рдЬрд╛рддрд╛рдд. рдЕрд╕реНрддрд┐рддреНрд╡рд╛рдд рдЕрдиреЗрдХ рдмреЛрдЧрджреЗ рдЬреЗ рдорд╛рдирдХ рдорд╛рдзреНрдпрдо (L2TPv3, GRE, рдЗ.) рд╡рд╛рдкрд░реВрди рд╡рд╛рдврд╡рд▓реЗ тАЛтАЛрдЬрд╛рдК рд╢рдХрддреЗ, рдкрд░рдВрддреБ рдореА IPIP рдирд┐рд╡рдбрд▓реЗ рдХрд╛рд░рдг рддреЗ рд╕рд┐рд╕реНрдЯрдорд╡рд░ рдХрдореАрддрдХрдореА рдЕрддрд┐рд░рд┐рдХреНрдд рднрд╛рд░ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ. рдореА UDP рд╡рд░ L2TPv3 рдЪрд╛ рдкреНрд░рдпрддреНрди рдХреЗрд▓рд╛ рдЖрдгрд┐ рдирд┐рд░рд╛рд╢ рдЭрд╛рд▓реЛ, рд╡реЗрдЧ 10 рд╡реЗрд│рд╛ рдХрдореА рдЭрд╛рд▓рд╛, рдкрд░рдВрддреБ рд╣реЗ рдкреНрд░рджрд╛рддреНрдпрд╛рдВрд╢реА рд╕рдВрдмрдВрдзрд┐рдд рдХрд┐рдВрд╡рд╛ рдЗрддрд░ рдХрд╛рд╣реА рдирд┐рд░реНрдмрдВрдз рдЕрд╕реВ рд╢рдХрддрд╛рдд. IPIP рдмреЛрдЧрджрд╛ IP рд╕реНрддрд░рд╛рд╡рд░ рдХрд╛рд░реНрдпрд░рдд рдЕрд╕рд▓реНрдпрд╛рдиреЗ, FOU рдмреЛрдЧрджрд╛ UDP рдкреЛрд░реНрдЯ рд╕реНрддрд░рд╛рд╡рд░ рдСрдкрд░реЗрдЯ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╡рд╛рдкрд░рд▓рд╛ рдЬрд╛рддреЛ. IPIP рдмреЛрдЧрджрд╛ рдЖрдпреЛрдЬрд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ:

- FOU рдореЙрдбреНрдпреВрд▓ рд▓реЛрдб рдХрд░рд╛:

modprobe fou

- рд╕реНрдерд╛рдирд┐рдХ рдкреЛрд░реНрдЯ рдРрдХрд╛:

ip fou add port $localport ipproto 4

- рдПрдХ рдмреЛрдЧрджрд╛ рддрдпрд╛рд░ рдХрд░рд╛:

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

- рдмреЛрдЧрджрд╛ рдЗрдВрдЯрд░рдлреЗрд╕ рд╡рд╛рдврд╡рд╛:

ip link set up dev fou$name

- рдмреЛрдЧрджреНрдпрд╛рдЪреЗ рдЕрдВрддрд░реНрдЧрдд рд╕реНрдерд╛рдирд┐рдХ рдЖрдгрд┐ рдЕрдВрддрд░реНрдЧрдд рд░рд┐рдореЛрдЯ рдЖрдпрдкреА рдкрддреНрддреЗ рдирд┐рдпреБрдХреНрдд рдХрд░рд╛:

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

рдмреЛрдЧрджрд╛ рд╣рдЯрд╡рд╛:

ip link del dev fou$name

ip fou del port $localport

рдЖрджреЗрд╢рд╛рд╕рд╣ рд░рд┐рдореЛрдЯ рдиреЛрдб рдмреЛрдЧрджреНрдпрд╛рдЪрд╛ рдЕрдВрддрд░реНрдЧрдд IP рдкрддреНрддрд╛ рд╡реЗрд│реЛрд╡реЗрд│реА рдкрд┐рдВрдЧ рдХрд░реВрди рдмреЛрдЧрджреНрдпрд╛рдЪреНрдпрд╛ рд╕реНрдерд┐рддреАрдЪреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗрд▓реЗ рдЬрд╛рддреЗ:

ping -c 1 $peerip -s 0

рдирд┐рдпрддрдХрд╛рд▓рд┐рдХ рдкрд┐рдВрдЧ рдкреНрд░рд╛рдореБрдЦреНрдпрд╛рдиреЗ рдЪреЕрдиреЗрд▓ рд░рд╛рдЦрдгреНрдпрд╛рд╕рд╛рдареА рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ, рдЕрдиреНрдпрдерд╛, рдмреЛрдЧрджрд╛ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдЕрд╕рддрд╛рдирд╛, рд░рд╛рдЙрдЯрд░рд╡рд░реАрд▓ NAT рдЯреЗрдмрд▓реНрд╕ рд╕рд╛рдл рдХреЗрд▓реНрдпрд╛ рдЬрд╛рдК рд╢рдХрддрд╛рдд рдЖрдгрд┐ рдирдВрддрд░ рдХрдиреЗрдХреНрд╢рди рдЦрдВрдбрд┐рдд рд╣реЛрдИрд▓.

рдкрд┐рдВрдЧ рдЧрд╛рдпрдм рдЭрд╛рд▓реНрдпрд╛рд╕, рдЖрдпрдкреАрдЖрдпрдкреА рдмреЛрдЧрджрд╛ рд╣рдЯрд╡рд┐рд▓рд╛ рдЬрд╛рдИрд▓ рдЖрдгрд┐ рд░рд┐рдореЛрдЯ рд╣реЛрд╕реНрдЯрдХрдбреВрди рддрдпрд╛рд░реАрдЪреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрд▓.

рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реНрд╡рддрдГ:

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

рдЪрд▓ рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рдирд╛рд╡, рдкрд╛рд╕рд╡рд░реНрдб ╨╕ рдлреЛрд▓реНрдбрд░ рджреЛрдиреНрд╣реА рдмрд╛рдЬреВрдВрдиреА рд╕рдорд╛рди рдЕрд╕рд╛рд╡реЗ, рдкрд░рдВрддреБ рдЗрдВрдЯрд┐рдк - рднрд┐рдиреНрди, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде: 10.0.0.1 рдЖрдгрд┐ 10.0.0.2. рдиреЛрдбреНрд╕рд╡рд░реАрд▓ рд╡реЗрд│ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЭ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рддреБрдореНрд╣реА рдпрд╛рдкреНрд░рдорд╛рдгреЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд╛рд▓рд╡реВ рд╢рдХрддрд╛:

nohup script.sh &

рдореА рддреБрдордЪреЗ рд▓рдХреНрд╖ рд╡реЗрдзреВрди рдШреЗрдК рдЗрдЪреНрдЫрд┐рддреЛ рдХреА рдЖрдпрдкреАрдЖрдпрдкреА рдмреЛрдЧрджрд╛ рдЯреНрд░реЕрдлрд┐рдХ рдПрдирдХреНрд░рд┐рдкреНрдЯреЗрдб рдирд╕рд▓реНрдпрд╛рдЪреНрдпрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдирд╛рддреВрди рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдЖрд╣реЗ, рдкрд░рдВрддреБ рдЖрдпрдкреАрд╕реЗрдХ рдУрд╡реНрд╣рд░ рд╡рд╛рдкрд░реВрди рд╣реЗ рд╕рд╣рдЬрдкрдгреЗ рд╕реЛрдбрд╡рд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ. рд╣рд╛ рд▓реЗрдЦ, рдорд▓рд╛ рддреЗ рд╕реЛрдкреЗ рдЖрдгрд┐ рд╕рдордЬрдгреНрдпрд╛рд╕рд╛рд░рдЦреЗ рд╡рд╛рдЯрд▓реЗ.

рдореА рдЕрдиреЗрдХ рдЖрдард╡рдбреНрдпрд╛рдВрдкрд╛рд╕реВрди рдХрд╛рдорд╛рдЪреНрдпрд╛ рдкреАрд╕реАрд╢реА рдХрдиреЗрдХреНрдЯ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╣реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╡рд╛рдкрд░рдд рдЖрд╣реЗ рдЖрдгрд┐ рдорд▓рд╛ рдХреЛрдгрддреАрд╣реА рд╕рдорд╕реНрдпрд╛ рд▓рдХреНрд╖рд╛рдд рдЖрд▓реА рдирд╛рд╣реА. рддреЗ рд╕реЗрдЯ рдХрд░рдгреЗ рдЖрдгрд┐ рд╡рд┐рд╕рд░рдгреЗ рдпрд╛ рджреГрд╖реНрдЯреАрдиреЗ рд╕реЛрдпреАрд╕реНрдХрд░.

рдХрджрд╛рдЪрд┐рдд рддреБрдордЪреНрдпрд╛рдХрдбреЗ рдЯрд┐рдкреНрдкрдгреНрдпрд╛ рдЖрдгрд┐ рд╕реВрдЪрдирд╛ рдЕрд╕рддреАрд▓, рдорд▓рд╛ рдРрдХреВрди рдЖрдирдВрдж рд╣реЛрдИрд▓.

рдЖрдкрдг рд▓рдХреНрд╖ рджрд┐рд▓реНрдпрд╛рдмрджреНрджрд▓ рдзрдиреНрдпрд╡рд╛рдж!

рд╕реНрддреНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛