Pembuatan lubang UDP sederhana menggunakan terowongan IPIP sebagai contoh

Waktu yang baik hari ini!

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

Membangun koneksi terdiri dari beberapa langkah:

  1. Memulai sebuah node dan menunggu node jarak jauh siap;
  2. Menentukan alamat IP eksternal dan port UDP;
  3. Mentransfer 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 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 banyak terowongan yang dapat dimunculkan menggunakan cara standar (L2TPv3, GRE, dll.), tetapi saya memilih IPIP karena hanya menimbulkan beban tambahan minimal pada sistem. Saya mencoba L2TPv3 melalui UDP dan kecewa, kecepatannya turun 10 kali lipat, tetapi ini bisa jadi karena berbagai batasan terkait penyedia atau yang lainnya. Karena terowongan IPIP beroperasi pada tingkat IP, terowongan FOU digunakan untuk beroperasi pada tingkat port UDP. Untuk mengatur terowongan IPIP, Anda memerlukan:

β€” 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 Artikel ini, ini tampak sederhana dan dapat dimengerti oleh saya.

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

Tambah komentar