เจ‡เฉฑเจ• เจ‰เจฆเจพเจนเจฐเจจ เจตเจœเฉ‹เจ‚ เจ‡เฉฑเจ• IPIP เจธเฉเจฐเฉฐเจ— เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจธเจงเจพเจฐเจจ UDP เจฎเฉ‹เจฐเฉ€ เจชเฉฐเจšเจฟเฉฐเจ—

เจšเฉฐเจ—เจพ เจฆเจฟเจจ!

เจ‡เจธ เจฒเฉ‡เจ– เจตเจฟเฉฑเจš เจฎเฉˆเจ‚ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจฆเฉฑเจธเจฃเจพ เจšเจพเจนเฉเฉฐเจฆเจพ เจนเจพเจ‚ เจ•เจฟ เจฎเฉˆเจ‚ เจ•เจฟเจตเฉ‡เจ‚ เจฒเจพเจ—เฉ‚ เจ•เฉ€เจคเจพ (เจ‡เฉฑเจ• เจนเฉ‹เจฐ) เจ‰เจฆเจพเจนเจฐเจจ เจตเจœเฉ‹เจ‚ เจ‰เจฌเฉฐเจŸเฉ‚/เจกเฉ‡เจฌเฉ€เจ…เจจ 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 เจตเจพเจฐ เจ˜เจŸ เจ—เจˆ, เจชเจฐ เจ‡เจน เจชเฉเจฐเจฆเจพเจคเจพเจตเจพเจ‚ เจœเจพเจ‚ เจ•เจฟเจธเฉ‡ เจนเฉ‹เจฐ เจšเฉ€เจœเจผ เจจเจพเจฒ เจธเจฌเฉฐเจงเจค เจตเฉฑเจ–-เจตเฉฑเจ– เจชเจพเจฌเฉฐเจฆเฉ€เจ†เจ‚ เจนเฉ‹ เจธเจ•เจฆเฉ€เจ†เจ‚ เจนเจจเฅค เจ•เจฟเจ‰เจ‚เจ•เจฟ 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

เจตเฉ‡เจฐเฉ€เจเจฌเจฒ เจ‰เจชเจญเฉ‹เจ—เฉ€, เจชเจพเจธเจตเจฐเจก ะธ เจซเฉ‹เจฒเจกเจฐ เจจเฉ‚เฉฐ เจฆเฉ‹เจจเฉ‹ เจชเจพเจธเฉ‡ 'เจคเฉ‡ เจ‡เฉฑเจ•เฉ‹ เจนเฉ€ เจนเฉ‹เจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ, เจชเจฐ intip - เจตเฉฑเจ–เจฐเจพ, เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ: 10.0.0.1 เจ…เจคเฉ‡ 10.0.0.2เฅค เจจเฉ‹เจกเจพเจ‚ 'เจคเฉ‡ เจธเจฎเจพเจ‚ เจธเจฎเจ•เจพเจฒเฉ€ เจนเฉ‹เจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆเฅค เจคเฉเจธเฉ€เจ‚ เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจธเจ•เฉเจฐเจฟเจชเจŸ เจšเจฒเจพ เจธเจ•เจฆเฉ‡ เจนเฉ‹:

nohup script.sh &

เจฎเฉˆเจ‚ เจ‡เจธ เจคเฉฑเจฅ เจตเฉฑเจฒ เจคเฉเจนเจพเจกเจพ เจงเจฟเจ†เจจ เจ–เจฟเฉฑเจšเจฃเจพ เจšเจพเจนเจพเจ‚เจ—เจพ เจ•เจฟ IPIP เจธเฉเจฐเฉฐเจ— เจ‡เจธ เจคเฉฑเจฅ เจฆเฉ‡ เจฆเฉเจฐเจฟเจธเจผเจŸเฉ€เจ•เฉ‹เจฃ เจคเฉ‹เจ‚ เจ…เจธเฉเจฐเฉฑเจ–เจฟเจ…เจค เจนเฉˆ เจ•เจฟ เจŸเฉเจฐเฉˆเจซเจฟเจ• เจเจจเจ•เฉเจฐเจฟเจชเจŸเจก เจจเจนเฉ€เจ‚ เจนเฉˆ, เจชเจฐ เจ‡เจธ เจจเฉ‚เฉฐ IPsec เจ“เจตเจฐ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจ†เจธเจพเจจเฉ€ เจจเจพเจฒ เจนเฉฑเจฒ เจ•เฉ€เจคเจพ เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆ. เจ‡เจธ เจฒเฉ‡เจ–, เจ‡เจน เจฎเฉ‡เจฐเฉ‡ เจฒเจˆ เจธเจงเจพเจฐเจจ เจ…เจคเฉ‡ เจธเจฎเจเจฃ เจฏเฉ‹เจ— เจœเจพเจชเจฆเจพ เจธเฉ€เฅค

เจฎเฉˆเจ‚ เจ‡เจธ เจธเจ•เฉเจฐเจฟเจชเจŸ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจชเจฟเจ›เจฒเฉ‡ เจ•เจˆ เจนเจซเจผเจคเจฟเจ†เจ‚ เจคเฉ‹เจ‚ เจ‡เฉฑเจ• เจตเจฐเจ• เจชเฉ€เจธเฉ€ เจจเจพเจฒ เจœเฉเฉœเจจ เจฒเจˆ เจ•เจฐ เจฐเจฟเจนเจพ เจนเจพเจ‚ เจ…เจคเฉ‡ เจฎเฉˆเจจเฉ‚เฉฐ เจ•เฉ‹เจˆ เจธเจฎเฉฑเจธเจฟเจ† เจจเจนเฉ€เจ‚ เจ†เจˆ เจนเฉˆเฅค เจ‡เจธเจจเฉ‚เฉฐ เจธเฉˆเจŸ เจ•เจฐเจจ เจ…เจคเฉ‡ เจ‡เจธเจจเฉ‚เฉฐ เจญเฉเฉฑเจฒเจฃ เจฆเฉ‡ เจฎเจพเจฎเจฒเฉ‡ เจตเจฟเฉฑเจš เจธเฉเจตเจฟเจงเจพเจœเจจเจ•เฅค

เจธเจผเจพเจ‡เจฆ เจคเฉเจนเจพเจกเฉ‡ เจ•เฉ‹เจฒ เจŸเจฟเฉฑเจชเจฃเฉ€เจ†เจ‚ เจ…เจคเฉ‡ เจธเฉเจเจพเจ… เจนเฉ‹เจฃเจ—เฉ‡, เจฎเฉˆเจจเฉ‚เฉฐ เจธเฉเจฃ เจ•เฉ‡ เจ–เฉเจธเจผเฉ€ เจนเฉ‹เจตเฉ‡เจ—เฉ€.

เจคเฉเจนเจพเจกเฉ‡ เจงเจฟเจ†เจจ เจฒเจˆ เจงเฉฐเจจเจตเจพเจฆ!

เจธเจฐเฉ‹เจค: www.habr.com

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹