VPN սերվերի գործարկում պրովայդերային NAT-ի տակ.

Հոդված այն մասին, թե ինչպես ինձ հաջողվեց գործարկվել VPN սերվերը իրական NAT-ի միջոցով տնային մատույցին (սպիտակ IP հասցե չունենալով): Այդ իսկ պատճառով նշեմ, որ այս իրականացման արդյունավետությունը ուղղակի կախված է ձեր մատույցի կողմից օգտագործվող NAT տեսակից, ինչպես նաև ձևանմուշից.
Այսպիսով, անհրաժեշտություն առաջացավ միանալ իմ Android սմարթփոնից տնային համակարգիչս, երկու սարք بھی միացված էին ինտերնետին մատույցի NAT-ներով, իսկ համակարգիչը ևս միացված էր տնային ռոուտերի միջոցով, որը նույնպես NAT էր իրականացնում:
klasika схемայով, օգտագործելով վարձվում VPS/VDS սպիտակ IP -ով, ինչպես նաև վարձելով սպիտակ IP -ը մատույցից, մի քանի պատճառներով չէր դիտաբերվում:
Ընդ որում անցյալ հոդվածների փորձառության, մի քանի փորձեր կատարելով STUN-ների և մատույցի NAT-ների հետ: Որոշեցի փոքր փորձարկման վրա, կատարելով հրաման իմ տնային ռոուտերին, որը աշխատում է OpenWRT ծրագրաշարով:

$ stun stun.sipnet.ru

ստացա արդյունք:

STUN կլիենտի տարբերակ 0.97
Առաջինը: Անկախ քարտեզավորում, Անկախ ֆիլտր, պատահական порт, կլինի шпилька
Վերադարձման արժեքը 0x000002

Բառացի թարգմանություն:
Անկախ քարտեզավորում — независимое отображение
Անկախ ֆիլտր — независимый фильтр
պատվերով պորտ — случайный порт
կլինի шпилька — будет шпилька
Անալոգիկ հրաման կատարելով իմ PC–ում, ստացա:

STUN կլիենտի տարբերակ 0.97
Առաջինը: Անկախ քարտեզավորում, Պորտի կախված ֆիլտր, պատահական порт, կլինի шпилька
Վերադարձման արժեքը 0x000006

Պորտի կախված ֆիլտր — порт зависимый фильтр
Հրահանգների ցուցադրման արդյունքների տարբերությունը ցույց տվեց, որ տնային ռոուտերն ավելացնում էր «իր մասնակցությունը» Internet-ի շրջանառության գործընթացում, ինչը արտահայտվում էր այն որով, որ Computer-ում կատարելով հրահանգ:

stun stun.sipnet.ru -p 11111 -v

ստացա արդյունք:


MappedAddress = XX.1XX.1X4.2XX:4398

այդ պահին մի քանի վայրկյանով բացվեցին UDP-սեսիաներ, եթե այդ պահին ուղարկեցինք UDP-հրաժարագիր (օրինակ: netcat XX.1XX.1X4.2XX 4398 -u), ապա հրաժարագիրը գալիս էր տնային ռոուտերին, ինչը հաստատեց TCPDump որը մեկնարկված էր այնտեղ, բայց հրաժարագիրը չէր հասնում համակարգչին — IPtables որպես NAT-հրաազմակերպիչ ռոուտերի վրա կտրում էր այն:
VPN-server գործարկելը պրովայդերային NAT-ի տակ
Բայց ինքն փաստը, որ UDP հրաժարագիրն անցնում էր մատույցի NAT, հաջողության սպասում էր տ տալիս: Քանի որ ռոուտերը գտնվել ստացվում է իմ իրավասության տակ, խնդիրը լուծեցի UDP/11111 պորտը перенаправлением համակարգչին:

iptables -t nat -A PREROUTING -i eth1 -p udp -d 10.1XX.2XX.XXX --dport 11111 -j DNAT --to-destination 192.168.X.XXX

Այսպիսով ստեղծեցի UDP-սեսիա և ստացեցի բացառություններ Internet-ից ցանկացած IP հասցեից: Այդ պահին սկսեցի OpenVPN-server (նախապես կազմաձևելով) լսելով UDP/11111 պորտը, նշեցի սմարթֆոնում արտաքին IP հասցեն և պորտը (XX.1XX.1X4.2XX:4398) և հաջողությամբ միացա սմարթֆոնից համակարգիչն: Բայց այս իրականացման մեջ խնդիրը առաջացավ, անհրաժեշտ էր ինչ-որ կերպ պահել UDP-սեսիային OpenVPN-կլիենտը հանդիպելու պահի, STUN-կլիենտի միջանկյալ գործարանի կիրառումն ինձ դուր չէր գալիս՝ STUN-сервերները լցնելու համար:
Այսպես էլ նկատեցի գրառումը «կլինի шпилька — будет шпилька», այդ ռեժիմը

Hairpinning հնարավորություն է տալիս մեկ սարքի NAT-ի միջոցով կատարել արտաքին IP-հասցեով դիմագիծը մեկ այլ սարքի նկատմամբ նույն տեղական ցանցում:

VPN-server գործարկելը պրովայդերային NAT-ի տակ
Ինչպես պարզվեց, UDP-սեսիայի պահպանման խնդիրը ես լուծեցի պարզապես՝ այդ նույն մոնիտորին դարձնելով հաճախորդ:
Սա աշխատում էր այնպես.

  • գործարկելով STUN հաճախորդը տեղական 11111 պորտով.
  • ստանալով պատասխան արտաքին IP-հասցեով և պորտով XX.1XX.1X4.2XX:4398.
  • ուղարկելով տվյալները արտաքին IP-հասցեով և պորտով հղոմի (այլ ցանկացած ծառայություն է հնարավոր), որը կարգավորվել էր իմ սմարթֆոնում:
  • գործարկելով OpenVPN սերվերը մոնիտորում UDP/11111 պորտը լսելով:
  • գործարկելով OpenVPN հաճախորդը մոնիտորում, ցույց տալով XX.1XX.1X4.2XX:4398 միացման համար:
  • ինչքան էլ որպեսզի, ես ձեռնարկեցի OpenVPN հաճախորդը սմարթֆոնում, ցույց տալով IP-հասցեն և պորտը (իմ դեպքից IP-հասցեն մնացած չէր):

VPN-server գործարկելը պրովայդերային NAT-ի տակ
Այսպիսով, ես ստացա հնարավորություն կապվել իմ մոնիտորին սմարթֆոնից: Այս իրականացումը թույլ է տալիս կապել ցանկացած OpenVPN հաճախորդ:

Փորձ

Պահանջվում է.

# apt install openvpn stun-client sendemail

Ընդհանուր OpenVPN սերվերի իրականացում ստանալու համար, գրել եմ մի քանի սկրիպտներ, մի քանի կարգավորող ֆայլեր, պահանջվող սերտիֆիկատները (քանզի սմարթֆոնում աշխատող հաճախորդը աշխատում է միայն սերտիֆիկատների միջոցով):

Հիմնական սկրիպտը մոնիտորում.

# cat vpn11.sh
#!/bin/bash
until [[ -n "$iftosrv" ]]; do echo "$(date) Определяю сетевой интерфейс"; iftosrv=`ip route get 8.8.8.8 | head -n 1 | sed 's|.*dev ||' | awk '{print $1}'`; sleep 5; done
ABSOLUTE_FILENAME=`readlink -f "$0"`
DIR=`dirname "$ABSOLUTE_FILENAME"`
localport=11111
until [[ $a ]]; do
	address=`stun stun.sipnet.ru -v -p $localport 2>&1 | grep "MappedAddress" | sort | uniq | head -n 1 | sed 's/:/ /g' | awk '{print $3" "$4}'`
        ip=`echo "$address" | awk {'print $1'}`
        port=`echo "$address" | awk {'print $2'}`
	srv="openvpn --config $DIR/server.conf --port $localport --daemon"
	$srv
	echo "$(date) Сервер запущен с внешним адресом $ip:$port"
	$DIR/sendemail.sh "OpenVPN-Server" "$ip:$port"
	sleep 1
	openvpn --config $DIR/client.conf --remote $ip --port $port
	echo "$(date) Cоединение клиента с сервером разорвано"
	for i in `ps xa | grep "$srv" | grep -v grep | awk '{print $1}'`; do
		kill $i && echo "$(date) Завершен процесс сервера $i ($srv)"
		done
	echo "Жду 15 сек"
	sleep 15
	done

Տվյալների ուղարկման սկրիպտը:

# cat sendemail.sh 
#!/bin/bash
from="От кого"
pass="Пароль"
to="Кому"
theme="$1"
message="$2"
server="smtp.yandex.ru:587"
sendEmail -o tls=yes -f "$from" -t "$to" -s "$server" -xu "$from" -xp "$pass" -u "$theme" -m "$message"

Սերվերի կարգավորող ֆայլը:

# cat server.conf
proto udp
dev tun
ca      "/home/vpn11-srv/ca.crt"
cert    "/home/vpn11-srv/server.crt"
key     "/home/vpn11-srv/server.key"
dh      "/home/vpn11-srv/dh2048.pem"
server 10.2.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
tls-server
tls-auth "/home/vpn11-srv/ta.key" 0
tls-timeout 60
auth    SHA256
cipher  AES-256-CBC
client-to-client
keepalive 10 30
comp-lzo
max-clients 10
user nobody
group nogroup
persist-key
persist-tun
log /var/log/vpn11-server.log
verb 3
mute 20

Հաճախորդի կարգավորող ֆայլը:

# cat client.conf
client
dev tun
proto udp
ca      "/home/vpn11-srv/ca.crt"
cert    "/home/vpn11-srv/client1.crt"
key     "/home/vpn11-srv/client1.key"
tls-client
tls-auth "/home/vpn11-srv/ta.key" 1
auth SHA256
cipher AES-256-CBC
auth-nocache
comp-lzo
user nobody
group nogroup
persist-key
persist-tun
log /var/log/vpn11-client.log
verb 3
mute 20
ping 10
ping-exit 30

Սերտիֆիկատների գեներացումը կատարվել է. այս հոդվածի.
Սկրիպտի մեկնարկը:

# ./vpn11.sh

Անցնելով այն կատարման համար.

# chmod +x vpn11.sh

Սմարթֆոնի կողմում.

Ուսումնասիրելով ծրագիրը. OpenVPN для Android., փոխանցելով կարգավորող ֆայլը, սերտիֆիկատները և կարգավորելով այն, ստացվեց այն, ինչպես.
Սմարթֆոնում ստուգում եմ почту.VPN-server գործարկելը պրովայդերային NAT-ի տակ
Օգտագործում եմ պորտի համար կարգավորումները.VPN-server գործարկելը պրովայդերային NAT-ի տակ
Գործարկում եմ հաճախորդը և միանում:VPN-server գործարկելը պրովայդերային NAT-ի տակ

Հոդվածը գրում լինելով, ես տեղափոխեցի կարգավորումները մոնիտորից Raspberry Pi 3-ի վրա և փորձեցի գործարկել այս ամենը LTE մոդեմի վրա, բայց դա չեղավ: Կոմունիկացիաների արդյունքը:

# stun stun.ekiga.net -p 11111

STUN կլիենտի տարբերակ 0.97
Առաջինը: Անկախ քարտեզավորում, Պորտի կախված ֆիլտր, պատահական порт, կլինի шпилька
Վերադարձման արժեքը 0x000006

արժեքը: Port Dependent Filter թույլ չտվեց համակարգին մեկնարկել:
Բայց տնային պրովայդերը առանց խնդիրների թույլ էր տալիս համակարգին մեկնարկել Raspberry Pi 3-ի վրա:
Միավորված вэբ-կայքի հետ, сVLC для.
ՌՏՍՊ-հոսքի ստեղծման համար веб-կայքի վրա:

$ cvlc v4l2:///dev/video0:chroma=h264 :input-slave=alsa://hw:1,0 --sout '#transcode{vcodec=x264,venc=x264{preset=ultrafast,profile=baseline,level=31},vb=2048,fps=12,scale=1,acodec=mpga,ab=128,channels=2,samplerate=44100,scodec=none}:rtp{sdp=rtsp://10.2.0.1:8554/}' --no-sout-all --sout-keep

և VLC-ը смартфոնին համակցված (стриминг rtsp://10.2.0.1:8554/), ստացվեց բավականին լավ հեռահար տեսահսկման համակարգ, այնպես էլ կարելի է բարձրացնել Samba, ուղղել երթևեկությունը VPN-ի միջոցով, հեռակայորեն կառավարել համակարգիչն ու շատ ավելին…

Ամփոփում

Պրակտիկայի արդյունքում պարզվեց, որ VPN-server կազմակերպելու համար կարելի է обходиться без արտաքին IP-հասցեի, որի համար պետք է վճարել, ինչպես նաև վարձակալության համար VPS/VDS. Սակայն ամեն ինչ կախված է պրովայդերից։ Իհարկե ուզեցեք ավելի շատ տեղեկություններ տարբեր պրովայդերների ու օգտագործվող NAT-ների տեսակների մասին, բայց դա միայն սկիզբն է…
Շնորհակալություն ուշադրություն դնելու համար!

Ընտանիք: habr.com

Գնել հուսալի հյուրընկալում DDoS պաշտպանությամբ, VPS VDS սերվերներով 🔥 Գնել հուսալի հյուրընկալում DDoS պաշտպանությամբ, VPS VDS սերվերներով | ProHoster