Contoh lubang UDP sederhana menggunakan terowongan IPIP

Waktu yang baik hari ini!



Pada artikel ini saya ingin memberi tahu Anda bagaimana saya menerapkan skrip Bash ( satu lagi ) untuk menghubungkan dua komputer di belakang NAT menggunakan teknologi lubang meninju UDP menggunakan contoh Ubuntu / OS Debian.



Organisasi koneksi terdiri dari beberapa langkah:



  1. Memulai simpul dan menunggu simpul jarak jauh siap;
  2. Menentukan alamat IP eksternal dan port UDP;
  3. Transfer alamat IP eksternal dan port UDP ke host jarak jauh;
  4. Memperoleh alamat IP eksternal dan port UDP dari host jarak jauh;
  5. Organisasi terowongan IPIP;
  6. Pemantauan koneksi;
  7. Jika koneksi terputus, hapus terowongan IPIP.


Saya berpikir untuk waktu yang lama dan masih berpikir bahwa itu dapat digunakan untuk bertukar data antar node, yang paling sederhana dan tercepat bagi saya saat ini adalah untuk bekerja melalui Yandex.Disk.



  • Pertama, mudah digunakan - Anda perlu 3 langkah: membuat, membaca, menghapus. Dengan ikal ini adalah:

    Buat:



    curl -s -X MKCOL --user "$usename:$password" https://webdav.yandex.ru/$folder


    Baca:

    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, mudah untuk menginstal:



    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 banyak terowongan yang dapat diatur dengan cara standar (L2TPv3, GRE, dll.), Tetapi saya memilih IPIP karena ini menciptakan beban tambahan minimal pada sistem. Saya mencoba L2TPv3 lebih dari UDP dan kecewa, kecepatan turun dengan faktor 10, tetapi mungkin berbagai pembatasan terkait dengan penyedia atau sesuatu yang lain. Karena terowongan IPIP beroperasi pada level IP, terowongan FOU digunakan untuk beroperasi pada level port UDP. Untuk mengatur terowongan IPIP Anda perlu:



- memuat modul FOU:



modprobe fou


- dengarkan port lokal:



ip fou add port $localport ipproto 4


- buat terowongan:



ip link add name fou$name type ipip remote $remoteip local $localip encap fou  encap-sport $localport encap-dport $remoteport


- memunculkan antarmuka terowongan:



ip link set up dev fou$name


- Menetapkan alamat IP terowongan lokal dan internal jauh internal:



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 secara berkala melakukan ping alamat IP internal dari terowongan host jarak jauh menggunakan perintah:



ping -c 1 $peerip -s 0


Ping berkala diperlukan terutama untuk mempertahankan saluran, jika tidak, jika terowongan menganggur pada router, tabel NAT dapat dihapus dan kemudian koneksi akan terputus.



Jika ping hilang, terowongan IPIP dijatuhkan dan menunggu host jarak jauh siap.



Script itu sendiri:



#!/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 0


Variabel nama pengguna , kata sandi dan folder harus sama di kedua sisi, tetapi intipnya harus berbeda, misalnya: 10.0.0.1 dan 10.0.0.2. Waktu di node harus disinkronkan. Anda dapat menjalankan skrip seperti ini:



nohup script.sh &


Saya menarik perhatian Anda pada fakta bahwa terowongan IPIP tidak aman dari sudut pandang fakta bahwa lalu lintas tidak dienkripsi, tetapi ini mudah dipecahkan dengan menggunakan IPsec dalam artikel ini , bagi saya itu tampak sederhana dan mudah.



Saya telah menggunakan skrip ini untuk terhubung ke PC yang berfungsi selama beberapa minggu dan belum menemukan masalah. Nyaman dalam hal pengaturan dan lupa.



Mungkin Anda akan memiliki komentar dan saran, saya akan senang mendengarnya.



Terima kasih atas perhatian anda!



All Articles