рд╢реБрдн рджрд┐рд╡рд╕!
рдпрд╛ рд▓реЗрдЦрд╛рдд рдореА рддреБрдореНрд╣рд╛рд▓рд╛ рд╕рд╛рдВрдЧреВ рдЗрдЪреНрдЫрд┐рддреЛ рдХреА рдореА рдХрд╕реЗ рдЕрдВрдорд▓рд╛рдд рдЖрдгрд▓реЗ (
рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЕрдиреЗрдХ рдЪрд░рдгреЗ рдЕрд╕рддрд╛рдд:
- рдиреЛрдб рд╕реБрд░реВ рдХрд░рдгреЗ рдЖрдгрд┐ рд░рд┐рдореЛрдЯ рдиреЛрдб рддрдпрд╛рд░ рд╣реЛрдгреНрдпрд╛рдЪреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдгреЗ;
- рдмрд╛рд╣реНрдп IP рдкрддреНрддрд╛ рдЖрдгрд┐ UDP рдкреЛрд░реНрдЯ рдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдгреЗ;
- рдмрд╛рд╣реНрдп IP рдкрддреНрддрд╛ рдЖрдгрд┐ UDP рдкреЛрд░реНрдЯ рд░рд┐рдореЛрдЯ рд╣реЛрд╕реНрдЯрд╡рд░ рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рдХрд░рдгреЗ;
- рд░рд┐рдореЛрдЯ рд╣реЛрд╕реНрдЯрдХрдбреВрди рдмрд╛рд╣реНрдп IP рдкрддреНрддрд╛ рдЖрдгрд┐ UDP рдкреЛрд░реНрдЯ рдорд┐рд│рд╡рдгреЗ;
- рдЖрдпрдкреАрдЖрдпрдкреА рдмреЛрдЧрджреНрдпрд╛рдЪреА рд╕рдВрд╕реНрдерд╛;
- рдХрдиреЗрдХреНрд╢рди рдирд┐рд░реАрдХреНрд╖рдг;
- рдХрдиреЗрдХреНрд╢рди рд╣рд░рд╡рд▓реНрдпрд╛рд╕, 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 рд╕рд╛рдзрдиреЗ рд╡рд╛рдкрд░рд▓реА рдЬрд╛рддрд╛рдд. рдЕрд╕реНрддрд┐рддреНрд╡рд╛рдд
- 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