Հոդված այն մասին, թե ինչպես ինձ հաջողվեց գործարկվել 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-հրաազմակերպիչ ռոուտերի վրա կտրում էր այն:

Բայց ինքն փաստը, որ 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-հասցեով դիմագիծը մեկ այլ սարքի նկատմամբ նույն տեղական ցանցում:

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

Այսպիսով, ես ստացա հնարավորություն կապվել իմ մոնիտորին սմարթֆոնից: Այս իրականացումը թույլ է տալիս կապել ցանկացած 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.confproto 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.confclient
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., փոխանցելով կարգավորող ֆայլը, սերտիֆիկատները և կարգավորելով այն, ստացվեց այն, ինչպես.
Սմարթֆոնում ստուգում եմ почту.
Օգտագործում եմ պորտի համար կարգավորումները.
Գործարկում եմ հաճախորդը և միանում:
Հոդվածը գրում լինելով, ես տեղափոխեցի կարգավորումները մոնիտորից Raspberry Pi 3-ի վրա և փորձեցի գործարկել այս ամենը LTE մոդեմի վրա, բայց դա չեղավ: Կոմունիկացիաների արդյունքը:
# stun stun.ekiga.net -p 11111STUN կլիենտի տարբերակ 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
