ื ื™ืงื•ื‘ ื—ื•ืจื™ื UDP ืคืฉื•ื˜ ื‘ืืžืฆืขื•ืช ืžื ื”ืจืช IPIP ื›ื“ื•ื’ืžื”

ื–ืžืŸ ื˜ื•ื‘ ืฉืœ ื™ื•ื!

ื‘ืžืืžืจ ื–ื” ืื ื™ ืจื•ืฆื” ืœืกืคืจ ืœื›ื ืื™ืš ื™ื™ืฉืžืชื™ (ืขื•ื“ ืื—ื“) ืกืงืจื™ืคื˜ Bash ืœื—ื™ื‘ื•ืจ ืฉื ื™ ืžื—ืฉื‘ื™ื ืžืื—ื•ืจื™ NAT โ€‹โ€‹ื‘ืืžืฆืขื•ืช ื˜ื›ื ื•ืœื•ื’ื™ื™ืช ื—ื•ืจื™ื ืฉืœ UDP ื‘ืืžืฆืขื•ืช ืžืขืจื›ืช ื”ื”ืคืขืœื” Ubuntu/Debian ื›ื“ื•ื’ืžื”.

ื™ืฆื™ืจืช ืงืฉืจ ืžื•ืจื›ื‘ืช ืžืžืกืคืจ ืฉืœื‘ื™ื:

  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. ืงื™ื™ื ืžื ื”ืจื•ืช ืจื‘ื•ืช ืฉื ื™ืชืŸ ืœื”ืขืœื•ืช ื‘ืืžืฆืขื™ื ืกื˜ื ื“ืจื˜ื™ื™ื (L2TPv3, GRE ื•ื›ื•'), ืื‘ืœ ื‘ื—ืจืชื™ ื‘-IPIP ื›ื™ ื–ื” ื™ื•ืฆืจ ืขื•ืžืก ื ื•ืกืฃ ืžื™ื ื™ืžืœื™ ืขืœ ื”ืžืขืจื›ืช. ื ื™ืกื™ืชื™ L2TPv3 ืขืœ UDP ื•ื”ืชืื›ื–ื‘ืชื™, ื”ืžื”ื™ืจื•ืช ื™ืจื“ื” ืคื™ 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 ืžืงื•ืžื™ื•ืช ื•ืคื ื™ืžื™ื•ืช ืžืจื•ื—ืงื•ืช ืคื ื™ืžื™ื•ืช ืฉืœ ื”ืžื ื”ืจื”:

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 ื‘ื ืชื‘ื™ื ืขืฉื•ื™ื•ืช ืœื”ืชื ืงื•ืช ื•ืื– ื”ื—ื™ื‘ื•ืจ ื™ื™ื ืชืง.

ืื ื”ืคื™ื ื’ ื ืขืœื, ืžื ื”ืจืช ื”-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 over ืžืืžืจ ื–ื”, ื–ื” ื ืจืื” ืœื™ ืคืฉื•ื˜ ื•ืžื•ื‘ืŸ.

ืื ื™ ืžืฉืชืžืฉ ื‘ืกืงืจื™ืคื˜ ื”ื–ื” ื›ื“ื™ ืœื”ืชื—ื‘ืจ ืœืžื—ืฉื‘ ืขื‘ื•ื“ื” ื›ื‘ืจ ื›ืžื” ืฉื‘ื•ืขื•ืช ื•ืœื ื”ื‘ื—ื ืชื™ ื‘ื‘ืขื™ื•ืช. ื ื•ื— ืžื‘ื—ื™ื ืช ืœื”ื’ื“ื™ืจ ืื•ืชื• ื•ืœืฉื›ื•ื— ืื•ืชื•.

ืื•ืœื™ ื™ื”ื™ื• ืœืš ื”ืขืจื•ืช ื•ื”ืฆืขื•ืช, ืื ื™ ืืฉืžื— ืœื”ืงืฉื™ื‘.

ืชื•ื“ื” ืœืš!

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”