Waktu yang baik hari ini!
Pada artikel ini saya ingin memberi tahu Anda bagaimana saya menerapkan (
Membangun koneksi terdiri dari beberapa langkah:
- Memulai sebuah node dan menunggu node jarak jauh siap;
- Menentukan alamat IP eksternal dan port UDP;
- Mentransfer alamat IP eksternal dan port UDP ke host jarak jauh;
- Memperoleh alamat IP eksternal dan port UDP dari host jarak jauh;
- Organisasi terowongan IPIP;
- Pemantauan koneksi;
- Jika koneksi terputus, hapus terowongan IPIP.
Saya sudah lama berpikir dan masih memikirkan apa yang bisa digunakan untuk bertukar data antar node, yang paling sederhana dan tercepat bagi saya saat ini adalah bekerja melalui Yandex.disk.
- Pertama, mudah digunakan - Anda memerlukan 3 tindakan: membuat, membaca, menghapus. Dengan curl ini adalah:
Membuat:curl -s -X MKCOL --user "$usename:$password" https://webdav.yandex.ru/$folder
Membaca:
curl -s --user "$usename:$password" -X PROPFIND -H "Depth: 1" https://webdav.yandex.ru/$folder
Menghapus:
curl -s -X DELETE --user "$usename:$password" https://webdav.yandex.ru/$folder
- Kedua, pemasangannya mudah:
apt install curl
Untuk menentukan alamat IP eksternal dan port UDP, gunakan perintah stun-client:
stun stun.sipnet.ru -v -p $1 2>&1 | grep "MappedAddress"
Instalasi dengan perintah:
apt install stun-client
Untuk mengatur terowongan, alat OS standar dari paket iproute2 digunakan. Ada
β memuat modul FOU:
modprobe fou
β dengarkan port lokal:
ip fou add port $localport ipproto 4
β membuat terowongan:
ip link add name fou$name type ipip remote $remoteip local $localip encap fou encap-sport $localport encap-dport $remoteport
β naikkan antarmuka terowongan:
ip link set up dev fou$name
β menetapkan alamat IP jarak jauh lokal dan internal terowongan:
ip addr add $intIP peer $peerip dev fou$name
Hapus terowongan:
ip link del dev fou$name
ip fou del port $localport
Status terowongan dipantau dengan melakukan ping secara berkala ke alamat IP internal terowongan node jarak jauh dengan perintah:
ping -c 1 $peerip -s 0
Ping berkala diperlukan terutama untuk memelihara saluran, jika tidak, ketika terowongan tidak aktif, tabel NAT pada router mungkin dihapus dan koneksi akan terputus.
Jika ping hilang, maka terowongan IPIP dihapus dan menunggu kesiapan dari host jarak jauh.
Skrip itu sendiri:
#!/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
Variabel nama pengguna, kata sandi ΠΈ map harus sama di kedua sisi, tapi tip - berbeda, misalnya: 10.0.0.1 dan 10.0.0.2. Waktu pada node harus disinkronkan. Anda dapat menjalankan skrip seperti ini:
nohup script.sh &
Saya ingin menarik perhatian Anda pada fakta bahwa terowongan IPIP tidak aman dalam hal lalu lintas tidak dienkripsi, tetapi ini dapat dengan mudah diselesaikan menggunakan IPsec over
Saya telah menggunakan skrip ini untuk terhubung ke PC kantor selama beberapa minggu sekarang dan tidak melihat adanya masalah. Nyaman dalam hal mengatur dan melupakannya.
Mungkin Anda mempunyai komentar dan saran, saya akan dengan senang hati mendengarkannya.
Terima kasih!
Sumber: www.habr.com