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

рджрд┐рдирдХреЛ рд░рд╛рдореНрд░реЛ рд╕рдордп!

рдпрд╕ рд▓реЗрдЦрдорд╛ рдо рддрдкрд╛рдИрдВрд▓рд╛рдИ рдмрддрд╛рдЙрди рдЪрд╛рд╣рдиреНрдЫреБ рдХрд┐ рдореИрд▓реЗ рдХрд╕рд░реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░реЗрдВ (рдПрдХ рдЕрд░реНрдХреЛ) рдЙрджрд╛рд╣рд░рдгрдХреЛ рд░реВрдкрдорд╛ Ubuntu/Debian OS рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ UDP рд╣реЛрд▓ рдкрдВрдЪрд┐рдЩ рдкреНрд░рд╡рд┐рдзрд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ NAT рдкрдЫрд╛рдбрд┐ рдЕрд╡рд╕реНрдерд┐рдд рджреБрдИ рдХрдореНрдкреНрдпреБрдЯрд░рд╣рд░реВ рдЬрдбрд╛рди рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рдмреНрдпрд╛рд╕ рд╕реНрдХреНрд░рд┐рдкреНрдЯред

рдЬрдбрд╛рди рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрди рдзреЗрд░реИ рдЪрд░рдгрд╣рд░реВ рд╕рдорд╛рд╡реЗрд╢ рдЫрдиреН:

  1. рдиреЛрдб рд╕реБрд░реБ рдЧрд░реНрджреИ рд░ рд░рд┐рдореЛрдЯ рдиреЛрдб рддрдпрд╛рд░ рд╣реБрдирдХреЛ рд▓рд╛рдЧрд┐ рдкрд░реНрдЦрдБрджреИ;
  2. рдмрд╛рд╣реНрдп IP рдареЗрдЧрд╛рдирд╛ рд░ UDP рдкреЛрд░реНрдЯ рдирд┐рд░реНрдзрд╛рд░рдг рдЧрд░реНрджреИ;
  3. рдмрд╛рд╣рд┐рд░реА IP рдареЗрдЧрд╛рдирд╛ рд░ UDP рдкреЛрд░реНрдЯрд▓рд╛рдИ рдЯрд╛рдврд╛рдХреЛ рд╣реЛрд╕реНрдЯрдорд╛ рд╕реНрдерд╛рдирд╛рдиреНрддрд░рдг рдЧрд░реНрджреИ;
  4. рдЯрд╛рдврд╛рдХреЛ рд╣реЛрд╕реНрдЯрдмрд╛рдЯ рдмрд╛рд╣рд┐рд░реА IP рдареЗрдЧрд╛рдирд╛ рд░ UDP рдкреЛрд░реНрдЯ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрджреИ;
  5. рдПрдХ IPIP рд╕реБрд░реБрдЩ рдХреЛ рд╕рдВрдЧрдарди;
  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 рдкрдЯрдХ рдШрдЯреНрдпреЛ, рддрд░ рдпреА рдкреНрд░рджрд╛рдпрдХрд╣рд░реВ рд╡рд╛ рдЕрд░реВ рдХреЗрд╣рд┐рд╕рдБрдЧ рд╕рдореНрдмрдиреНрдзрд┐рдд рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рддрд┐рдмрдиреНрдзрд╣рд░реВ рд╣реБрди рд╕рдХреНрдЫрдиреНред рдЖрдИрдкреАрдЖрдИрдкреА рдЯрдиреЗрд▓ рдЖрдИрдкреА рд╕реНрддрд░рдорд╛ рд╕рдЮреНрдЪрд╛рд▓рди рд╣реБрдиреЗ рднрдПрдХреЛрд▓реЗ, 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

рдЯрдиреЗрд▓ рдЕрд╡рд╕реНрдерд╛рд▓рд╛рдИ рдЖрд╡рдзрд┐рдХ рд░реВрдкрдорд╛ рдЖрджреЗрд╢рдХреЛ рд╕рд╛рде рд░рд┐рдореЛрдЯ рдиреЛрдб рдЯрдиреЗрд▓рдХреЛ рдЖрдиреНрддрд░рд┐рдХ рдЖрдИрдкреА рдареЗрдЧрд╛рдирд╛ рдкрд┐рдВрдЧ рдЧрд░реЗрд░ рдирд┐рдЧрд░рд╛рдиреА рдЧрд░рд┐рдиреНрдЫ:

ping -c 1 $peerip -s 0

рдЖрд╡рдзрд┐рдХ рдкрд┐рдЩ рдореБрдЦреНрдп рд░реВрдкрдорд╛ рдЪреНрдпрд╛рдирд▓ рдХрд╛рдпрдо рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ, рдЕрдиреНрдпрдерд╛, рдЬрдм рд╕реБрд░реБрдЩ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдЫ, рд░рд╛рдЙрдЯрд░рд╣рд░реВрдорд╛ NAT рддрд╛рд▓рд┐рдХрд╛рд╣рд░реВ рдЦрд╛рд▓реА рд╣реБрди рд╕рдХреНрдЫ рд░ рддреНрдпрд╕рдкрдЫрд┐ рдЬрдбрд╛рди рдмрд┐рдЪреНрдЫреЗрдж рд╣реБрдиреЗрдЫред

рдпрджрд┐ рдкрд┐рдЩ рдЧрд╛рдпрдм рд╣реБрдиреНрдЫ рднрдиреЗ, рддреНрдпрд╕рдкрдЫрд┐ IPIP рд╕реБрд░реБрдЩ рдореЗрдЯрд╛рдЗрдиреНрдЫ рд░ рд░рд┐рдореЛрдЯ рд╣реЛрд╕реНрдЯрдмрд╛рдЯ рддрдпрд╛рд░реАрдХреЛ рд▓рд╛рдЧрд┐ рдкрд░реНрдЦрдиреНрдЫред

рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЖрдлреИрдВ:

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

рдо рддрдкрд╛рдИрдХреЛ рдзреНрдпрд╛рдирд╛рдХрд░реНрд╖рдг рдЧрд░рд╛рдЙрди рдЪрд╛рд╣рдиреНрдЫреБ рдХрд┐ IPIP рдЯрдиреЗрд▓ рдЯреНрд░рд╛рдлрд┐рдХ рдИрдиреНрдХреНрд░рд┐рдкреНрдЯ рдЧрд░рд┐рдПрдХреЛ рдЫреИрди рднрдиреНрдиреЗ рддрдереНрдпрдХреЛ рджреГрд╖реНрдЯрд┐рдХреЛрдгрдмрд╛рдЯ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдЫ, рддрд░ рдпрд╕рд▓рд╛рдИ IPsec рдУрднрд░ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рд╕рдЬрд┐рд▓реИ рд╕рдорд╛рдзрд╛рди рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫред рдпреЛ рд▓реЗрдЦ, рдпреЛ рдорд▓рд╛рдИ рд╕рд░рд▓ рд░ рдмреБрдЭреНрдиреЗ рд▓рд╛рдЧреНрдереНрдпреЛред

рдореИрд▓реЗ рдпреЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯрд▓рд╛рдИ рдХрд╛рдордХреЛ рдкреАрд╕реАрдорд╛ рдЬрдбрд╛рди рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рдзреЗрд░реИ рд╣рдкреНрддрд╛рджреЗрдЦрд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рд░рд╣реЗрдХреЛ рдЫреБ рд░ рдХреБрдиреИ рд╕рдорд╕реНрдпрд╛рд╣рд░реВ рджреЗрдЦреЗрдХреЛ рдЫреИрдиред рдпрд╕рд▓рд╛рдИ рд╕реЗрдЯрд┐рдЩ рд░ рдмрд┐рд░реНрд╕рдиреЗ рд╕рдиреНрджрд░реНрднрдорд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХред

рд╕рд╛рдпрдж рддрдкрд╛рдИрдХрд╛ рдЯрд┐рдкреНрдкрдгреА рд░ рд╕реБрдЭрд╛рд╡рд╣рд░реВ рдЫрдиреН, рдо рд╕реБрдиреНрди рдЦреБрд╕реА рд╣реБрдиреЗрдЫреБред

рддрдкрд╛рдИрдВрдХреЛ рдзреНрдпрд╛рдирдХреЛ рд▓рд╛рдЧрд┐ рдзрдиреНрдпрдмрд╛рдж!

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди