Қайырлы күн!
Бұл мақалада мен қалай жүзеге асырғанымды айтқым келеді (
Байланысты орнату бірнеше кезеңнен тұрады:
- Түйінді іске қосу және қашықтағы түйіннің дайын болуын күту;
- Сыртқы 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
Туннельді ұйымдастыру үшін 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
Айнымалылар пайдаланушы аты, пароль и папка екі жақта бірдей болуы керек, бірақ кіріс - әртүрлі, мысалы: 10.0.0.1 және 10.0.0.2. Түйіндердегі уақыт синхрондалу керек. Сценарийді келесідей іске қосуға болады:
nohup script.sh &
Мен сіздің назарыңызды IPIP туннелі трафик шифрланбағандықтан қауіпті екеніне аударғым келеді, бірақ оны IPsec арқылы оңай шешуге болады.
Мен бірнеше апта бойы жұмыс компьютеріне қосылу үшін осы сценарийді пайдаланып жүрмін және ешқандай проблемаларды байқамадым. Оны орнату және оны ұмыту тұрғысынан ыңғайлы.
Мүмкін сізде ескертулер мен ұсыныстар болады, мен қуана тыңдаймын.
Назарларыңызға рахмет!
Ақпарат көзі: www.habr.com