เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡ IPIP เชŸเชจเชฒเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชธเชฐเชณ UDP เชนเซ‹เชฒ เชชเช‚เชšเชฟเช‚เช—

เชถเซเชญ เชฆเชฟเชตเชธ!

เช† เชฒเซ‡เช–เชฎเชพเช‚ เชนเซเช‚ เชคเชฎเชจเซ‡ เชœเชฃเชพเชตเชตเชพ เชฎเชพเช‚เช—เซ เช›เซเช‚ เช•เซ‡ เชฎเซ‡เช‚ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช…เชฎเชฒ เช•เชฐเซเชฏเซ‹ (เชเช• เชตเชงเซ) เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡ เช‰เชฌเซเชจเซเชŸเซ/เชกเซ‡เชฌเชฟเชฏเชจ เช“เชเชธเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ 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 เช—เชฃเซ€ เช˜เชŸเซ€, เชชเชฐเช‚เชคเซ เช† เชชเซเชฐเชฆเชพเชคเชพเช“ เช…เชฅเชตเชพ เช…เชจเซเชฏ เช•เช‚เชˆเช• เชธเช‚เชฌเช‚เชงเชฟเชค เชตเชฟเชตเชฟเชง เชชเซเชฐเชคเชฟเชฌเช‚เชงเซ‹ เชนเซ‹เชˆ เชถเช•เซ‡ เช›เซ‡. 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 เช“เชตเชฐเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช† เชธเชฐเชณเชคเชพเชฅเซ€ เช‰เช•เซ‡เชฒเซ€ เชถเช•เชพเชฏ เช›เซ‡. เช† เชฒเซ‡เช–, เชคเซ‡ เชฎเชจเซ‡ เชธเชฐเชณ เช…เชจเซ‡ เชธเชฎเชœเซ€ เชถเช•เชพเชฏ เชคเซ‡เชตเซเช‚ เชฒเชพเช—เชคเซเช‚ เชนเชคเซเช‚.

เชนเซเช‚ เช† เชธเซเช•เซเชฐเชฟเชชเซเชŸเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช˜เชฃเชพ เช…เช เชตเชพเชกเชฟเชฏเชพเชฅเซ€ เชตเชฐเซเช• เชชเซ€เชธเซ€ เชธเชพเชฅเซ‡ เช•เชจเซ‡เช•เซเชŸ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช•เชฐเซ€ เชฐเชนเซเชฏเซ‹ เช›เซเช‚ เช…เชจเซ‡ เชฎเชจเซ‡ เช•เซ‹เชˆ เชธเชฎเชธเซเชฏเชพ เชœเซ‹เชตเชพ เชฎเชณเซ€ เชจเชฅเซ€. เชคเซ‡เชจเซ‡ เชธเซ‡เชŸ เช•เชฐเชตเชพ เช…เชจเซ‡ เชญเซ‚เชฒเซ€ เชœเชตเชพเชจเซ€ เชฆเซเชฐเชทเซเชŸเชฟเช เช…เชจเซเช•เซ‚เชณ.

เช•เชฆเชพเชš เชคเชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ เชŸเชฟเชชเซเชชเชฃเซ€เช“ เช…เชจเซ‡ เชธเซ‚เชšเชจเซ‹ เชนเชถเซ‡, เชฎเชจเซ‡ เชธเชพเช‚เชญเชณเชตเชพเชฎเชพเช‚ เช†เชจเช‚เชฆ เชฅเชถเซ‡.

เชคเชฎเชพเชฐเซเช‚ เชงเซเชฏเชพเชจ เชฌเชฆเชฒ เช†เชญเชพเชฐ!

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹