IPIP ํ„ฐ๋„์„ ์˜ˆ๋กœ ์‚ฌ์šฉํ•œ ๊ฐ„๋‹จํ•œ UDP ํ™€ ํŽ€์นญ

์ข‹์€ ์‹œ๊ฐ„!

์ด ๊ธ€์—์„œ๋Š” ์ œ๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ–ˆ๋Š”์ง€ ์•Œ๋ ค๋“œ๋ฆฌ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.ํ•˜๋‚˜ ๋”) Ubuntu/Debian OS๋ฅผ ์˜ˆ๋กœ ๋“ค์–ด UDP ํ™€ ํŽ€์นญ ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜์—ฌ NAT ๋’ค์— ๋‘ ๋Œ€์˜ ์ปดํ“จํ„ฐ๋ฅผ ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ Bash ์Šคํฌ๋ฆฝํŠธ์ž…๋‹ˆ๋‹ค.

์—ฐ๊ฒฐ ์„ค์ •์€ ์—ฌ๋Ÿฌ ๋‹จ๊ณ„๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

  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 ํŒจํ‚ค์ง€์˜ ํ‘œ์ค€ OS ๋„๊ตฌ๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์กด์žฌํ•œ๋‹ค ๋งŽ์€ ํ„ฐ๋„ ์ด๋Š” ํ‘œ์ค€ ์ˆ˜๋‹จ(L2TPv3, GRE ๋“ฑ)์„ ์‚ฌ์šฉํ•˜์—ฌ ๋†’์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ์‹œ์Šคํ…œ์— ์ตœ์†Œํ•œ์˜ ์ถ”๊ฐ€ ๋ถ€ํ•˜๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— IPIP๋ฅผ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค. UDP๋ฅผ ํ†ตํ•ด L2TPv3๋ฅผ ์‹œ๋„ํ–ˆ๋Š”๋ฐ ์†๋„๊ฐ€ 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

๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ์›๊ฒฉ ๋…ธ๋“œ ํ„ฐ๋„์˜ ๋‚ด๋ถ€ IP ์ฃผ์†Œ๋ฅผ ์ฃผ๊ธฐ์ ์œผ๋กœ pingํ•˜์—ฌ ํ„ฐ๋„ ์ƒํƒœ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค.

ping -c 1 $peerip -s 0

์ฃผ๋กœ ์ฑ„๋„์„ ์œ ์ง€ํ•˜๋ ค๋ฉด ์ •๊ธฐ์ ์ธ ping์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ํ„ฐ๋„์ด ์œ ํœด ์ƒํƒœ์ผ ๋•Œ ๋ผ์šฐํ„ฐ์˜ NAT ํ…Œ์ด๋ธ”์ด ์ง€์›Œ์ง€๊ณ  ์—ฐ๊ฒฐ์ด ๋Š์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•‘์ด ์‚ฌ๋ผ์ง€๋ฉด 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 over๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‰ฝ๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ์‚ฌ, ๋‚˜์—๊ฒŒ๋Š” ๊ฐ„๋‹จํ•˜๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ๊ฒƒ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค.

์ €๋Š” ์ด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ช‡ ์ฃผ ๋™์•ˆ ์—…๋ฌด์šฉ PC์— ์—ฐ๊ฒฐํ•ด ์™”์ง€๋งŒ ์•„๋ฌด๋Ÿฐ ๋ฌธ์ œ๋„ ๋ฐœ๊ฒฌํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ์„ค์ •ํ•˜๊ณ  ์žŠ์–ด๋ฒ„๋ฆฌ๋Š” ์ ์—์„œ ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์•„๋งˆ๋„ ๋‹น์‹ ์€ ์˜๊ฒฌ๊ณผ ์ œ์•ˆ์„ ๊ฐ€์ง€๊ณ  ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ธฐ๊บผ์ด ๋“ฃ๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€