Рӯзи нағз!
Дар ин мақола ман мехоҳам ба шумо бигӯям, ки ман чӣ гуна амалӣ кардам (
Таъсиси пайвастшавӣ аз якчанд марҳила иборат аст:
- Оғози гиреҳ ва интизори омода шудани гиреҳи дурдаст;
- Муайян кардани суроғаи IP берунӣ ва порти UDP;
- Интиқоли суроғаи IP берунӣ ва порти UDP ба ҳости дурдаст;
- Гирифтани суроғаи IP-и беруна ва порти UDP аз ҳости дурдаст;
- Ташкили нақби IPIP;
- Мониторинги пайвастшавӣ;
- Агар пайвастшавӣ гум шавад, нақби IPIP-ро нест кунед.
Ман муддати тӯлонӣ фикр мекардам ва ҳоло ҳам фикр мекунам, ки чӣ метавонад барои табодули маълумот байни гиреҳҳо истифода шавад, дар айни замон барои ман соддатарин ва зудтарин кор тавассути Yandex.disk аст.
- Аввалан, истифодаи он осон аст - ба шумо 3 амал лозим аст: эҷод кардан, хондан, нест кардан. Бо curl ин аст:
Эҷод кунед: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
Барои ташкили нақб, асбобҳои стандартии OS аз бастаи iproute2 истифода мешаванд. вуҷуд дорад
— модули 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 ба осонӣ ҳал карда шавад.
Ман ин скриптро барои пайваст шудан ба компютери корӣ дар тӯли чанд ҳафта истифода мебарам ва ягон мушкилотро мушоҳида накардаам. Аз ҷиҳати танзим ва фаромӯш кардани он қулай аст.
Шояд шумо фикру мулоҳизаҳо ва пешниҳодҳо дошта бошед, ман аз шунидани он шод хоҳам шуд.
Ташаккур барои таваҷҷӯҳатон!
Манбаъ: will.com