Hea kellaaeg!
Selles artiklis tahan teile rÀÀkida, kuidas ma rakendasin () Bash-skript kahe arvuti ĂŒhendamiseks NAT-i taga UDP augustamistehnoloogia abil, kasutades operatsioonisĂŒsteemi nĂ€itena Ubuntu/Debian.
Ăhenduse loomine koosneb mitmest etapist:
- SÔlme kÀivitamine ja kaugsÔlme valmisoleku ootamine;
- VÀlise IP-aadressi ja UDP-pordi mÀÀramine;
- VĂ€lise IP-aadressi ja UDP-pordi edastamine kaughostile;
- VĂ€lise IP-aadressi ja UDP-pordi hankimine kaughostilt;
- IPIP tunneli organiseerimine;
- Ăhenduse jĂ€lgimine;
- Kui ĂŒhendus katkeb, kustutage IPIP-tunnel.
MÔtlesin kaua ja mÔtlen siiani, millega saab sÔlmede vahel andmeid vahetada, minu jaoks on hetkel kÔige lihtsam ja kiirem töö Yandex.diski kaudu.
- Esiteks on seda lihtne kasutada - vajate 3 toimingut: looge, lugege, kustutage. Curl puhul on see:
Loo:curl -s -X MKCOL --user "$usename:$password" https://webdav.yandex.ru/$folderLoe:
curl -s --user "$usename:$password" -X PROPFIND -H "Depth: 1" https://webdav.yandex.ru/$folderKustuta:
curl -s -X DELETE --user "$usename:$password" https://webdav.yandex.ru/$folder - Teiseks on seda lihtne paigaldada:
apt install curl
VÀlise IP-aadressi ja UDP-pordi mÀÀramiseks kasutage kÀsku stun-client:
stun stun.sipnet.ru -v -p $1 2>&1 | grep "MappedAddress"Paigaldamine kÀsuga:
apt install stun-clientTunneli korraldamiseks kasutatakse standardseid OS-i tööriistu paketist iproute2. Olemas mida saab tĂ”sta standardsete vahenditega (L2TPv3, GRE jne), kuid valisin IPIP, kuna see tekitab sĂŒsteemile minimaalse lisakoormuse. Proovisin L2TPv3 ĂŒle UDP ja olin pettunud, kiirus langes 10 korda, kuid need vĂ”ivad olla erinevad pakkujatega seotud piirangud vĂ”i midagi muud. Kuna IPIP-tunnel töötab IP-tasemel, kasutatakse FOU-tunnelit töötamiseks UDP-pordi tasemel. IPIP-tunneli korraldamiseks vajate:
â laadige FOU moodul:
modprobe fouâ kuulake kohalikku porti:
ip fou add port $localport ipproto 4â tunneli loomine:
ip link add name fou$name type ipip remote $remoteip local $localip encap fou encap-sport $localport encap-dport $remoteportâ tĂ”sta tunneli liidest:
ip link set up dev fou$nameâ mÀÀrata tunneli sisemised kohalikud ja sisemised kaug-IP-aadressid:
ip addr add $intIP peer $peerip dev fou$nameTunneli kustutamine:
ip link del dev fou$nameip fou del port $localportTunneli olekut jÀlgitakse, pingides perioodiliselt kaugsÔlme tunneli sisemist IP-aadressi kÀsuga:
ping -c 1 $peerip -s 0Perioodilist pingi on vaja eelkĂ”ige kanali hooldamiseks, vastasel juhul vĂ”idakse tunneli jĂ”udeolekul ruuterite NAT-tabelid tĂŒhjendada ja siis ĂŒhendus katkeda.
Kui ping kaob, siis IPIP-tunnel kustutatakse ja ootab kaughosti valmisolekut.
Skript ise:
#!/bin/bash
username="username@yandex.ru"
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 0Muutujad kasutajanimi, parool Đž kausta peaks olema mĂ”lemal kĂŒljel sama, kuid piiluma - erinevad, nĂ€iteks: 10.0.0.1 ja 10.0.0.2. SĂ”lmede aeg peab olema sĂŒnkroonitud. Saate skripti kĂ€ivitada jĂ€rgmiselt:
nohup script.sh &Juhin teie tĂ€helepanu asjaolule, et IPIP tunnel on ebaturvaline, kuna liiklus ei ole krĂŒptitud, kuid seda saab hĂ”lpsasti lahendada IPsec ĂŒle , tundus see mulle lihtne ja arusaadav.
Olen seda skripti kasutanud tööarvutiga ĂŒhenduse loomiseks juba mitu nĂ€dalat ja pole probleeme mĂ€rganud. Mugav selle seadistamise ja unustamise poolest.
VÔib-olla on teil kommentaare ja ettepanekuid, kuulan hea meelega.
TÀnan teid tÀhelepanu eest!
Allikas: www.habr.com
