การเจาะรู UDP อย่างง่ายโดยใช้อุโมงค์ IPIP เป็นตัวอย่าง

ขอให้เป็นวันที่ดี!

ในบทความนี้ ฉันอยากจะบอกคุณว่าฉันนำไปใช้อย่างไร (อีกหนึ่ง) สคริปต์ Bash สำหรับเชื่อมต่อคอมพิวเตอร์สองเครื่องที่อยู่ด้านหลัง NAT โดยใช้เทคโนโลยีการเจาะรู UDP โดยใช้ระบบปฏิบัติการ Ubuntu/Debian เป็นตัวอย่าง

การสร้างการเชื่อมต่อประกอบด้วยหลายขั้นตอน:

  1. การเริ่มต้นโหนดและรอให้โหนดระยะไกลพร้อม
  2. การกำหนดที่อยู่ IP ภายนอกและพอร์ต UDP
  3. การถ่ายโอนที่อยู่ IP ภายนอกและพอร์ต UDP ไปยังโฮสต์ระยะไกล
  4. การรับที่อยู่ IP ภายนอกและพอร์ต UDP จากโฮสต์ระยะไกล
  5. องค์กรของอุโมงค์ IPIP
  6. การตรวจสอบการเชื่อมต่อ
  7. หากการเชื่อมต่อขาดหาย ให้ลบอุโมงค์ IPIP

ฉันคิดมานานแล้วและยังคงคิดว่าสิ่งที่สามารถใช้เพื่อแลกเปลี่ยนข้อมูลระหว่างโหนดได้ สิ่งที่ง่ายที่สุดและเร็วที่สุดสำหรับฉันในขณะนี้คือการทำงานผ่าน Yandex.disk

  • ประการแรก มันใช้งานง่าย - คุณต้องมี 3 การกระทำ: สร้าง อ่าน และลบ ด้วยการขดนี่คือ:
    สร้าง:

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

    อ่าน:

    curl -s --user "$usename:$password" -X PROPFIND -H "Depth: 1" https://webdav.yandex.ru/$folder

    ลบ:

    curl -s -X DELETE --user "$usename:$password" https://webdav.yandex.ru/$folder
  • ประการที่สอง ติดตั้งง่าย:
    apt install curl

หากต้องการระบุที่อยู่ IP ภายนอกและพอร์ต UDP ให้ใช้คำสั่ง stun-client:

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

การติดตั้งด้วยคำสั่ง:

apt install stun-client

ในการจัดระเบียบทันเนล จะใช้เครื่องมือระบบปฏิบัติการมาตรฐานจากแพ็คเกจ iproute2 มีอยู่ อุโมงค์หลายแห่ง ซึ่งสามารถเลี้ยงได้โดยใช้วิธีมาตรฐาน (L2TPv3, GRE ฯลฯ) แต่ฉันเลือก IPIP เพราะมันสร้างภาระเพิ่มเติมขั้นต่ำในระบบ ฉันลองใช้ L2TPv3 บน UDP และรู้สึกผิดหวัง ความเร็วลดลง 10 เท่า แต่สิ่งเหล่านี้อาจเป็นข้อจำกัดต่างๆ ที่เกี่ยวข้องกับผู้ให้บริการหรืออย่างอื่น เนื่องจากอุโมงค์ IPIP ทำงานที่ระดับ IP อุโมงค์ FOU จึงถูกใช้เพื่อทำงานที่ระดับพอร์ต UDP ในการจัดระเบียบอุโมงค์ IPIP คุณต้องมี:

— โหลดโมดูล FOU:

modprobe fou

— ฟังพอร์ตท้องถิ่น:

ip fou add port $localport ipproto 4

— สร้างอุโมงค์:

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

— ยกส่วนต่อประสานทันเนล:

ip link set up dev fou$name

— กำหนดที่อยู่ IP ภายในและระยะไกลภายในของอุโมงค์:

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

ลบอุโมงค์:

ip link del dev fou$name

ip fou del port $localport

สถานะช่องสัญญาณได้รับการตรวจสอบโดยการส่ง Ping ที่อยู่ IP ภายในของช่องสัญญาณโหนดระยะไกลเป็นระยะด้วยคำสั่ง:

ping -c 1 $peerip -s 0

จำเป็นต้องใช้การ Ping เป็นระยะเพื่อรักษาช่องสัญญาณเป็นหลัก มิฉะนั้น เมื่ออุโมงค์ไม่ได้ใช้งาน ตาราง NAT บนเราเตอร์อาจถูกล้าง จากนั้นการเชื่อมต่อจะขาด

หาก Ping หายไป อุโมงค์ IPIP จะถูกลบและรอความพร้อมจากโฮสต์ระยะไกล

สคริปต์นั้นเอง:

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

ตัวแปร ชื่อผู้ใช้, รหัสผ่าน и โฟลเดอร์ ควรจะเหมือนกันทั้งสองด้านแต่ ทิป - แตกต่าง เช่น 10.0.0.1 และ 10.0.0.2 เวลาบนโหนดจะต้องซิงโครไนซ์ คุณสามารถรันสคริปต์ดังนี้:

nohup script.sh &

ฉันอยากจะดึงความสนใจของคุณไปที่ความจริงที่ว่าอุโมงค์ IPIP นั้นไม่ปลอดภัยจากมุมมองของความจริงที่ว่าการรับส่งข้อมูลนั้นไม่ได้เข้ารหัส แต่สามารถแก้ไขได้ง่ายโดยใช้ IPsec บทความนี้ดูเหมือนง่ายและเข้าใจได้สำหรับฉัน

ฉันใช้สคริปต์นี้เพื่อเชื่อมต่อกับพีซีที่ทำงานมาหลายสัปดาห์แล้วและยังไม่สังเกตเห็นปัญหาใดๆ สะดวกทั้งเรื่องการตั้งค่าแล้วลืมได้เลย

บางทีคุณอาจมีความคิดเห็นและข้อเสนอแนะฉันก็ยินดีที่จะรับฟัง

ขอบคุณ!

ที่มา: will.com

เพิ่มความคิดเห็น