Günün Yaxşı vaxt!
Bu yazıda sizə necə həyata keçirdiyimi söyləmək istəyirəm (
Bağlantının qurulması bir neçə mərhələdən ibarətdir:
- Bir qovşağı işə salmaq və uzaq qovşağın hazır olmasını gözləmək;
- Xarici IP ünvanının və UDP portunun müəyyən edilməsi;
- Xarici IP ünvanını və UDP portunu uzaq hosta köçürmək;
- Uzaq hostdan xarici IP ünvanı və UDP portunun alınması;
- IPIP tunelinin təşkili;
- Bağlantı monitorinqi;
- Bağlantı itərsə, IPIP tunelini silin.
Uzun müddət düşündüm və hələ də qovşaqlar arasında məlumat mübadiləsi üçün nəyin istifadə oluna biləcəyini düşünürəm, bu anda mənim üçün ən sadə və sürətli Yandex.disk vasitəsilə işləyir.
- Birincisi, istifadəsi asandır - sizə 3 hərəkət lazımdır: yaratmaq, oxumaq, silmək. Curl ilə bu:
Yaradın:curl -s -X MKCOL --user "$usename:$password" https://webdav.yandex.ru/$folder
Oxuyun:
curl -s --user "$usename:$password" -X PROPFIND -H "Depth: 1" https://webdav.yandex.ru/$folder
Sil:
curl -s -X DELETE --user "$usename:$password" https://webdav.yandex.ru/$folder
- İkincisi, quraşdırmaq asandır:
apt install curl
Xarici IP ünvanını və UDP portunu müəyyən etmək üçün stun-client əmrindən istifadə edin:
stun stun.sipnet.ru -v -p $1 2>&1 | grep "MappedAddress"
Komanda ilə quraşdırma:
apt install stun-client
Tuneli təşkil etmək üçün iproute2 paketindən standart OS alətləri istifadə olunur. Mövcuddur
— FOU modulunu yükləyin:
modprobe fou
— yerli limana qulaq asın:
ip fou add port $localport ipproto 4
- tunel yaratmaq:
ip link add name fou$name type ipip remote $remoteip local $localip encap fou encap-sport $localport encap-dport $remoteport
— tunel interfeysini qaldırın:
ip link set up dev fou$name
— tunelin daxili yerli və daxili uzaq IP ünvanlarını təyin edin:
ip addr add $intIP peer $peerip dev fou$name
Tuneli silin:
ip link del dev fou$name
ip fou del port $localport
Tunelin vəziyyəti vaxtaşırı olaraq uzaq qovşaq tunelinin daxili IP ünvanını əmrlə pingləməklə izlənilir:
ping -c 1 $peerip -s 0
Dövri ping ilk növbədə kanalı saxlamaq üçün lazımdır, əks halda, tunel boş olduqda, marşrutlaşdırıcılardakı NAT cədvəlləri təmizlənə bilər və sonra əlaqə pozulacaq.
Pinq yox olarsa, IPIP tuneli silinir və uzaq hostdan hazırlığı gözləyir.
Əslində skriptin özü:
#!/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
Dəyişənlər istifadəçi adı, parol и qovluq hər iki tərəfdə eyni olmalıdır, lakin baxmaq - fərqli, məsələn: 10.0.0.1 və 10.0.0.2. Düyünlərdəki vaxt sinxronlaşdırılmalıdır. Skripti belə işlədə bilərsiniz:
nohup script.sh &
Diqqətinizi çəkmək istərdim ki, IPIP tunel trafikin şifrələnməməsi baxımından təhlükəlidir, lakin bu, IPsec üzərindən istifadə etməklə asanlıqla həll edilə bilər.
Artıq bir neçə həftədir ki, iş kompüterinə qoşulmaq üçün bu skriptdən istifadə edirəm və heç bir problem görməmişəm. Onu qurmaq və unutmaq baxımından əlverişlidir.
Bəlkə şərh və təklifləriniz olacaq, məmnuniyyətlə dinləyəcəm.
Diqqətiniz üçün təşəkkür edirik!
Mənbə: www.habr.com