Maayong oras sa adlaw!
Niini nga artikulo gusto nakong isulti kanimo kung giunsa nako pagpatuman (Bash script para sa pagkonektar sa duha ka kompyuter luyo sa NAT gamit ang teknolohiya sa UDP hole punching gamit ang OS isip ehemplo. Ubuntu/Debian.
Ang pag-establisar og koneksyon naglangkob sa daghang mga lakang:
- Pagsugod sa usa ka node ug paghulat alang sa hilit nga node nga andam;
- Pagtino sa external IP address ug UDP port;
- Pagbalhin sa usa ka eksternal nga IP address ug UDP port sa usa ka hilit nga host;
- Pag-angkon sa usa ka eksternal nga IP address ug UDP port gikan sa usa ka hilit nga host;
- Organisasyon sa usa ka IPIP tunnel;
- Pag-monitor sa koneksyon;
- Kung nawala ang koneksyon, kuhaa ang tunel sa IPIP.
Naghunahuna ko sa dugay nga panahon ug naghunahuna gihapon kung unsa ang magamit sa pagbayloay sa datos tali sa mga node, ang pinakasimple ug labing paspas alang kanako sa pagkakaron nagtrabaho pinaagi sa Yandex.disk.
- Una, kini dali gamiton - kinahanglan nimo ang 3 nga mga aksyon: paghimo, pagbasa, pagtangtang. Uban sa curl kini mao ang:
Paghimo:curl -s -X MKCOL --user "$usename:$password" https://webdav.yandex.ru/$folderBasaha:
curl -s --user "$usename:$password" -X PROPFIND -H "Depth: 1" https://webdav.yandex.ru/$folderPagtangtang:
curl -s -X DELETE --user "$usename:$password" https://webdav.yandex.ru/$folder - Ikaduha, sayon nga i-install:
apt install curl
Aron mahibal-an ang external IP address ug UDP port, gamita ang stun-client command:
stun stun.sipnet.ru -v -p $1 2>&1 | grep "MappedAddress"Pag-instalar nga adunay mando:
apt install stun-clientAron maorganisar ang usa ka tunel, gigamit ang standard nga mga himan sa OS gikan sa package nga iproute2. Anaa nga mahimong ipataas gamit ang standard nga paagi (L2TPv3, GRE, ug uban pa), apan gipili nako ang IPIP tungod kay nagmugna kini og gamay nga dugang nga load sa sistema. Gisulayan nako ang L2TPv3 sa UDP ug nasagmuyo, ang katulin nahulog 10 ka beses, apan kini mahimo nga lainlaing mga pagdili nga may kalabotan sa mga taghatag o uban pa. Tungod kay ang IPIP tunnel naglihok sa IP level, ang FOU tunnel gigamit sa pag-operate sa UDP port level. Aron maorganisar ang usa ka IPIP tunnel kinahanglan nimo:
— load ang FOU module:
modprobe fou— paminaw sa lokal nga pantalan:
ip fou add port $localport ipproto 4— paghimo ug tunel:
ip link add name fou$name type ipip remote $remoteip local $localip encap fou encap-sport $localport encap-dport $remoteport- ipataas ang interface sa tunnel:
ip link set up dev fou$name- Itudlo ang internal nga lokal ug internal nga hilit nga mga adres sa IP sa tunel:
ip addr add $intIP peer $peerip dev fou$namePagtangtang sa usa ka tunel:
ip link del dev fou$nameip fou del port $localportAng kahimtang sa tunnel gibantayan pinaagi sa matag karon nga pag-ping sa internal nga IP address sa hilit nga node tunnel nga adunay mando:
ping -c 1 $peerip -s 0Ang periodic ping gikinahanglan sa panguna aron mamentinar ang channel, kung dili, kung ang tunel wala’y mahimo, ang mga lamesa sa NAT sa mga router mahimong ma-clear ug unya ang koneksyon maputol.
Kung mawala ang ping, ang tunel sa IPIP matangtang ug maghulat alang sa pagkaandam gikan sa hilit nga host.
Ang script mismo:
#!/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 0Mga variable username, password и suksukanan sa papel kinahanglan nga parehas sa duha ka kilid, apan paglantaw - lahi, pananglitan: 10.0.0.1 ug 10.0.0.2. Ang oras sa mga node kinahanglan nga i-synchronize. Mahimo nimong ipadagan ang script sama niini:
nohup script.sh &Gusto nakong ipunting ang imong pagtagad sa kamatuoran nga ang IPIP tunnel dili luwas gikan sa punto sa panglantaw sa kamatuoran nga ang trapiko wala ma-encrypt, apan kini dali nga masulbad gamit ang IPsec sa ibabaw. , morag simple ug masabtan nako.
Gigamit nako kini nga script aron makonektar sa usa ka trabaho nga PC sa daghang mga semana karon ug wala’y namatikdan nga mga problema. Sayon sa mga termino sa pagpahimutang niini ug pagkalimot niini.
Basin naa moy mga komento ug sugyot, malipay ko sa pagpaminaw.
Спасибо за внимание!
Source: www.habr.com
