Penebuk lubang UDP mudah menggunakan terowong IPIP sebagai contoh

Masa yang baik hari ini!

Dalam artikel ini saya ingin memberitahu anda bagaimana saya melaksanakan (satu lagi) skrip Bash untuk menyambungkan dua komputer yang terletak di belakang NAT menggunakan teknologi penebuk lubang UDP menggunakan OS Ubuntu/Debian sebagai contoh.

Mewujudkan sambungan terdiri daripada beberapa langkah:

  1. Memulakan nod dan menunggu nod jauh siap;
  2. Menentukan alamat IP luaran dan port UDP;
  3. Memindahkan alamat IP luaran dan port UDP ke hos jauh;
  4. Mendapatkan alamat IP luaran dan port UDP daripada hos jauh;
  5. Organisasi terowong IPIP;
  6. Pemantauan sambungan;
  7. Jika sambungan terputus, padamkan terowong IPIP.

Saya berfikir untuk masa yang lama dan masih berfikir apa yang boleh digunakan untuk menukar data antara nod, yang paling mudah dan terpantas bagi saya pada masa ini adalah bekerja melalui Yandex.disk.

  • Pertama, ia mudah digunakan - anda memerlukan 3 tindakan: buat, baca, padam. Dengan curl ini adalah:
    Cipta:

    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

    Padam:

    curl -s -X DELETE --user "$usename:$password" https://webdav.yandex.ru/$folder
  • Kedua, ia mudah dipasang:
    apt install curl

Untuk menentukan alamat IP luaran dan port UDP, gunakan perintah stun-client:

stun stun.sipnet.ru -v -p $1 2>&1 | grep "MappedAddress"

Pemasangan dengan arahan:

apt install stun-client

Untuk mengatur terowong, alat OS standard dari pakej iproute2 digunakan. wujud banyak terowong yang boleh dinaikkan menggunakan cara standard (L2TPv3, GRE, dll.), tetapi saya memilih IPIP kerana ia menghasilkan beban tambahan yang minimum pada sistem. Saya mencuba L2TPv3 melalui UDP dan kecewa, kelajuannya menurun 10 kali ganda, tetapi ini boleh menjadi pelbagai sekatan yang berkaitan dengan pembekal atau sesuatu yang lain. Memandangkan terowong IPIP beroperasi pada tahap IP, terowong FOU digunakan untuk beroperasi pada tahap port UDP. Untuk mengatur terowong IPIP anda perlukan:

β€” muatkan modul FOU:

modprobe fou

β€” mendengar pelabuhan tempatan:

ip fou add port $localport ipproto 4

- buat terowong:

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

β€” menaikkan antara muka terowong:

ip link set up dev fou$name

β€” tetapkan alamat IP jauh tempatan dan dalaman dalaman terowong:

ip addr add $intIP peer $peerip dev fou$name

Padamkan terowong:

ip link del dev fou$name

ip fou del port $localport

Keadaan terowong dipantau dengan ping secara berkala alamat IP dalaman terowong nod jauh dengan arahan:

ping -c 1 $peerip -s 0

Ping berkala diperlukan terutamanya untuk mengekalkan saluran, jika tidak, apabila terowong melahu, jadual NAT pada penghala mungkin dikosongkan dan kemudian sambungan akan terputus.

Jika ping hilang, maka terowong IPIP dipadamkan dan menunggu kesediaan daripada hos 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

Pembolehubah nama pengguna, kata laluan ΠΈ folder sepatutnya sama di kedua-dua belah pihak, tetapi intip - berbeza, contohnya: 10.0.0.1 dan 10.0.0.2. Masa pada nod mesti disegerakkan. Anda boleh menjalankan skrip seperti ini:

nohup script.sh &

Saya ingin menarik perhatian anda kepada fakta bahawa terowong IPIP tidak selamat dari sudut pandangan fakta bahawa trafik tidak disulitkan, tetapi ini boleh diselesaikan dengan mudah menggunakan IPsec over artikel ini, ia kelihatan mudah dan mudah difahami oleh saya.

Saya telah menggunakan skrip ini untuk menyambung ke PC kerja selama beberapa minggu sekarang dan tidak menyedari sebarang masalah. Mudah dari segi menetapkannya dan melupakannya.

Mungkin anda akan mempunyai komen dan cadangan, saya akan senang mendengarnya.

Thank you!

Sumber: www.habr.com

Tambah komen