Eguneko une ona!
Artikulu honetan nola inplementatu nuen kontatu nahi dizut (
Konexio bat ezartzeak hainbat urrats ditu:
- Nodo bat abiarazi eta urruneko nodoa prest egon arte zain;
- Kanpoko IP helbidea eta UDP ataka zehaztea;
- Kanpoko IP helbidea eta UDP ataka urruneko ostalari batera transferitzea;
- Urrutiko ostalari batetik kanpoko IP helbidea eta UDP ataka lortzea;
- IPIP tunel baten antolaketa;
- Konexioaren jarraipena;
- Konexioa galtzen bada, ezabatu IPIP tunela.
Aspaldi pentsatu nuen eta oraindik pentsatzen dut zer erabil daitekeen nodoen artean datuak trukatzeko, momentu honetan niretzat errazena eta azkarrena Yandex.disk-en bidez lan egitea da.
- Lehenik eta behin, erabiltzeko erraza da - 3 ekintza behar dituzu: sortu, irakurri, ezabatu. Kizkurrekin hau da:
Sortu:curl -s -X MKCOL --user "$usename:$password" https://webdav.yandex.ru/$folder
Irakurri:
curl -s --user "$usename:$password" -X PROPFIND -H "Depth: 1" https://webdav.yandex.ru/$folder
Ezabatu:
curl -s -X DELETE --user "$usename:$password" https://webdav.yandex.ru/$folder
- Bigarrenik, erraza da instalatzea:
apt install curl
Kanpoko IP helbidea eta UDP ataka zehazteko, erabili stun-client komandoa:
stun stun.sipnet.ru -v -p $1 2>&1 | grep "MappedAddress"
Instalazioa komandoarekin:
apt install stun-client
Tunel bat antolatzeko, iproute2 paketeko OS tresna estandarrak erabiltzen dira. Existitzen da
β kargatu FOU modulua:
modprobe fou
β Entzun tokiko portua:
ip fou add port $localport ipproto 4
β sortu tunela:
ip link add name fou$name type ipip remote $remoteip local $localip encap fou encap-sport $localport encap-dport $remoteport
β igo tunelaren interfazea:
ip link set up dev fou$name
β esleitu tunelaren barneko tokiko eta barruko urruneko IP helbideak:
ip addr add $intIP peer $peerip dev fou$name
Ezabatu tunel bat:
ip link del dev fou$name
ip fou del port $localport
Tunelaren egoera kontrolatzen da aldiro urruneko nodoaren tunelaren barne IP helbidearen ping-a komandoarekin:
ping -c 1 $peerip -s 0
Aldizkako ping-a behar da batez ere kanala mantentzeko, bestela, tunela inaktibo dagoenean, bideratzaileetako NAT taulak garbitu daitezke eta orduan konexioa hautsi egingo da.
Ping-a desagertzen bada, IPIP tunela ezabatu egingo da eta urruneko ostalaritik prest egon arte itxarongo da.
Gidoia bera:
#!/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
aldagai erabiltzailea, pasahitza ΠΈ karpeta berdina izan beharko luke bi aldeetan, baina tip - desberdinak, adibidez: 10.0.0.1 eta 10.0.0.2. Nodoetako ordua sinkronizatu behar da. Scripta honela exekutatu dezakezu:
nohup script.sh &
Zure arreta erakarri nahi nuke IPIP tunela segurua ez dela trafikoa zifratuta ez dagoelako ikuspuntutik, baina hau erraz konpondu daiteke IPsec bidez.
Hainbat aste daramatzat laneko ordenagailu batera konektatzeko script hau erabiltzen eta ez dut arazorik sumatu. Erosoa ezarri eta ahazteari dagokionez.
Beharbada iruzkinak eta iradokizunak izango dituzu, gustura entzungo naiz.
Eskerrik asko zure arreta!
Iturria: www.habr.com